@agoric/inter-protocol 0.15.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -0
- package/bundles/bundle-auctioneer-js-meta.json +314 -314
- package/bundles/bundle-auctioneer.js +1 -1
- package/bundles/bundle-econCommitteeCharter-js-meta.json +208 -208
- package/bundles/bundle-econCommitteeCharter.js +1 -1
- package/bundles/bundle-feeDistributor-js-meta.json +189 -189
- package/bundles/bundle-feeDistributor.js +1 -1
- package/bundles/bundle-fluxAggregatorKit-js-meta.json +284 -284
- package/bundles/bundle-fluxAggregatorKit.js +1 -1
- package/bundles/bundle-psm-js-meta.json +302 -302
- package/bundles/bundle-psm.js +1 -1
- package/bundles/bundle-reserve-js-meta.json +293 -293
- package/bundles/bundle-reserve.js +1 -1
- package/bundles/bundle-scaledPriceAuthority-js-meta.json +220 -220
- package/bundles/bundle-scaledPriceAuthority.js +1 -1
- package/bundles/bundle-vaultFactory-js-meta.json +330 -326
- package/bundles/bundle-vaultFactory.js +1 -1
- package/package.json +16 -16
- package/scripts/init-core.js +2 -2
- package/scripts/start-local-chain.sh +1 -1
- package/src/auction/auctionBook.js +10 -2
- package/src/clientSupport.js +79 -7
- package/src/contractSupport.js +16 -45
- package/src/price/fluxAggregatorContract.js +1 -1
- package/src/price/fluxAggregatorKit.js +2 -15
- package/src/price/roundsManager.js +8 -0
- package/src/proposals/core-proposal.js +4 -4
- package/src/proposals/econ-behaviors.js +13 -12
- package/src/reserve/assetReserveKit.js +1 -7
- package/src/reserve/doc.md +4 -4
- package/src/vaultFactory/Liquidation.md +1 -1
- package/src/vaultFactory/liquidation.js +14 -24
- package/src/vaultFactory/params.js +8 -8
- package/src/vaultFactory/proceeds.js +274 -0
- package/src/vaultFactory/types.js +1 -10
- package/src/vaultFactory/vaultDirector.js +3 -42
- package/src/vaultFactory/vaultFactory.js +3 -3
- package/src/vaultFactory/vaultHolder.js +1 -9
- package/src/vaultFactory/vaultManager.js +177 -322
|
@@ -1 +1 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAABC1K92BO0AAATtAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTUuMCIsCiAgICAibW9kdWxlIjogIi4vc3JjL2ZlZURpc3RyaWJ1dG9yLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Fzc2VydC12MC42LjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYXNzZXJ0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Fzc2VydC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXNzZXJ0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWE2NDc1OTNlOWZjZGM3NTEwOTIxMGUyNjZiOGU3YTljMGU5OWQwMTM2ZjczYjk5MmExNWM0NmE5ZTg3ZDAxYzljZDZmMGEyZjhhZTVhODBjNGJiYjVlYjBjYWYzNWY0MmMwNDI4ZTljY2YyMjk4NTNkMzVjMGU5NGUyYjMyMzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTEyMWQxNWRjYjEwZjg1Zjc3YjQwZDQ4ZWU4N2Q1ZDVkNzZmOWQ0OTAyZTBlOGM3ZDg4YzMxN2MwYjJmZTNhMmIwZGVlZmZhNzg3NjI5NDExOGZkZjY1MWFlNGZhYzg3MzkxNzU2OTE3MjdkYzc0OTIzNGMxNDQ1Mjg1YTg0NWEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZXJ0cC12MC4xNi4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2VydHAiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hbW91bnRNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hbW91bnRNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDI1ZGE2MDA5NWJjYWIyYThmNmYzNWU0NGU4Y2EzZjJmMWRlM2JkZGJkNDJhYmEwZDgyZjU4ODAwNDYzOGRmYWE2YjI0MTc5NWY1OWYwY2Y2MTQ5ZGMyMmFmYzhiMmNlNTdmNTY2MDI4MDc2NjdiNDg3OWMyYzdhNGY1NWI2MmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGlzcGxheUluZm8uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Rpc3BsYXlJbmZvLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODdmZDM2YTY0MjkxZGJjM2IyYmQ5NDkzMzBkODM5Nzk2MzRjNjE1YzhiOTBkZWE0ZWQ2M2ZjNGVmYjc2ZjI2MjhiN2U3Mjc3OGFhM2U3NDcxNDU0MTg5YTgzMzViZTJmYjJmMjRkMTk4MWQ1NDA3YzFjNTI4ZWFiYzZhYmYwMmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzNhODE0Mzc4ZjQxZTFiOGU2YmM1NjdkM2JmZDRiNGE3OGU4N2U0N2JhN2Y1MTllOTU4MDIxZWE3ZjBhMTJhZTlhYzlmNzY2YjQ3MDUyOGQ0OTg4YTc2ODgxOGYwYmFiMWExNGFjMDE1MTkwZDU0MzFjOGU1NWMxZjMzYzVjY2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXNzdWVyS2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pc3N1ZXJLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZTg5MmJmMmE1MzhmMmQ1ZmI1ZDJmMGEyYTY2OWY5NGZhZjE2ZmVlNjdiNGRkMGFlMWMyMjNjOWZjNzZlOWJmMTZmZTc3Njk4NzZlZDYyOWJkMWVhYmQ0ZGQyMmJiZDdhN2M4ZjQ4NTVjNzcyMmEzZDU0ZjlmNzMxODc2ZGJmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTQ0ZDYwNTg1MWY1ZmJiMDg0NjUwOTA4MTJiMWM3OWVkZjUxMGRiYjcwNzI2NDgxMDNmZDQyZDI2ODgwZmU5ZmY5NmJiYWE5ODhjZmNiNGE5NGYyZGE0OWI5Njk3NjJkZGQwOTExNDgxZDU5MDhjMDhlMjA1MjNlNmY5ZmNjMjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlOGJlOGRjMzYxNGRiZTM1N2EzOGFlZjNlODc1YTFjZjQ3MzE0OGU0OWIzNzE4ZjgwZDg2NzVjZjNmN2FmN2QwNzIzOWExYTcwODRkZTZhN2Q2NjQxMjNjNjFiOTYyNTg5NmQzMzc5MTQxNGFiNGQwNTBiNmQ3NmUwZTgxYjM3NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImExMTM2MWM4ODNjZGI4MDJjOWUxOTRiY2FhMTViNTVlY2I5NDdmNDVhZDIyNDA0ZjNjOTljY2NjNDZmZGMwMDZkYjhiNmQxNmY5Zjg5M2RiZmZhM2EyMzhkZDA4YzA5MmI5OWI4OGQwMzM1ZGViNWQxYTQ0ZTdkN2Q1MjRkOTZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU5MmU2MDcxM2U4NTVkNjA0NDFmOGE0ODdhMTU4OWY3Y2U5OTViNzkyZDliOTc0NzFlMGMxOWY0ZTYyZmE2NTIyMjk5NGQwYzE5MmE5OGY5ODJkNDQwZDA2OTMzMzgyZmM0YzQ3YTYxNGRkNTNjNzI1NGE0YTYxN2Q4NjliZjMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY2NDhiZDQ2ZGY5OWNkODBhMGYwMTIxZmRkNDhiYjg3ZWQ5NjI2OTM2MDhmYjFhM2E0YTZjMDk0YjU3MjlhMGQ5NmY0MGYwZjIxYmQ3NDYxNmU5MmE0MWZjN2NjNWUxMTVlMjcxZGIxZGY3N2E2NGI0Y2EyNTFiMjQ5YjVkMWRiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZmQ3Zjk5YjhiZWNhNjkzMmY3YzM3YjZhNTQyOGYxNTdkMTRiMzY3M2Y1YjE4OTUzY2RiMzg1NzlhOGNkNDYxMTk5NzU5N2RiMjMzYTNjMGRhNGIwMmFlMmFhMDJiNDdiZTkzMzdkM2YzYmM5MjI4NGFhNmRlZThmNjE2OTViNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50TGVkZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50TGVkZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjkyYzRiNTM2NjkwOWFlMWEyZWYyOTgxYjZmYjAzOTI3NzIwZGJiZDFhMzJlMTAzN2EwYmNmZWE0OWIzMDkyODUxMTFmMTBkYjEyMDFiMDhmZDNhYjc1ZjkwMzRkODk5YzhmYWNhZGMwN2YwZjVhNDc2NmRiZTEzODE0MGZiYTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVyc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1cnNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2Q3ZGRhNmE4NDE4MGM2OGU2ZDA5NzJhNjhkYzhkZWJiNTE1YjkyY2U4MGMyMTg4MTZlNTMxZjI0ZGE2NDhmNTU1ZjZmNmMyZGJiODIwMGU5NDM1OWFkNjFjMDQ2MDI2OWE0ZDRjMDY1YTkwNWRhOTRlMDU3ZDNhZjU2MjVlMjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTExYjJhNmYyOWFkNDk2YmJhZDBjNTk4ODJkZGM0OTBmM2ViZWM5NjA2YjUxZTBiNzBiZTU1ODUxMTJkMzJlNDllZGFiOGVjN2FhNTdmZjJiZDdlNDYzZjU4N2ZlNjRjMDZhYzhkNWM4NjEwMjFkYjc1ZGMwMzhjM2U0NGU1NTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU4ZTZiMjA1Yzk5MGQyNzAzZTZhMTg0YzFhM2RmMDFlOGY0ZWVhOTkyN2JlYjEyMDIxYWI2ZDBlMTgzNTA4NzU1OTZmNTgyOGI0MGUzNzRiNTFmNWNmN2VlNjI1OTFkYmQyNWMxYjQ2OWI3ZDU4YzkxMTU4ODhhM2VhNWNkNDAyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWFtYmllbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MDIxZjU0YjlhZmMwMjVjYTBlOTBkMmRjMmUwYmVkMmZiMDhiMDYzYzZkNjhhNDRiMWVjMmViNzgzOTA3Njk2YzJlNGIzY2Q4MDU2MDUxZGMxMzE4ZDZiNDVhYzU3MzEyYWY3ZjNmOWQ4NDQyYjJiZWY0MDI3NmFjZjYyNDRjMSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTUuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE1LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cC9zcmMvbGVnYWN5LXBheW1lbnQtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xlZ2FjeS1wYXltZW50LWhlbHBlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9nb3Zlcm5hbmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE1LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zdWJzY3JpYmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4zLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdHMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXRzLXYwLjE0LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy96b2VTZXJ2aWNlL3pvZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12My4xLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgImFnb3JpYyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhZ29yaWMtdjAuMjAuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWluLmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ZlZURpc3RyaWJ1dG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mZWVEaXN0cmlidXRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0NGYyZjc3NzRjYjg0MDEyMjY3N2NiNWJmNTYwOGE3NjkwMDc0ODFiNzk3ZTc0YmJhNmNhZmI1NGU4NGVjOWNiOTc4ZjIwNmNkNzQzNjRjMWYyNTAzMDBlNTFmOGYyOTk5M2E5NDE0ZjA5NDlhZTFhYmYzODE1MmZkMzkwNjFiIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVybmFsLXYwLjMuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9pbnRlcm5hbCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kdXJhYmxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9oZWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2hlYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL3ZpcnR1YWwuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdmlydHVhbC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdHJlYW0iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RyZWFtLXYwLjMuMjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0cmVhbS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RyZWFtLXYwLjMuMjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJhbnlsb2dnZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYW55bG9nZ2VyLXYwLjIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2FueWxvZ2dlci5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2FsbGJhY2suanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NhbGxiYWNrLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTBmYzA5MjA3N2ViOWQxNGNhZjVmZDQ1MzFiODA0NDcyN2JkYWE2NTU0YzRkMmZjYThmNzZmOWIyZGJhMmRkNGJhMzkwOWM1MTczOWY0MGZiOTAyOTg5ZmRjYTBiNWRlNjUyZDk2YmQyZjhiNzdjZTUwNThhOGQwMjViOGVjOGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29uZmlnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb25maWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YTMxOGUxMzc5YmU3YTg4NzJkZDhkYTllN2ZhYTBkNzkyMDViNWM4OTljNTQxMGZiOTBhNGJjODk1Yjc1ODU1Y2M3MmE3YTlmZGUzNWRhMGEwNzVkMDZjYTc3YTVmMDBkYzhiNmJiNDAwOWNlM2YxOTQzZDliZGNjY2JiY2Q1MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVidWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMDAxZWFjYTRiM2IyNDQ3OTZhZjcxYWQ0OTkxZWIwOWY5MDBkYThhZDQ2ODA0YzIyYjA4MWE4NjE5NGU0NjFiMTUxMjQ1NWVmMjNhNWZhYjEyZTM3ZmQ2MzlmNTA3ZjE5MjU2YjhjZTEwNTNmZGNkODcwOWUyMmFmZjYzYWFmMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YTEyZTNiODc5ZmIzOTQ1NDM4ZDgyNzEzYTk1YmQ3NzEyOTc0OGQ3MGY5NjFkMTVlZWRjYjJhNGM0NThmY2ZiYmI5YzcwOWU1MDFjZTc3ZWIzMzUyYjZjODdiM2JjYzcxYjA2NWFlYmVlNzAyMWI4NjQ2NDE0NGY2ODExNGJlYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODY3M2UzOWIwZWRlNTI3MjhiOWYyNTUxNTAyMmJiOWRjYjkwY2QyM2VjMDUyM2I3YjA5MjkxOTNiYTkxYzE2ZjEyMzcxZmRhZmEyNjYwMDkzYjAwZTNjOGY1ZjhiMTRkYjM4ZTJlMjU1MjUyZmUxMjc0MGMwM2JjMjU0MmU2ZmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWV0aG9kLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXRob2QtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MzY0Mzc5YWNlMjY1MmQ5MGJlZjRhY2QwOTNkOWUxYWIyM2I1MDE3NmQ5ZWQ3MDVhZGJiZmY4YTAyNTgyYTljYzgxNWExOTk1M2RlN2Y2YjZmYWZhODJiMzY0OTY2Y2ZlNDhlNTI4YWEwZjU0NGE4ZmI4ZTU0NzFkMDQ4ZjM5MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDA0N2IwZDk1ZjU5ZWUzYjZmMTA0MTc4Y2Y3M2ZjYjZjYzdiNTJiYzUzMTIxYTE4ODMxNTVkMTRmY2MzNjdjNTA1YTk2YjgyODNjN2ZiYTE3MDJkYzNmMmNmM2IzZTc4YzY1MjUwMmQ3OWFlM2Y0NjU2ODZjMmM5MjhiZWVkNjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3VwZ3JhZGUtYXBpLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjAxZWIzM2Q3MjRlMTdmMGEwYmI0Zjc3YWYxNzMzMmFlNWU2YjljOGFlZjg4NzJlMmEzZGYxYWJlZWQyMDU4NDgyMjE5MmUxNmQ5YzQ3YmQwOGY3ZmRjMmQxNTUwNzZkYzM1YWMwNDgzMDYwOTE0ZmU2YTA4MDJhYWM0ZWQ0YzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3V0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2IxMTRiYmUzYTQ5YjM5ZDhmNWQ0NmZiNjA1NWUzOWMxYWQwMTI5OGI3NGRiODRjMzlmZDE5MDBlY2M0OTVlOTU2OGIwYTQ5MDg2ODQ2MDVhYjBmZDlmODJiOTQ3ZTdmMzE0MWE4Njk5NWI0NmU2ZTI5ZmIzNTA4ODAyNDQxYmIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbm90aWZpZXItdjAuNi4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL25vdGlmaWVyIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy91cGdyYWRlLWFwaS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3N1YnNjcmliZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nLXN0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmctc3RvcmUtdjAuOS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvc3dpbmdTdG9yZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgwOWNiZWVjYjJiZGExN2Q1ZjVkZTVkNzg0NmIwMmU1YTIzZDdmNTRiOTAzZDQ4YTEwNGViMjYzZmNmMzUyOTlhY2VhNGEzZWIxZDU3Yzc1MGJkM2Y0ZmZhZjkyYmE5MjA3MGM1ZmJhNTI2ZmJkNDExNWIwYTk5ZDVkMGRlYTQ4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1Y2NhNGNjNjQ1Y2VlMTRlMTJhNDVmNjg4YTI3NTBmMjNjMmI4MTE0MDliZTdmMzY5ZmYwN2YxN2I5ZGEwMjM2NGE4ZTczZTBjMThhZDM0MzFjN2UwYzFhZTA5Zjk5ZGM4NDdkYjMyNWFmYmEwNjJiNjVlYTZlZGEwMjJhZTI1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZmNTY2YzZmMjAwN2YzZjc5MTMyNjE2MWNiZDIwNDE5NmI0NTkxZWVmMDk1Mjk2NDJhZjg0ZGYwYTNkYmQ3ZjczYzBmZDRlYjE2NmZhNGI3ZDk2NDRmN2VmMWQ2NzhmNzljZTkyN2VmNDU2Y2E3MDExNTdmMmExNTIyNjczYzMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFlNTJmODhlYTU0M2MxYTkyMmQxZjcxM2Y5NDcwMTQ4NzM0ZTkxMDg4YWQ1YjBmZWZhNmYxYmYyYTMxYjg3ZTQzYjUzMzk4NDQ5MDJhZTJkMWRiMjU0MmI2Yjc4MDk2ZmI2OTZlZmE0NjQ2ZGMwY2YxMDNkMjgwZGJjOWI1YWUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlZC1ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVkLW5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTUxYzVlYWJjZTE3YjM3YTc0OGExYTUwMjA4NmFlYTBkNWE0MGY0M2FkODExYzM3YjczMGQwMDRjMDZjMDdhMzFhYzdkNTg3Yzk5NmI3Nzk1YjY2MjdlMTM5NDU2YjNlMGQ2YWMyYjUwMzc1NDQwOTM4NmIzNmMxNjliNTM0YzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlc3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2M1NDA5Yjc1M2RlNjdjODU5NzkzNWZmZjQwYmJhZjRiNmI0NzgwNmZlZGI3ZWZkNWE0OWM4ZjJiZjA5YTllZjNhMTVjMWU3NjM3ZDFiM2VmNTI4Yzg5ZGQxMDA2ZDczZmViOGNkMTU1MmQyMTAxNTc2ZjkyMmNkZmEzN2JhMTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxZmY4Nzk0NmQzMTViM2E3NmVjMDcxZWYzZmY0ODEzYWJmODNmNzE0NDUxMjRkODI4OGEzMGZlZGVjMzE2NzBjNjZkY2UwZjUzYTY3OTA1YWMzZDQ3OWE4YjIwNzkxZDhiNjlhYzkyMjEyMjEyZmM1ODUwODNiNDVhOGUwMWNkNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTYxOGZjNmY1ZTcxZTVlMWI3ZjA2NDUxOWU4YzVlNzk2NTBjNmRkZjU2MjkyN2EyNmEyZWY3NDVmNTRhNTYxZTczMzdhNTM2OTA2YzQwMWZmMjZhMjI2ZGJlMDA0NmFiM2Q2YTdmNjJkNjkzNTg4NTY1NDdiMWM3NWZjM2E0MmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdG9waWMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RvcGljLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTdhMGUwNGE0YWVmMzIyNTZkMjE4Yjg0YjI1MmRmODIxZDAyNWI5MGJhMWUzNzQ1NTdlNjM1OWJlYzBlMzIxNTAzODAzOGFmOWZkZjA2MTAxMTBiNzU4ODllODE0ZjdmYzBlNWMwODJkNTc4ZjQyNDMzMWUyNDYxZmU2Zjc3NDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtYW1iaWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZlMTdiOWRiNjczYzRhMTNmM2U3ZWY5YTBjYmNlZjE3OTI3ZjE2ZTE5M2M0MzgwOWM4YzZiYmFmNGI1NWU2ZDkwMTYwZDMyMmZjNzU5ZTk2NTA0NDVlOTM3NzIzYjE0ZWFkYTI5ZGI2MTczZDJiZGQ1YWZiOWEzNWMzOWY0NjNlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3N0b3JlLXYwLjkuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9zdG9yZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saWIvZXNtL2F2YS1mYXN0LWNoZWNrLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYWE0NjBiYmE3NjQ0NDNkNWNhZmIzM2Y1MjI3OTNiYmUyOWU4ZDI0ZjJjNWU3N2M3YjZhMWVjMDQxNTBhZjgwMGM3YmYxYzA1ZmU1MDQ1MGRmZDI5OGNjZDkyYTc5ODYwMWIxYjQ4YTJmYzQ0YTlmOWJkYmI2OGUwOTBjZWEyNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMTU4M2Y2NDc2YjIwN2I4MmExOTQ1NDY3MWY0OTZlZDEyNzBjN2RhZDExMjAxODIxMmZkOWExYTU5MjJiNTkxZmU1YTVhNGUyYWZkZWIzYjUxOTdmZTQwODIwZDk4MmY5YTlhMDVmNDQyMzBhNWUzZjVhOTVkYjAyMTQ2OThhMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2E2NGZhYjlhZGFhNTUxODE4OGI4M2I2ZTRiZTIxMGJjZDk1NzBiODgxZTdhYWJkNjc5Y2I5N2RhZjc3YWM4ZjkzNzBhNDE0MDE4ODBkOGU5MjMwODNkZGRhMzBiNzViZmM0NDNmNmQxMTA5NDZhNWI3MTkyZDQxMDY3NTc0NDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWNjOWJiNmZhZjJjMjhjMTI2NDc5ZDQ3MWQ1MDdlODZlMGEyMGY3ODliMGNmOTM1YzJmMzQ0YmRkN2UxODAwN2Y5YmNjNjM1YjdlMTIzMjQ1Y2NhYTRlNWRjZDM5YWQyZjIwMjBmYzY0NDliM2JhM2U5ZGQwZGQxY2FlOWZiZjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMThkMDJiNGVjZmRhOTMxMTdjZTlhZTNmNTdjYWE3N2ViMmJhZmUzYTczZmQwZjY4MTJmNmVhZDJmMjU4ZGU3ZGY1MDMwODE5ZTc5ODE3OWUwYzVjZmJkMDFjYjEwNDkxNzIxZjk1MWE3ZTJhZWYwM2I2ZmIyYTg4MzM4Zjk3ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYzOTlhYWY2NjU1OThkNGFmZGM3Y2FhOWU1NjRiZWE4M2FjMzgxZjM5MDU3MDc4YjNkYTZhMTJmZmVhZTFkNTUxY2Y3YzJjZmExMWMzNjliNzFjNzY4Y2E5N2ZlMDY5ODQ2Y2UxOGI5YjcxODc2ZDdmMDVjMGJhNzUwMTdlYWNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZDRhOTNjYmJkNzRhMTFhYzU1MzU0ZmFkYzRmZTQyMWQ3YWQ5YTQzMzgwYmJjMTRlYmVjOGEyZDI5NWYyYjBkMDlmZDQyZmVjMWY1MzlmZmVjYjE5MWQ5YWU5OTRkNzg0ZjFhOTAxYTNmMzIxZTM5OTQ0ZWVhMThiZTU3ZmY1ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU5YTBlZGZkNTEyMTczOGMzZTVlNDk3YmQ5N2Q2M2JhN2Y0ZTY2MGFlNDQ3NDY2OWY2N2Y1ZTk1OGNhNGY3YTA4ZDQxMWExNzkwZDg4NjQ4OTBlN2NhNTI1OThlMTQ3NmUzOGQ3MzcwMWI0OGM5MDZmODIzMjRlYzdlNGY4MjIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZmUxNmE2ZDgxMjhiNTBhMjhiMzljZGY5NmE4N2QxYjIxMmE2YmJmMDZmNzUyMDJmNjhkNWU1YThjMDkyYjBhMmZmNWZjNGNmODYyMzlkMTQ0ZGUxNDQ0NWRmZTllOGQ1NjA2OGQ5Y2Q2ZGU1MGM1ZDc3YjMxZTQ5OTU3ZDNjNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMDgxZDg0NDY5ODQyYTU2NzI5YTU1ZWViNTQxMmM3ZjJmZmM1Y2I2MmUzN2YwZDMzNWM1MTM2ZWE4ZDc5Yjg3OTgyNjAwMGRhNGViYzBiY2Y3YjdiNTM3YTc3NDgyYTFlNTA0OWYwNTU3ZTQ2NDEwOGNmZDc1MzFhYTZhNDQ0MyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy90aW1lLXYwLjMuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy90aW1lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdGltZS12MC4zLjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy90aW1lLXYwLjMuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1ZGZkNGVhYjcyYTZjOGE4N2ViNzg2M2U3ZDE2ZmRhMTA3OGQwODhlNDhlZDU1MmJiZTdjYWJjNWNlZDk4Yzk2NWI4MjBkZjQ3ODcyODU5NzQ1YWY3MzQ4NGQxZDhiMjE1MzVjNmZmMWZjNGI1ZTc1NGU2NjEwZDNkMWYzNzQ2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RpbWVNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90aW1lTWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZiMjFjOGY5OTNhODk3ZjQ3OWU4ODJlMzU0MDgwNGI5OGU5MTJkMzY5YTg2N2NjOTA0NzM2NzgwOTI3MWRjMTc5MTJjMWE4ZDc2NjRiMWE5ODM2MzcwYzY3ZTdiZmE0YTU5ZWY0YWYwMTk2N2Y1MzA0M2U5NDVkYTU5ZDlhMWQwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNzIyNDE3M2I2ZDUxZmQyOWU5OGQzZWVmY2NiOTQwNTI0NzEzNTg3YWI4ODQyNTI5OGE5MmEwYzRiMWFmNzA1ZWJhNGZhMTkyOWEzYzdmMGIxNGQ4ZjZjM2ExMzg3ZTg3ZjI2MmVmMjk5MzY4OTk5NjFkMzU4NjQ1ZjFkOGZhOCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy92YXQtZGF0YS12MC41LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdmF0LWRhdGEiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGYyOWMwZmQ3ODEwYzM3YzljY2Y0MDg2N2EwMTk5NWU1NmJjNzM4MmY0Njk1NjliNDhhNTk1ZWU2NTc2N2RlN2M3NDBhYjdhZTllMzMwZTA5NGM0MzVhYWRiODI4OGUwYTVmMDhjOTZkZjQ2ZmRjN2QzNjlmMjAyNTQ5YWUwMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDA3YzUzY2VhMmRlNzE1ZTE5NmM2YmZjNzMzM2VhZmU4ZGFlN2Y4YjcyZjY3NTM1MjMzOTFlYzhkNTc2NzYzMjU5NjEwNjk2NTFjMzczYzM2NGUyNjNjZmYyYjE1MDI0MGYwM2ZkMjBkNmQwMzhkNjc1ZThmYWRmOWJkYWZlYjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzZlMWM4ZWE4Y2FhZGZlOTA0NDNkZDVmM2UwYzczZTJmZGNjODkxNDQ4MGQ5MTJhM2ZlMWVjOWJkZjYwYWJjNjRjNjM0ZmFhZjhmMzNlMGRhNzk3NzZlZTEzZTkzM2RkOWZhOTRmMzc1Y2RkZTBhZDc5OWE1ZjgwYmNmMjNkOGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvem9lLXYwLjI2LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvem9lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvem9lLXYwLjI2LjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy96b2UtdjAuMjYuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy96b2VTZXJ2aWNlL3pvZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9jYWNoZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vY2FjaGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12My4xLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDljYmY2NGYxZjA5ZWVlODIyNTY2MGI3ODMzNzY3ZTg3NTk2ZGRiMjExZGQxN2I5ZmU5MmQ3YWEwZjcwYTMyZmU0NGNiODljNzJhM2ZjNTkwYTMxYWFiNGI3MjZlNmI0YmE2NTZjMWI3ZDIzNWY0MmZjZTkwOTAwNzI4MGFhNTciCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvem9uZS12MC4yLjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvem9uZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvbmUtdjAuMi4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9uZS12MC4yLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2hlYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvdmlydHVhbC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi92aXJ0dWFsLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YmUwMDFiZDZjZDI2MzVlNmFmZmU1N2M0Yjk3MzA1ODUyOGUzM2Q1ZjljMGNmYjI1YWI0Mzg0MzQ2ODYwNDQ3OTM3N2YzNmYyZGE2ZDE2NDc5Y2IxN2QzZjFjMjc4OTBjZGVjMTUzNGY1YWVhOTcyNzJlOWMyY2E5NzFhZDIwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NmZjYTA2ZWFmOWE0MjY0OTQ4YWM0MjNiYTBmYWY5OGFjYmY1NDU0MDIyNzM3OTYzNDhkZDQ3ZTNjMDJkYzQwNTc2NWViYTA3NTE5Mjc1Zjg5NDY1OTExM2JmYTE4ZTAzOWIwMTQzZTdmNDViZTM5MjI0MTIxODJlOGYzOTg1YiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNTM2ODQ4MjZjYjU2NjA5ZjYyYjdkNmI0ZGUzM2RhZDIyYzIwYWRhYTJlYjM4ODAwYzM2NGNlYzUwOTczODNlOTczZjA1OGIzMzVkNGU0YzQ4MDMwZTQyOGY3Yjk4ZGRhMmJmMjI4OGRiYTMwMDhhY2I1N2I0YWU3MjIwNjRjYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uby1zaGltLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uby1zaGltLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmUyODIwMmNlYjIzZTA2NGQ1ZGNjYmUwMjFhZTdkMWE1ZmRjY2MwMjM0MjcwZGM1NjI0ZmQ5MWRmMjM2ZjkwN2RjYzVkMjU0MzI2ZDFjZDMyYWM1MTE3NjAyZDJmYTIzOWU2ZjMyMDMzMjgyZmQ2N2UyNGYxYTdhNGRlOTU2MzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhY2stdHVybnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYWNrLXR1cm5zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDc5ZDNhMjllYjdiZjNiYThhMzlmMmY4YWVmODUwYThhOWNmZTEwZjk1NzIzZDI3MWQ0NGUyMTIyYTJlOGQyZGU0OTQyNmMxYzRkNDhjYTU5YzhiYTZmZjBkZjkyOTk1NTI4ZDM0OWVlZmUxZDBkNTAzYmRmYTgxZjg0ZmVlNmUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V4by12MC4yLjIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V4byIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9leG8tdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2IxOWMwZDc0Y2M1MDg4MjdiMGM5OGMzNDViZDU3NzU1MGU1ZWEyMTBhOTUxNTM3MDgyZDM5MDZkYmRiN2IwZjI4M2FjNzZiNzUxNDhmMjRkYzhmMjcyM2IyYjU0ODc2ODg4MGJlYmNiY2NiZjgyMGQwNjVhYzAxNWUzMTJmYzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLW1ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLW1ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFiNmRmMTdjZWM3MDYyMzdiODZlZmJlMGYzYTNiOWVjOGZlNTE2YzVlMDUxNjA3YjgxOWFlY2IyZTYwZDMyNzUzMDMzNWNlOTFmYWI3NzhmZjFmNTE0NWYwZGM3ODNjOGU2Mjc3YmU2NmVlODdiNmU2YjUwMDRhZTVmOGZjZmI1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODY2YmRjM2ViMzVlMGJkMTk4NzIzZDRhNTY5MDI0NjgyNmY0ZjBkNjhjMGQ3YzU0OGY0OTM4YWQzYzk1YjRjYmY4YjkxODMyNmE4NGJiMDBiNGIwNDgzZDc4NTQ2ZjY3NjBmYjM0YjZlNDc1ZWQyZWVjODA5Njg1MzJiNmRmM2IiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Zhci12MC4yLjE4IjogewogICAgICAibmFtZSI6ICJAZW5kby9mYXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjg3NDk3ZTNiZjY4YzUyNzlmMzZkNDBlMjhlNGE3NDM5NzE1ODQwMzFmNjQwZWU0OTcyZDkyNTVhMjllOTFiYWQxOGZkNDY5OWM0YmRjYjNiMzY4MmMxOTY1ZDc2YzI5OWQ0N2ZiNTgyZDI2MjhiZmZjNGZjYjdjMGYzZDZmMWMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjAuOC41IjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmVjMmY3NmJmZWUzN2Y0NGE4ZDNhZjI3YjI3ODY2YTdkMzNmNzg2OWVhODcyODVlNGZjZmYxYzNkMDc2NGMxYmMzYTVkYzE3NTMxYzcxZDMzZTFlYzY0Yjc1OTYwY2JhZjdmZWVlMDRiN2Q1Y2YzMDViYjgwNGQzMDVhNzgwYTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MzVhNjk2MmQ3MmQ5ZDI0MDUxYjk3NDk5MzIzMjcxOWVmNmQ5NjQ4YmFlZjM4MzIyYTYzNTg3MDExOGQ2ODJhM2M5NjYyYjEwMjA1NzVlMzhhYmFkMDZjZDU0M2NjMjFmZjEyZGVlNTFmYWEyNDdhNjM0OTZhN2Q3NzI4YzI3MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YTAyZWMxYjFiMTNlYzhlMWU3YmQ3NWZmMDdhMDNkZWVlNTE4OGZjZDYyMDFlNGI1YTBjYzRmYTRiNjE1NTNlZDBlMmI4MjRiOTEzMmM1ZWQ5ZmQ3MDkwMGJhYjE2ZmQzYzE0YTQ3MWIwMDNjMjVjZTI2MWFmNDIwMzMxYWU0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlhOGRkMmEyZmY4YWIwNWQ4MTI1ODk3ZjE3MmFhMGE5ZmE0Mjk2ZGFmODI5ZjQ2ODI2N2I1OTNkNDVhODZjMGU0Nzg4MjRkZDBhYmY1NWRmMThkODBmMTc5MDMyNjQ4NmE1M2M1MDBjZmQ3NTk3ZmQ3YmIzZmZjNTgwZjU0N2Y5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiMjMzYTVjNTYyMjIxMjRhYWI1ZGU0OWUyMWY3NmQ2N2I2ZTNjZjFkZTBmMjQ1ZjIxYjg2YmZiNDM2YzAyMGY1MGMwY2M1OTBhOTZhMGRiYWE5M2U2ZDM5NDM5NTU4MWZlNzY5MTQ5MDAzNDc1NDc1ODgyZTIyM2E2NzAzNDVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJiODJkNTk1ZDJhZmQ1ZDljMDJjNWNiZTAyZTdmN2M5NjA4N2M2MGNkMDkwOTFiOTk3ODJiZDhhN2MxMjZiMjM5MjYyZTk4ZDBmNDYwYTQ4OTgxYjVjZjM1MTFiN2I3OGNkMGYwMDFiMmZhMGU1ZTkzODE0MzVkYTE2ZGIxNjdjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZkNjMyZDY0Zjc2MzlkYjI3OTAwNzZmN2Y1OTMxYjQ1Y2NlMmQ4NDM4N2NkYTJjNzhjOTFhNDIyOWY4MTYzNDQxNzZiYjQ3MDA4ZTE5NzcwNGY2YjdkYWFmZDI3NDNkZWI0NWFkMDZjNWJjNmI4OGMwMzhkZjBlNmRmYmEyN2YzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMjYxNDcwNzE0ZDY1ZDMzY2U2YzhkZmQ5ZGI0Y2NiZmNhNGJjODhiMzE5OTliZjAxOTdiOTViZDAyNzNmY2FlYzM5YzRlODY2NjlmOTc3MGJhNzEyYjBiNWI2Y2QyMzIzZDViYzRiYTJmNTBjN2JlMWQ1NzM3ZmU5YTQ3ZjYwMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVmMDg2YTYwY2QwZjM5ZDcyNjBiODdmOWJhMjAwMDcyYjE5ZmFjYzc0YmNjMGE2Mjc2Y2QwYjEwZmEzOWQ5MWM5ZmU3ZTM3OThjNzgwMDhhMGZhMWIyN2NlYzQ1NjIzZTVhMmFhZTgxYzU0NTYwMzBkZDE0NzViODk1MWYxMmI0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4YTg1MWJkYmYyZjRkZDA5YTEzYjUyMTEzMGUyOTlmOWQxOTU1YWUxOTI5MTYyN2NkMjhkZjRmYjVkNDg3OGVjZGY3Y2UyYjIyYTU2NzBiNDM5N2JmNDkwYjgwZDg5ODI0ODFkYjVjZWIyMjRiMTBhZmRlZmU1YzQ0NTA2MjY1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjQuMS4yNyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MjUwODJmNGM4Y2E2YWE3ZWNmYWI5MGFjMTE2NWFmZDU4YzcwMGMwNWZiNDZjMzgwYThlYTQyN2QwY2I3YzAyYWRiMTMzNjM1MGI3MzQ0ZjY5MjU2MWMyYTk4ZmEyN2ZkZGQxOTRjM2E2MTM1NWZmZDgyYjRmNzM3ZWJhOTQ5OSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Bhc3Mtc3R5bGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGliL2VzbS9hdmEtZmFzdC1jaGVjay5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzZiNzMyMDNiM2FjMWU3NjAxMDg3MmYxNjY0NTdkNTU1MzI4ZjQ1OWNmNTBhNTcyZmZhMDEwNDFlYzA5MzNhN2Y1NzkxNzBhY2UwYjZlNzZhZjc5MmUxMmJiYmUxYWY1NWJkNmQyYzY4YzRlZjExYjQwZGRhOTRlZmRjNjFiNzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5QXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMzhiYjYwZjc4NTRiNGE3YjYxYTFmZDMzYjI0YTdlOWQwNThkYTc5MGU2ZjBhMjk2NDQzZjcwOWYyMDZmZWY3MzE1MGI3ZTJkZWQ3OTljNjM5YjU4ODQ4ZGM0NWE0ZjNmY2FhOTlhMGYxZTcyNWEyYWQ5YTQzZGNlNjkwODM5MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTRiODEyNWQwOWQ3M2IwMjVjODM5ZjYyNTFkY2MwNmE1M2RjZDI1YWU5MThjOTczZTM2MDE2MTE2MzA4YTQ4YzE4MzBhZDMzODczZDliOGVlZTA2YWQ1MGI4MjlkNDUwMzZlOGM0ODYwMzYzOWUyYTU0ODJlZTJiYTljZGQzMGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzRlNjI3MjdjY2E4Y2YzYzJiNWEzYTc4YTViMjc5ZjM2NzkzYTM4ZDM2NzE4MTUyYWNhNWIxZTE4NjY2NWIzMDYzOGRkMTI0YTFiYjhjYzk0NGMxMTFhNzEyNjg2YjQ0ZDBmN2NhYWI0ZjJmNWYwMjczYTA0ZjQyNzZmMjczOGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NzZlYmYzNGU3M2QwNTAzOTM3NDdlOWVhZjM1ZDk3MDdhMTkwNWQ0Y2MxYzUxMGE0ZjE5ZTE1ZmMzNTBlY2IxZGI0OWIyZjUxZjg0ZmFhZWNiOWI2N2FmNTQ4YWNjMmU1MTJmYWIyZmExNjEwYjM2OGRkMWExNzllYTBmMzM0ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOGVlZGEzNmRlZGNhYmNlZmZhOWYyNmU2MzUyNWU2ODg3MWEzMmNiZWRjZDdjMWFkNmI2ZDU5NDM2NmIyNzI0OGMxZDQzNmUxZjlkY2YzYjA5NzEwN2UzODAxZDIyOTgxNDQ1YzhjMzMyY2JkMDUzMDA3NTk5ZGU1MzJiYWYxMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmQwZTRiYzZlNDdlM2Y2NDc5NDZlMWE0YjlhMGNlYTY0N2MzNTMwN2U5NTUzZTU4ZjNjMTMyMTYxODM2YjlkM2I4YzdlNzAxYjNlNjg2MDcxYjYwMWY0YjBiODAyMzMyNmY5YmE0ODdhZWM4MDI1MmM5NWNhYWQ4ZmQ5OTYxNDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDk1YWVkODc0YjQ5NTc2NDhmMGU1NWM4Yzc1OTJkYzdlMWI2NTMwNzllMjU4NjU5NWJkY2Y4OTM3ZjcyMmMyYmU4NjdhZGNhMTYzZDA0MDQzMjUxMDY2MTMwZTAyZGRjOGNiNzY2M2NmOGQ4NzY0YjEwYmY2YTI2YTk2MjRmMTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2MwYzc4YjA2ZmZmMmIxNzVkODQzYTliMTNmZjg3Mzk3MGM2YzJlZWIyZTBhMmEyMDdlOWFjYjI1YTliMGE2MjFkNGVjOGQyMWUwY2NhODgzZDIwMTFiZmVlMDdmN2RiNzI4ZTJlYzBiNDViMjRkMjU4ZWNiZmUwZGVlMDAzNTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTg0MmZlODI1MWQ0ZTA5NmYxM2NiZTVlYmY3ZTBiMzBjNmI1MzBhMDBiMzRmYTA3YmU4MDRkNWQ3YjQwMGEwMmIyNmZmNDI2OGIxNGRkODc3ZTk2ZTFhZTMzYWQwOGVmMmFiODgxMjk2MzJkNjI4NzU5NTJlYWZkMDE3MjExYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjliNzM0MWY4OWVmN2RhYTVhM2EwMTgwZTFiZmY3MWM1MmQwODg3MWViMGFmY2U1Nzc0NzAzZDk1MTgyZGQwYzAyYzA1MDgzM2VmNjE5OWJmMzEyYWM1YzAyZGJlNDUyM2U0ZDhhMGYxOTY5MTI1ZWM3NzU5NmNjYjc2NTAzZmM1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjk5MTliNzhkMDczNjljNjdjYmU2OGU4NjgwYjJjOTE5ZDYwOWQyZGJjYmIyMWQyYzgwY2ZmMjYyYTM2NDUzNDdhNTMwZTczOTFkNDFlNzhhNDQ4ZDc1MTgzMjZhMWNlM2VjYjljOTlkMTYzNDM5MDE2Mzk2NTQ5MmFkZTA0OWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMzlmMzA1YmM3OWYxZGI5YTZjZmJmOTUyNTE5MjViMmVlNTZiZDI5YmIxNTU3ZjI0NDY5OGZjMjM1ZDBhZjllNzI3YWM1NzIwMjI2ZTMyZGM4MGZjOGFmMzYxN2IwYTRkNTNjZTc3MmU3MDNlMjVmZjBiOWViZWQ3NGM3NTczOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTQxNzBjNGUxNmQ1Mzc5NWE4NDc5ZDBjMWE3OWQxOWIxOTBkOTIyZTE2MzAxZTdhMGJiOGI4MTZkM2M0OWJkMjVmZTBiODRlODc5ZGE3ODBjM2ZjMDY0MWFkNjljYzU3ZGQxZTc5NWVjZTdlOGJiMjgxMmY3NDMwNThhZmYwMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGF0dGVybnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjMTEwNTVmY2E1ODRhZjRkNDczOTljNTRiYzUwZDgxYWE2OGM2MDNhNTUwYmY2OWEwOWIyN2M4OWY2ODVlOTc0NDU0NWE3NTNhZDVlOGZlMzMzMWFkYmQ5ZDRkY2ExNDNhNTg3ZGQ2MDkzNGZiNDFjODJmNGExZTllYjFkZTUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZTcyYTVkY2Q2NGUxZDdkMjU0NWNlMzBjYzM3MDI0ODQzOTBjOWQ1Y2RkYjlkMDVjZWEzMzZlODhlZThlOTMzYmMzMTUwM2M0YzI1YzM3ZTBhMWNhYzhjZGUzMWNiYmY0NzgxODY0ZDBkODlkNzFmZWU1ODRmNTliMDE5MzQyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDJkMzcyODdhMmVhYzlmNDFjYzQ0YTkyMDFmOTlkZjIyMWE2NzZhNDdjZTc5ZDgwNjBiN2M1NjdjMmU2M2Y3ZGViZDkyNmZmZTM1MjIzZWE3ZjM1OWZmNmE5YjMwYTgzNjhhMzk2YWI2ZGRmYzRiOGIxMjI2NDFmODVjOWI4ZTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZGU0ZjgyZjJjNGQ0OWRiM2E5ODE0YmRiY2YxZWM2NGQ3MWQ4ZmFkNTIxZTExMGU2ODEyZDNiMzczZWQ5MjhiODYxZDc1ZjA3YTY3ZTNjZjRjM2ZlZDZhZGU0NTU3YmJmNGFkOTQ1NzM1YTIzOGRlZGRkMDUzYzA5MzJlNmEwNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRlYWI3ZWMyODRjYWRlMWIwNGRmNGYzYmU2ODZjMTcyYjA0MzkxZjBlZWQ4NTQ4ZTQ5ZjkzMWIzYzJjNGM1MTgzZTg0MTFlZTY1YTBiOWI2ZGZiNWZkZjFhZGI4ZTRhMzYxMjUwYWUwMTkxZTJlYzYwYzU4MTQxOGU4Y2E1MDQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGI5ODkyYjNhMjViZjZiYWQzMjM1ZDZhMzc2NTZmMTFhNDNlNDRhMzhmZThkNWM4ZTQzNWIxZjA5Y2JmMmI0MmY2YWQ2NDk0NDY0ZDU3YWQxOTQ3Zjc4YzhhMTAxOTZiYmQ4ZjUwYjY0ZTI1MTA2NzYzZWRhOTNkZTI3YWRlYmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YjFiNDE3YzZkZDkzMmRiODFmOWRhMTE0YzAyMGM3ZDAyNzhiZjEyYmE4YzQ2MDdmZjQwYWJjNWUzMDE1OTUxZGNkZmJhMmUwMWEwMTUzZjRkMGZmOWEzNzU0ZWJjMDA0NjA3N2Y3YTg0MjMxN2IzMWJiN2EzZjFjYjBmYzkyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMyNzZjNmZiYzYzYjViYmY4M2FjZjBlOTkzMTdlOTAzNWZmMzhkMDRhN2I2MWIyOWY4MDAzNTM4NTAxZmVjZGYyYmU5OTc2YWRmOWUyMmE5MDA5YWI0ZjUxMWI5OGU3ZWZjNjQ5ZmE3M2UyYTlhYzMyMzYzY2NkZThhYWE1MTNhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4YTg1MWJkYmYyZjRkZDA5YTEzYjUyMTEzMGUyOTlmOWQxOTU1YWUxOTI5MTYyN2NkMjhkZjRmYjVkNDg3OGVjZGY3Y2UyYjIyYTU2NzBiNDM5N2JmNDkwYjgwZDg5ODI0ODFkYjVjZWIyMjRiMTBhZmRlZmU1YzQ0NTA2MjY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjExNGIzYTQwNDM4MjJmOGZiZmQyMmFiNjAxOWNjMWE3ZTYwYWRjZjdhNTdkNzBkMjdlOGVmMWMxMTIyNjI3NWY3ZTMxMzc2ZDg0MzZhMTQ3OTk4Y2E5YTA0NjA3NjkyMWQzNjcyZWM5MWRmNmQ2ZjMyMTEwNWJjZGFiM2Q2NzMwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOWZmZTU1YTMxMDM3M2E0NTdhYTlkMDc3MTYxMTg1MDU0ZWIzNmY4MzUzMjhmY2ExNGVmZDExNDUxYzYxNTAyYTEyMGI4M2M3NDgyMDRmYTA4NzdhZmM3MDUyZWIyMmE0ZDdiMGUxYjBiNjE4ZGI5MDIxN2Q2ZThjZTc3YTI5MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTgxNGRkMTQzZGZmNzNkZTNlZTRjMWYwNzcwN2U1NzdjYWFjYWEzYWJmNGIwNTkwY2RlZGUxMGI5MTk5YTkyZDc5N2YwYzExYmI3MzgyOTVjNDlmMWU3ZWY5MGYzZDExNmUyOGU3NGMwODY3MzRlYmNhOGJjZGExZGM5MzlkNDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZWE1NWZhMmNjMWI3MzZlMDJiYjgzMjI0NmRjYzZmY2Q0YTBhMWViYzI0MWUzODFlZjZmNjRiZDhlYzQ2YTE1ZDNmNzk3ZWMyMmEzNWM5YzVjOTUxNDI0ZTM5ZmQ2YTY4N2NkYjQxNTVjOGRiNzFmNmVmZTdkM2ZlOTdlOTQ1YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NWU4MzM2Y2JjNDFjZDJmNjMxMTc3YzA2MTA5Y2YzZjhiNTE4MTRjYjMzZTIyMDgyYzhlOWVlZTA3MmVjNDg5MTlkMDhkNDNkMjlkNTY1NTE4MjZjODk1MTM1ODM1NGQ2OGU1YWEwOTZjNmFhNTY2MTM0OWUwZmExMDgxNmY3OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OGE4NTFiZGJmMmY0ZGQwOWExM2I1MjExMzBlMjk5ZjlkMTk1NWFlMTkyOTE2MjdjZDI4ZGY0ZmI1ZDQ4NzhlY2RmN2NlMmIyMmE1NjcwYjQzOTdiZjQ5MGI4MGQ4OTgyNDgxZGI1Y2ViMjI0YjEwYWZkZWZlNWM0NDUwNjI2NSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vc3RyZWFtLXYwLjMuMjUiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3N0cmVhbSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MC4zLjI1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdHJlYW0vcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MC4zLjI1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMDk0MTMyY2I5YWNlN2YyYWE4ZmIyNGE4NWE4NjBkNDhkZDdjM2U1NDQwMDFmZWNmZWQwYTk3ZGMxYTM3YzJmZTNkM2QxYzBlNDQwOTkwYTg2MGU1ZjQzZTdlNmI1N2UzYTBlMTQ2MDI0YjA1ZDk4ODMwNmM2ZjkwNjhiNWEyZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiamVzc2llLmpzLXYwLjMuMiI6IHsKICAgICAgIm5hbWUiOiAiamVzc2llLmpzIiwKICAgICAgImxhYmVsIjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAxZGNiZTM0ZjRjMjI0ZDZkNmZmZGRlY2IzZGU1YmRmMmZmMzEzODY2N2Y1NmY0OTk1NTY5ZjBjMmQ5ZmNlM2I0ZGVjNDMzZjBkNDU2YTE4Yjk1ZDdmM2YyMzdjMTE5NmM0ODdiYzQ0ZTQ0NmYyOTVjZjYzZDJkNTgzZDc4ODg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMjEyNGJjY2M4NDYwMTkwMDYxZjRjZGJkOGRmNDliZDcyM2QxYzY1NWFiOTlkMDI2NzZmOGExMTFhMGY3NGU0NzYyY2FjNDNlY2RlZWI4NWQyOTNmMzdjODJlYmMyNWZjNGUwNTJjOTkyMzc4YmM3ZWJlMTBlNjgxY2Q4MzAzNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5YTk1ZDFkYmNjOGY0YmU4MTQyMDRmNjgzMmMxZWFjMzA2MjFmY2NiMDMyOGMwZWM0MWVhNWEwMzkxNDk5OGM4ZWZmOTAxOWVmZjY1YWQ2NjI4OWMwMTU5MTgxZDliNDlkYjJjZDk2ZjNmYjU5ZTIxYWRiODRkOWE0YzBlODk3ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmY3MTYzNzgyZjY3MmY2Mjg0NDkyNWI2YmI0ZmQ5ZDAxN2I4YjY0MmZmMzM2NDRmMjU5ZWUwMDdlMmJiNWE4MWIyNGJmZTA2NDE3NDA1YjA1MDUxOWZiNTNjMjBhODNmMjlkZTEyZjgzYzNiOWQ2OTZjZjdmODRlOThkZTUxMTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MzU3YmJmNmIxMWJiY2JjYTNiOTU5YzVlZTFhZWE0ZmFlYzM0ZmUzNDZiODM4MTk0MDJlOTNkZmJiZGU3ZmY4ZmRjZTM5ZTFmNjA4ZGJiNzY1NDBhODFjYTQ5OGVmZDQ2OTI5ZjQxZTc4OWUyOWJiNmRhZjY3YWQzYzE3NWE1ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9hc3luYy10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MGJmMTIxYTdhNTY5NTE0YzJlMGMxYWE1MWQxNmUzZTBkMTNhYzVlYWY5MDE1M2ExYzI1N2M2OWFjYmFjYWIwZjRhMmRjNjE1MDNiMzM3MmViMGE5ODA2YTYxNTI2NTFmNzAxOWEzN2JlOTJkZTg0ZDhhMjI1NWU3ZjMzMTA3MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWUxNDQ5MGNlNTNhZjQyYmU1MjQ2YzcxNjkyODgzNDY2ZjcxNGU4OTgyNGM3MzNiYzQzM2VhMjk1YjIyMjljZDRmN2MzYjhiYTAyYzY5OTdjNzJmZjAyNzk0YTEyNjdlOWU1ZTRmMTNhMjVkYzQ2YmRlNGRmZTUyM2NkZTU1NDgiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAAA5ilYCOwsAADsLAAAjAAAAQGFnb3JpYy9hc3NlcnQtdjAuNi4wL3NyYy9hc3NlcnQuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhaWwiLCJOb25OdWxsaXNoIiwiYW4iLCJhc3NlcnQiLCJkZXRhaWxzIiwiaWRlbnRDaGVja2VyIiwibWFrZUFzc2VydCIsInEiLCJxdW90ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGFuLCAnbmFtZScsIHt2YWx1ZTogXCJhblwifSk7JGjigI1fb25jZS5hbihhbik7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge0Fzc2VydH0gKi9cbmNvbnN0IGdsb2JhbEFzc2VydD1nbG9iYWxUaGlzLmFzc2VydDskaOKAjV9vbmNlLmdsb2JhbEFzc2VydChnbG9iYWxBc3NlcnQpO1xuXG5pZihnbG9iYWxBc3NlcnQ9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbml0aWFsaXplIEBhZ29yaWMvYXNzZXJ0LCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0LCBpbXBvcnQgJ3NlcycgYmVmb3JlICdAYWdvcmljL2Fzc2VydCdgKTtcblxuIH1cblxuY29uc3QgbWlzc2luZz0vKiogQHR5cGUge2NvbnN0fSAqL1tcbidmYWlsJyxcbidlcXVhbCcsXG4ndHlwZW9mJyxcbidzdHJpbmcnLFxuJ25vdGUnLFxuJ2RldGFpbHMnLFxuJ0ZhaWwnLFxuJ3F1b3RlJyxcbidtYWtlQXNzZXJ0J10uXG5maWx0ZXIoKG5hbWUpPT5nbG9iYWxBc3NlcnRbbmFtZV09PT11bmRlZmluZWQpO1xuaWYobWlzc2luZy5sZW5ndGg+MCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGFnb3JpYy9hc3NlcnQsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbicsICcpXG4gfWApO1xuXG4gfVxuXG5jb25zdHtkZXRhaWxzLEZhaWwscXVvdGUsbWFrZUFzc2VydH09Z2xvYmFsQXNzZXJ0OyRo4oCNX29uY2UuZGV0YWlscyhkZXRhaWxzKTskaOKAjV9vbmNlLkZhaWwoRmFpbCk7JGjigI1fb25jZS5xdW90ZShxdW90ZSk7JGjigI1fb25jZS5tYWtlQXNzZXJ0KG1ha2VBc3NlcnQpO1xuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgICAgICAgIE5vbk51bGxpc2g9KHZhbCxvcHREZXRhaWxzPSBgdW5leHBlY3RlZCAke3F1b3RlKHZhbCl9YCk9PntcbmlmKHZhbCE9bnVsbCl7XG4vKiBUaGlzIGAhPSBudWxsYCBpZGlvbSBjaGVja3MgdGhhdCBgdmFsYCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuKi9cbnJldHVybiB2YWw7XG4gfVxuYXNzZXJ0LmZhaWwob3B0RGV0YWlscyk7XG4gfTskaOKAjV9vbmNlLk5vbk51bGxpc2goTm9uTnVsbGlzaCk7XG5oYXJkZW4oTm9uTnVsbGlzaCk7XG5cbi8qKlxuICogUHJlcGVuZCB0aGUgY29ycmVjdCBpbmRlZmluaXRlIGFydGljbGUgb250byBhIG5vdW4sIHR5cGljYWxseSBhIHR5cGVvZiByZXN1bHRcbiAqIGUuZy4sIFwiYW4gT2JqZWN0XCIgdnMuIFwiYSBOdW1iZXJcIlxuICpcbiAqIEBkZXByZWNhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBub3VuIHRvIHByZXBlbmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBub3VuIHByZXBlbmRlZCB3aXRoIGEvYW5cbiAqL1xuZnVuY3Rpb24gYW4oc3RyKXtcbnN0cj0gYCR7c3RyfWA7XG5pZihzdHIubGVuZ3RoPj0xJiYnYWVpb3VBRUlPVScuaW5jbHVkZXMoc3RyWzBdKSl7XG5yZXR1cm4gYGFuICR7c3RyfWA7XG4gfVxucmV0dXJuIGBhICR7c3RyfWA7XG4gfVxuZnJlZXplKGFuKTtcblxuXG4vKipcbiAqIEluIHRoZSBgYXNzZXJ0Rm9vYC9gaXNGb29gL2BjaGVja0Zvb2AgcGF0dGVybiwgYGNoZWNrRm9vYCBoYXMgYSBgY2hlY2tgXG4gKiBwYXJhbWV0ZXIgb2YgdHlwZSBgQ2hlY2tlcmAuIGBhc3NlcnRGb29gIGNhbGxzIGBjaGVja0Zvb2AgcGFzc2VzXG4gKiBgYXNzZXJ0Q2hlY2tlcmAgYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpc0Zvb2AgcGFzc2VzIGBpZGVudENoZWNrZXJgXG4gKiBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlkZW50Q2hlY2tlcmAgYWN0cyBwcmVjaXNlbHkgbGlrZSBhblxuICogaWRlbnRpdHkgZnVuY3Rpb24sIGJ1dCBpcyB0eXBlZCBhcyBhIGBDaGVja2VyYCB0byBpbmRpY2F0ZSBpdHNcbiAqIGludGVuZGVkIHVzZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGlkZW50Q2hlY2tlcj0oY29uZCxfZGV0YWlscyk9PmNvbmQ7JGjigI1fb25jZS5pZGVudENoZWNrZXIoaWRlbnRDaGVja2VyKTtcbmhhcmRlbihpZGVudENoZWNrZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydCI6WyJnbG9iYWxBc3NlcnQiXSwiZGV0YWlscyI6WyJkZXRhaWxzIl0sIkZhaWwiOlsiRmFpbCJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sIm1ha2VBc3NlcnQiOlsibWFrZUFzc2VydCJdLCJhbiI6WyJhbiJdLCJOb25OdWxsaXNoIjpbIk5vbk51bGxpc2giXSwiaWRlbnRDaGVja2VyIjpbImlkZW50Q2hlY2tlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAFuYfs2i4AANouAAAiAAAAQGFnb3JpYy9hc3NlcnQtdjAuNi4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiBCYXNlZCBvbiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9IRUFEL3BhY2thZ2VzL3Nlcy9zcmMvZXJyb3IvdHlwZXMuanMqL1xuLyogQ29vcmRpbmF0ZSBlZGl0cyB1bnRpbCB3ZSByZWZhY3RvciB0byBhdm9pZCB0aGlzIGR1cGxpY2F0aW9uKi9cbi8qIEF0IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc3NCovXG4vKiBpcyBhIHJlY29yZCBvZiBhIGZhaWxlZCBhdHRlbXB0IHRvIHJlbW92ZSB0aGlzIGR1cGxpY2F0aW9uLiovXG5cbi8qKlxuICogQGNhbGxiYWNrIEJhc2VBc3NlcnRcbiAqIFRoZSBgYXNzZXJ0YCBmdW5jdGlvbiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIHsqfSBmbGFnIFRoZSB0cnV0aHkvZmFsc3kgdmFsdWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXSBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHthc3NlcnRzIGZsYWd9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBc3NlcnRNYWtlRXJyb3JPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vycm9yTmFtZV1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRNYWtlRXJyb3JcbiAqXG4gKiBUaGUgYGFzc2VydC5lcnJvcmAgbWV0aG9kLCByZWNvcmRpbmcgZGV0YWlscyBmb3IgdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcuXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBbRXJyb3JDb25zdHJ1Y3Rvcl0gQW4gb3B0aW9uYWwgYWx0ZXJuYXRlIGVycm9yXG4gKiBjb25zdHJ1Y3RvciB0byB1c2UuXG4gKiBAcGFyYW0ge0Fzc2VydE1ha2VFcnJvck9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEZhaWxcbiAqXG4gKiBUaGUgYGFzc2VydC5mYWlsYCBtZXRob2QuXG4gKlxuICogRmFpbCBhbiBhc3NlcnRpb24sIHJlY29yZGluZyBmdWxsIGRldGFpbHMgdG8gdGhlIGNvbnNvbGUgYW5kXG4gKiByYWlzaW5nIGFuIGV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBpbiB3aGljaCBgZGV0YWlsc2Agc3Vic3RpdHV0aW9uIHZhbHVlc1xuICogaGF2ZSBiZWVuIG1hc2tlZC5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggdGhlIG5vZGVqcyBhc3NlcnRpb24gbGlicmFyeS5cbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIG9mIHdoYXQgd2FzIGFzc2VydGVkXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXSBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRFcXVhbFxuICogVGhlIGBhc3NlcnQuZXF1YWxgIG1ldGhvZFxuICpcbiAqIEFzc2VydCB0aGF0IHR3byB2YWx1ZXMgbXVzdCBiZSBgT2JqZWN0LmlzYC5cbiAqIEBwYXJhbSB7Kn0gYWN0dWFsIFRoZSB2YWx1ZSB3ZSByZWNlaXZlZFxuICogQHBhcmFtIHsqfSBleHBlY3RlZCBXaGF0IHdlIHdhbnRlZFxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc10gVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyogVHlwZSBhbGwgdGhlIG92ZXJsb2FkcyBvZiB0aGUgYXNzZXJ0VHlwZW9mIGZ1bmN0aW9uLiovXG4vKiBUaGVyZSBtYXkgZXZlbnR1YWxseSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgYnV0Ki9cbi8qIHRoZW1zIHRoZSBicmVha3Mgd2l0aCBUeXBlc2NyaXB0IDQuMC4qL1xuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mQmlnaW50XG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2JpZ2ludCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYmlnaW50fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJvb2xlYW5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnYm9vbGVhbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYm9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZGdW5jdGlvblxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydmdW5jdGlvbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgRnVuY3Rpb259XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mTnVtYmVyXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J251bWJlcid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgbnVtYmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk9iamVjdFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydvYmplY3QnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIFJlY29yZDxhbnksIGFueT4gfCBudWxsfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZlN0cmluZ1xuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydzdHJpbmcnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN0cmluZ31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZTeW1ib2xcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnc3ltYm9sJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzeW1ib2x9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3VuZGVmaW5lZCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgdW5kZWZpbmVkfVxuICovXG5cbi8qKlxuICogVGhlIGBhc3NlcnQudHlwZW9mYCBtZXRob2RcbiAqXG4gKiBAdHlwZWRlZiB7QXNzZXJ0VHlwZW9mQmlnaW50ICYgQXNzZXJ0VHlwZW9mQm9vbGVhbiAmIEFzc2VydFR5cGVvZkZ1bmN0aW9uICYgQXNzZXJ0VHlwZW9mTnVtYmVyICYgQXNzZXJ0VHlwZW9mT2JqZWN0ICYgQXNzZXJ0VHlwZW9mU3RyaW5nICYgQXNzZXJ0VHlwZW9mU3ltYm9sICYgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkfSBBc3NlcnRUeXBlb2ZcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRTdHJpbmdcbiAqIFRoZSBgYXNzZXJ0LnN0cmluZ2AgbWV0aG9kLlxuICpcbiAqIGBhc3NlcnQuc3RyaW5nKHYpYCBpcyBlcXVpdmFsZW50IHRvIGBhc3NlcnQudHlwZW9mKHYsICdzdHJpbmcnKWAuIFdlXG4gKiBzcGVjaWFsIGNhc2UgdGhpcyBvbmUgYmVjYXVzZSBpdCBpcyB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQuXG4gKlxuICogQXNzZXJ0IGFuIGV4cGVjdGVkIHR5cGVvZiByZXN1bHQuXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW4gVGhlIHZhbHVlIHRvIGdldCB0aGUgdHlwZW9mXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgc3RyaW5nfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydE5vdGVcbiAqIFRoZSBgYXNzZXJ0Lm5vdGVgIG1ldGhvZC5cbiAqXG4gKiBBbm5vdGF0ZSBhbiBlcnJvciB3aXRoIGRldGFpbHMsIHBvdGVudGlhbGx5IHRvIGJlIHVzZWQgYnkgYW5cbiAqIGF1Z21lbnRlZCBjb25zb2xlIHN1Y2ggYXMgdGhlIGNhdXNhbCBjb25zb2xlIG9mIGBjb25zb2xlLmpzYCwgdG9cbiAqIHByb3ZpZGUgZXh0cmEgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGxvZ2dlZCBlcnJvcnMuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqIEBwYXJhbSB7RGV0YWlsc30gZGV0YWlsc05vdGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e319IERldGFpbHNUb2tlblxuICogQSBjYWxsIHRvIHRoZSBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCBtYWtlcyBhbmQgcmV0dXJucyBhIGZyZXNoIGRldGFpbHNcbiAqIHRva2VuLCB3aGljaCBpcyBhIGZyb3plbiBlbXB0eSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhhdFxuICogYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgZXhwcmVzc2lvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCBEZXRhaWxzVG9rZW59IERldGFpbHNcbiAqIEVpdGhlciBhIHBsYWluIHN0cmluZywgb3IgbWFkZSBieSB0aGUgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgdGFnLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RyaW5nYWJsZVBheWxvYWRcbiAqIEhvbGRzIHRoZSBwYXlsb2FkIHBhc3NlZCB0byBxdW90ZSBzbyB0aGF0IGl0cyBwcmludGVkIGZvcm0gaXMgdmlzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSB0b1N0cmluZyBIb3cgdG8gcHJpbnQgdGhlIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIFRvIFwiZGVjbGFzc2lmeVwiIGFuZCBxdW90ZSBhIHN1YnN0aXR1dGlvbiB2YWx1ZSB1c2VkIGluIGFcbiAqIGBgYCBkZXRhaWxzYC4uLmAgYGBgIHRlbXBsYXRlIGxpdGVyYWwsIGVuY2xvc2UgdGhhdCBzdWJzdGl0dXRpb24gZXhwcmVzc2lvblxuICogaW4gYSBjYWxsIHRvIGBxdW90ZWAuIFRoaXMgbWFrZXMgdGhlIHZhbHVlIGFwcGVhciBxdW90ZWRcbiAqIChhcyBpZiB3aXRoIGBKU09OLnN0cmluZ2lmeWApIGluIHRoZSBtZXNzYWdlIG9mIHRoZSB0aHJvd24gZXJyb3IuIFRoZVxuICogcGF5bG9hZCBpdHNlbGYgaXMgc3RpbGwgcGFzc2VkIHVucXVvdGVkIHRvIHRoZSBjb25zb2xlIGFzIGl0IHdvdWxkIGJlXG4gKiB3aXRob3V0IGBxdW90ZWAuXG4gKlxuICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgd2lsbCByZXZlYWwgdGhlIGV4cGVjdGVkIHNreSBjb2xvciwgYnV0IG5vdCB0aGVcbiAqIGFjdHVhbCBpbmNvcnJlY3Qgc2t5IGNvbG9yLCBpbiB0aGUgdGhyb3duIGVycm9yJ3MgbWVzc2FnZTpcbiAqIGBgYGpzXG4gKiBza3kuY29sb3IgPT09IGV4cGVjdGVkQ29sb3IgfHwgRmFpbGAke3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cXVvdGUoZXhwZWN0ZWRDb2xvcil9YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBub3JtYWwgY29udmVudGlvbiBpcyB0byBsb2NhbGx5IHJlbmFtZSBgZGV0YWlsc2AgdG8gYFhgIGFuZCBgcXVvdGVgIHRvIGBxYFxuICogbGlrZSBgY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSB9ID0gYXNzZXJ0O2AsIHNvIHRoZSBhYm92ZSBleGFtcGxlIHdvdWxkIHRoZW4gYmVcbiAqIGBgYGpzXG4gKiBza3kuY29sb3IgPT09IGV4cGVjdGVkQ29sb3IgfHwgRmFpbGAke3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cShleHBlY3RlZENvbG9yKX1gO1xuICogYGBgXG4gKlxuICogQGNhbGxiYWNrIEFzc2VydFF1b3RlXG4gKiBAcGFyYW0geyp9IHBheWxvYWQgV2hhdCB0byBkZWNsYXNzaWZ5XG4gKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gW3NwYWNlc11cbiAqIEByZXR1cm5zIHtTdHJpbmdhYmxlUGF5bG9hZH0gVGhlIGRlY2xhc3NpZmllZCBwYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmFpc2VcbiAqXG4gKiBUbyBtYWtlIGFuIGBhc3NlcnRgIHdoaWNoIHRlcm1pbmF0ZXMgc29tZSBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvblxuICogbGlrZSBhIHRyYW5zYWN0aW9uLCB2YXQsIG9yIHByb2Nlc3MsIGNhbGwgYG1ha2VBc3NlcnRgIHdpdGggYSBgUmFpc2VgXG4gKiBjYWxsYmFjaywgd2hlcmUgdGhhdCBjYWxsYmFjayBhY3R1YWxseSBwZXJmb3JtcyB0aGF0IGxhcmdlciB0ZXJtaW5hdGlvbi5cbiAqIElmIHBvc3NpYmxlLCB0aGUgY2FsbGJhY2sgc2hvdWxkIGFsc28gcmVwb3J0IGl0cyBgcmVhc29uYCBwYXJhbWV0ZXIgYXNcbiAqIHRoZSBhbGxlZ2VkIHJlYXNvbiBmb3IgdGhlIHRlcm1pbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IHJlYXNvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VBc3NlcnRcbiAqXG4gKiBNYWtlcyBhbmQgcmV0dXJucyBhbiBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3QgdGhhdCBzaGFyZXMgdGhlIGJvb2trZWVwaW5nXG4gKiBzdGF0ZSBkZWZpbmVkIGJ5IHRoaXMgbW9kdWxlIHdpdGggb3RoZXIgYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0cyBtYWRlIGJ5XG4gKiBgbWFrZUFzc2VydGAuIFRoaXMgc3RhdGUgaXMgcGVyLW1vZHVsZS1pbnN0YW5jZSBhbmQgaXMgZXhwb3NlZCBieSB0aGVcbiAqIGBsb2dnZWRFcnJvckhhbmRsZXJgIGFib3ZlLiBXZSByZWZlciB0byBgYXNzZXJ0YCBhcyBhIFwiZnVuY3Rpb24gb2JqZWN0XCJcbiAqIGJlY2F1c2UgaXQgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBhcyBhIGZ1bmN0aW9uLCBidXQgYWxzbyBoYXMgbWV0aG9kcyB0aGF0XG4gKiBjYW4gYmUgY2FsbGVkLlxuICpcbiAqIElmIGBvcHRSYWlzZWAgaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5lZCBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3Qgd2lsbCBjYWxsXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgYmVmb3JlIHRocm93aW5nIHRoZSBlcnJvci4gVGhpcyBlbmFibGVzIGBvcHRSYWlzZWAgdG9cbiAqIGVuZ2FnZSBpbiBldmVuIG1vcmUgdmlvbGVudCB0ZXJtaW5hdGlvbiBiZWhhdmlvciwgbGlrZSB0ZXJtaW5hdGluZyB0aGUgdmF0LFxuICogdGhhdCBwcmV2ZW50cyBleGVjdXRpb24gZnJvbSByZWFjaGluZyB0aGUgZm9sbG93aW5nIHRocm93LiBIb3dldmVyLCBpZlxuICogYG9wdFJhaXNlYCByZXR1cm5zIG5vcm1hbGx5LCB3aGljaCB3b3VsZCBiZSB1bnVzdWFsLCB0aGUgdGhyb3cgZm9sbG93aW5nXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgd291bGQgc3RpbGwgaGFwcGVuLlxuICpcbiAqIEBwYXJhbSB7UmFpc2V9IFtvcHRSYWlzZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VucmVkYWN0ZWRdXG4gKiBAcmV0dXJucyB7QXNzZXJ0fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyh0ZW1wbGF0ZTogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmdbXSwgLi4uYXJnczogYW55KSA9PiBEZXRhaWxzVG9rZW59IERldGFpbHNUYWdcbiAqXG4gKiBVc2UgdGhlIGBkZXRhaWxzYCBmdW5jdGlvbiBhcyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIHRvIGNyZWF0ZVxuICogaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZXMuIFRoZSBhc3NlcnRpb24gZnVuY3Rpb25zIHRha2Ugc3VjaCBtZXNzYWdlc1xuICogYXMgb3B0aW9uYWwgYXJndW1lbnRzOlxuICogYGBganNcbiAqIGFzc2VydChza3kuaXNCbHVlKCksIGRldGFpbHNgJHtza3kuY29sb3J9IHNob3VsZCBiZSBcImJsdWVcImApO1xuICogYGBgXG4gKiBvciBmb2xsb3dpbmcgdGhlIG5vcm1hbCBjb252ZW50aW9uIHRvIGxvY2FsbHkgcmVuYW1lIGBkZXRhaWxzYCB0byBgWGBcbiAqIGFuZCBgcXVvdGVgIHRvIGBxYCBsaWtlIGBjb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxIH0gPSBhc3NlcnQ7YDpcbiAqIGBgYGpzXG4gKiBhc3NlcnQoc2t5LmlzQmx1ZSgpLCBYYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgXCJibHVlXCJgKTtcbiAqIGBgYFxuICogSG93ZXZlciwgbm90ZSB0aGF0IGluIG1vc3QgY2FzZXMgaXQgaXMgcHJlZmVyYWJsZSB0byBpbnN0ZWFkIHVzZSB0aGUgYEZhaWxgXG4gKiB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyAod2hpY2ggaGFzIHRoZSBzYW1lIGlucHV0IHNpZ25hdHVyZSBhcyBgZGV0YWlsc2BcbiAqIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYW5kIHRocm93cyBhbiBlcnJvcik6XG4gKiBgYGBqc1xuICogc2t5LmlzQmx1ZSgpIHx8IEZhaWxgJHtza3kuY29sb3J9IHNob3VsZCBiZSBcImJsdWVcImA7XG4gKiBgYGBcbiAqXG4gKiBUaGUgZGV0YWlscyB0ZW1wbGF0ZSB0YWcgcmV0dXJucyBhIGBEZXRhaWxzVG9rZW5gIG9iamVjdCB0aGF0IGNhbiBwcmludFxuICogaXRzZWxmIHdpdGggdGhlIGZvcm1hdHRlZCBtZXNzYWdlIGluIHR3byB3YXlzLlxuICogSXQgd2lsbCByZXBvcnQgZnVsbCBkZXRhaWxzIHRvIHRoZSBjb25zb2xlLCBidXRcbiAqIG1hc2sgZW1iZWRkZWQgc3Vic3RpdHV0aW9uIHZhbHVlcyB3aXRoIHRoZWlyIHR5cGVvZiBpbmZvcm1hdGlvbiBpbiB0aGUgdGhyb3duIGVycm9yXG4gKiB0byBwcmV2ZW50IHJldmVhbGluZyBzZWNyZXRzIHVwIHRoZSBleGNlcHRpb25hbCBwYXRoLiBJbiB0aGUgZXhhbXBsZVxuICogYWJvdmUsIHRoZSB0aHJvd24gZXJyb3IgbWF5IHJldmVhbCBvbmx5IHRoYXQgYHNreS5jb2xvcmAgaXMgYSBzdHJpbmcsXG4gKiB3aGVyZWFzIHRoZSBzYW1lIGRpYWdub3N0aWMgcHJpbnRlZCB0byB0aGUgY29uc29sZSByZXZlYWxzIHRoYXQgdGhlXG4gKiBza3kgd2FzIGdyZWVuLiBUaGlzIG1hc2tpbmcgY2FuIGJlIGRpc2FibGVkIGZvciBhbiBpbmRpdmlkdWFsIHN1YnN0aXR1dGlvbiB2YWx1ZVxuICogdXNpbmcgYHF1b3RlYC5cbiAqXG4gKiBUaGUgYHJhd2AgcHJvcGVydHkgb2YgYW4gaW5wdXQgdGVtcGxhdGUgYXJyYXkgaXMgaWdub3JlZCwgc28gYSBzaW1wbGVcbiAqIGFycmF5IG9mIHN0cmluZ3MgbWF5IGJlIHByb3ZpZGVkIGRpcmVjdGx5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyh0ZW1wbGF0ZTogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmdbXSwgLi4uYXJnczogYW55KSA9PiBuZXZlcn0gRmFpbFRhZ1xuICpcbiAqIFVzZSB0aGUgYEZhaWxgIGZ1bmN0aW9uIGFzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdG8gZWZmaWNpZW50bHlcbiAqIGNyZWF0ZSBhbmQgdGhyb3cgYSBgZGV0YWlsc2Atc3R5bGUgZXJyb3Igb25seSB3aGVuIGEgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQuXG4gKiBgYGBqc1xuICogY29uZGl0aW9uIHx8IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqIGBgYFxuICogVGhpcyBhdm9pZHMgdGhlIG92ZXJoZWFkIG9mIGNyZWF0aW5nIHVzdWFsbHktdW5uZWNlc3NhcnkgZXJyb3JzIGxpa2VcbiAqIGBgYGpzXG4gKiBhc3NlcnQoY29uZGl0aW9uLCBkZXRhaWxzYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiB3aGlsZSBpbXByb3ZpbmcgcmVhZGFiaWxpdHkgb3ZlciBhbHRlcm5hdGl2ZXMgbGlrZVxuICogYGBganNcbiAqIGNvbmRpdGlvbiB8fCBhc3NlcnQuZmFpbChkZXRhaWxzYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKlxuICogSG93ZXZlciwgZHVlIHRvIGN1cnJlbnQgd2Vha25lc3MgaW4gVHlwZVNjcmlwdCwgc3RhdGljIHJlYXNvbmluZ1xuICogaXMgbGVzcyBwb3dlcmZ1bCB3aXRoIHRoZSBgfHxgIHBhdHRlcm5zIHRoYW4gd2l0aCBhbiBgYXNzZXJ0YCBjYWxsLlxuICogVW50aWwvdW5sZXNzIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTE0MjYgaXMgZml4ZWQsXG4gKiBmb3IgYHx8YC1zdHlsZSBhc3NlcnRpb25zIHdoZXJlIHRoaXMgbG9zcyBvZiBzdGF0aWMgcmVhc29uaW5nIGlzIGEgcHJvYmxlbSxcbiAqIGluc3RlYWQgZXhwcmVzcyB0aGUgYXNzZXJ0aW9uIGFzXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmRpdGlvbikge1xuICogICAgIEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKiBvciwgaWYgbmVlZGVkLFxuICogYGBganNcbiAqICAgaWYgKCFjb25kaXRpb24pIHtcbiAqICAgICAvLyBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cywgYnV0IGl0IGltcHJvdmVzIHN0YXRpYyBhbmFseXNpc1xuICogICAgIHRocm93IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKi9cblxuLyoqXG4gKiBhc3NlcnQgdGhhdCBleHByIGlzIHRydXRoeSwgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWxzIHRvIGRlc2NyaWJlXG4gKiB0aGUgYXNzZXJ0aW9uLiBJdCBpcyBhIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsIGxpa2VcbiAqIGBgYGpzXG4gKiBhc3NlcnQoZXhwciwgZGV0YWlsc2AuLi4uYCk7YFxuICogYGBgXG4gKlxuICogVGhlIGxpdGVyYWwgcG9ydGlvbnMgb2YgdGhlIHRlbXBsYXRlIGFyZSBhc3N1bWVkIG5vbi1zZW5zaXRpdmUsIGFzXG4gKiBhcmUgdGhlIGB0eXBlb2ZgIHR5cGVzIG9mIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzLiBUaGVzZSBhcmVcbiAqIGFzc2VtYmxlZCBpbnRvIHRoZSB0aHJvd24gZXJyb3IgbWVzc2FnZS4gVGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGVcbiAqIHN1YnN0aXR1dGlvbiB2YWx1ZXMgYXJlIGFzc3VtZWQgc2Vuc2l0aXZlLCB0byBiZSByZXZlYWxlZCB0b1xuICogdGhlIGNvbnNvbGUgb25seS4gV2UgYXNzdW1lIG9ubHkgdGhlIHZpcnR1YWwgcGxhdGZvcm0ncyBvd25lciBjYW4gcmVhZFxuICogd2hhdCBpcyB3cml0dGVuIHRvIHRoZSBjb25zb2xlLCB3aGVyZSB0aGUgb3duZXIgaXMgaW4gYSBwcml2aWxlZ2VkXG4gKiBwb3NpdGlvbiBvdmVyIGNvbXB1dGF0aW9uIHJ1bm5pbmcgb24gdGhhdCBwbGF0Zm9ybS5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggdGhlIG5vZGVqcyBhc3NlcnRpb24gbGlicmFyeS5cbiAqXG4gKiBAdHlwZWRlZiB7IEJhc2VBc3NlcnQgJiB7XG4gKiAgIHR5cGVvZjogQXNzZXJ0VHlwZW9mLFxuICogICBlcnJvcjogQXNzZXJ0TWFrZUVycm9yLFxuICogICBmYWlsOiBBc3NlcnRGYWlsLFxuICogICBlcXVhbDogQXNzZXJ0RXF1YWwsXG4gKiAgIHN0cmluZzogQXNzZXJ0U3RyaW5nLFxuICogICBub3RlOiBBc3NlcnROb3RlLFxuICogICBkZXRhaWxzOiBEZXRhaWxzVGFnLFxuICogICBGYWlsOiBGYWlsVGFnLFxuICogICBxdW90ZTogQXNzZXJ0UXVvdGUsXG4gKiAgIG1ha2VBc3NlcnQ6IE1ha2VBc3NlcnQsXG4gKiB9IH0gQXNzZXJ0XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAU/WFv0Y3AABGNwAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4xL3NyYy9hbW91bnRNYXRoLmpzeyJpbXBvcnRzIjpbIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiQW1vdW50TWF0aCIsIkFzc2V0S2luZCIsImFzc2VydEFzc2V0S2luZCIsImFzc2VydFZhbHVlR2V0SGVscGVycyIsImdldEFzc2V0S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZW1vdGFibGUgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1wiLCBbW1wibmF0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKG5hdE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcInNldE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChzZXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChjb3B5U2V0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlCYWdNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAoY29weUJhZ01hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIENvbnN0YW50cyBmb3IgdGhlIGtpbmRzIG9mIGFzc2V0cyB3ZSBzdXBwb3J0LlxuICpcbiAqIEB0eXBlIHt7IE5BVDogJ25hdCcsIFNFVDogJ3NldCcsIENPUFlfU0VUOiAnY29weVNldCcsIENPUFlfQkFHOiAnY29weUJhZycgfX1cbiAqL1xuY29uc3QgQXNzZXRLaW5kPWhhcmRlbih7XG5OQVQ6J25hdCcsXG5TRVQ6J3NldCcsXG5DT1BZX1NFVDonY29weVNldCcsXG5DT1BZX0JBRzonY29weUJhZyd9KTskaOKAjV9vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuXG5jb25zdCBhc3NldEtpbmROYW1lcz1oYXJkZW4oT2JqZWN0LnZhbHVlcyhBc3NldEtpbmQpLnNvcnQoKSk7XG5cbi8qKlxuICogQHBhcmFtIHtBc3NldEtpbmR9IGFsbGVnZWRBS1xuICovXG5jb25zdCBhc3NlcnRBc3NldEtpbmQ9KGFsbGVnZWRBSyk9PntcbmFzc2V0S2luZE5hbWVzLmluY2x1ZGVzKGFsbGVnZWRBSyl8fFxuRmFpbCBgVGhlIGFzc2V0S2luZCAke2FsbGVnZWRBS30gbXVzdCBiZSBvbmUgb2YgJHtxKGFzc2V0S2luZE5hbWVzKX1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKipcbiAqIEFtb3VudHMgZGVzY3JpYmUgZGlnaXRhbCBhc3NldHMuIEZyb20gYW4gYW1vdW50LCB5b3UgY2FuIGxlYXJuIHRoZVxuICogYnJhbmQgb2YgZGlnaXRhbCBhc3NldCBhcyB3ZWxsIGFzIFwiaG93IG11Y2hcIiBvciBcImhvdyBtYW55XCIuIEFtb3VudHNcbiAqIGhhdmUgdHdvIHBhcnRzOiBhIGJyYW5kIChsb29zZWx5IHNwZWFraW5nLCB0aGUgdHlwZSBvZiBkaWdpdGFsXG4gKiBhc3NldCkgYW5kIHRoZSB2YWx1ZSAodGhlIGFuc3dlciB0byBcImhvdyBtdWNoXCIpLiBGb3IgZXhhbXBsZSwgaW5cbiAqIHRoZSBwaHJhc2UgXCI1IGJ1Y2tzXCIsIFwiYnVja3NcIiB0YWtlcyB0aGUgcm9sZSBvZiB0aGUgYnJhbmQgYW5kIHRoZVxuICogdmFsdWUgaXMgNS4gQW1vdW50cyBjYW4gZGVzY3JpYmUgZnVuZ2libGUgYW5kIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiBhc3NldHMuIEFtb3VudHMgYXJlIHBhc3MtYnktY29weSBhbmQgY2FuIGJlIG1hZGUgYnkgYW5kIHNlbnQgdG9cbiAqIGFueW9uZS5cbiAqXG4gKiBUaGUgaXNzdWVyIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBvZiB0aGUgYW1vdW50IGluIHBheW1lbnRzXG4gKiBhbmQgcHVyc2VzLiBUaGUgaXNzdWVyIG11c3QgYmUgYWJsZSB0byBkbyB0aGluZ3Mgc3VjaCBhcyBhZGRcbiAqIGRpZ2l0YWwgYXNzZXRzIHRvIGEgcHVyc2UgYW5kIHdpdGhkcmF3IGRpZ2l0YWwgYXNzZXRzIGZyb20gYSBwdXJzZS5cbiAqIFRvIGRvIHNvLCBpdCBtdXN0IGtub3cgaG93IHRvIGFkZCBhbmQgc3VidHJhY3QgZGlnaXRhbCBhc3NldHMuXG4gKiBSYXRoZXIgdGhhbiBoYXJkLWNvZGluZyBhIHBhcnRpY3VsYXIgc29sdXRpb24sIHdlIGNob3NlIHRvXG4gKiBwYXJhbWV0ZXJpemUgdGhlIGlzc3VlciB3aXRoIGEgY29sbGVjdGlvbiBvZiBwb2x5bW9ycGhpYyBmdW5jdGlvbnMsXG4gKiB3aGljaCB3ZSBjYWxsIGBBbW91bnRNYXRoYC4gVGhlc2UgbWF0aCBmdW5jdGlvbnMgaW5jbHVkZSBjb25jZXB0c1xuICogbGlrZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uXG4gKlxuICogV2UgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjb25mdXNpb24gYXMgdG8gd2hhdCBraW5kIG9mXG4gKiBhc3NldCB3ZSBhcmUgdXNpbmcuIFRodXMsIEFtb3VudE1hdGggaW5jbHVkZXMgY2hlY2tzIG9mIHRoZVxuICogYGJyYW5kYCwgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0LiBJZlxuICogdGhlIHdyb25nIGJyYW5kIGlzIHVzZWQgaW4gQW1vdW50TWF0aCwgYW4gZXJyb3IgaXMgdGhyb3duIGFuZCB0aGVcbiAqIG9wZXJhdGlvbiBkb2VzIG5vdCBzdWNjZWVkLlxuICpcbiAqIEFtb3VudE1hdGggdXNlcyBtYXRoSGVscGVycyB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLCBidXQgdGhlbiBhZGRzXG4gKiB0aGUgYnJhbmQgdG8gdGhlIHJlc3VsdC4gVGhlIGZ1bmN0aW9uIGB2YWx1ZWAgZ2V0cyB0aGUgdmFsdWUgZnJvbVxuICogdGhlIGFtb3VudCBieSByZW1vdmluZyB0aGUgYnJhbmQgKGFtb3VudCAtPiB2YWx1ZSksIGFuZCB0aGVcbiAqIGZ1bmN0aW9uIGBtYWtlYCBhZGRzIHRoZSBicmFuZCB0byBwcm9kdWNlIGFuIGFtb3VudCAodmFsdWUgLT5cbiAqIGFtb3VudCkuIFRoZSBmdW5jdGlvbiBgY29lcmNlYCB0YWtlcyBhbiBhbW91bnQgYW5kIGNoZWNrcyBpdCxcbiAqIHJldHVybmluZyBhbiBhbW91bnQgKGFtb3VudCAtPiBhbW91bnQpLlxuICpcbiAqIEVhY2ggaXNzdWVyIG9mIGRpZ2l0YWwgYXNzZXRzIGhhcyBhbiBhc3NvY2lhdGVkIGJyYW5kIGluIGFcbiAqIG9uZS10by1vbmUgbWFwcGluZy4gSW4gdW50cnVzdGVkIGNvbnRleHRzLCBzdWNoIGFzIGluIGFuYWx5emluZ1xuICogcGF5bWVudHMgYW5kIGFtb3VudHMsIHdlIGNhbiBnZXQgdGhlIGJyYW5kIGFuZCBmaW5kIHRoZSBpc3N1ZXJcbiAqIHdoaWNoIG1hdGNoZXMgdGhlIGJyYW5kLiBUaGUgaXNzdWVyIGFuZCB0aGUgYnJhbmQgbXV0dWFsbHkgdmFsaWRhdGVcbiAqIGVhY2ggb3RoZXIuXG4gKi9cblxuY29uc3QgaGVscGVycz17XG5uYXQ6bmF0TWF0aEhlbHBlcnMsXG5zZXQ6c2V0TWF0aEhlbHBlcnMsXG5jb3B5U2V0OmNvcHlTZXRNYXRoSGVscGVycyxcbmNvcHlCYWc6Y29weUJhZ01hdGhIZWxwZXJzfTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlIHsodmFsdWU6IFYpID0+IEFzc2V0S2luZEZvclZhbHVlPFY+fVxuICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZD0odmFsdWUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsdWUpO1xuaWYocGFzc1N0eWxlPT09J2JpZ2ludCcpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiduYXQnO1xuIH1cbmlmKHBhc3NTdHlsZT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nc2V0JztcbiB9XG5pZihtYXRjaGVzKHZhbHVlLE0uc2V0KCkpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nY29weVNldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLmJhZygpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlCYWcnO1xuIH1cbi8qIFRPRE8gVGhpcyBpc24ndCBxdWl0ZSB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSwgaW4gY2FzZSB2YWx1ZVBhc3NTdHlsZSovXG4vKiBpcyAndGFnZ2VkJy4gV2Ugd291bGQgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgdGFnZ2VkKi9cbi8qIG9iamVjdCBpdCBpcy4qL1xuLyogQWxzbywgdGhpcyBraW5kIG9mIG1hbnVhbCBsaXN0aW5nIGlzIGEgbWFpbnRlbmFuY2UgaGF6YXJkIHdlKi9cbi8qIChUT0RPKSB3aWxsIGVuY291bnRlciB3aGVuIHdlIGV4dGVuZCB0aGUgbWF0aCBoZWxwZXJzIGZ1cnRoZXIuKi9cbnRocm93IEZhaWwgYHZhbHVlICR7dmFsdWV9IG11c3QgYmUgYSBiaWdpbnQsIGNvcHlTZXQsIGNvcHlCYWcsIG9yIGFuIGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHZhbHVlIGlzIGEgdmFsaWQgQW1vdW50TWF0aCBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaGVscGVycy5cbiAqXG4gKiBNYWRlIGF2YWlsYWJsZSBvbmx5IGZvciB0ZXN0aW5nLCBidXQgaXQgaXMgaGFybWxlc3MgZm9yIG90aGVyIHVzZXMuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHBhcmFtIHtWfSB2YWx1ZVxuICogQHJldHVybnMge01hdGhIZWxwZXJzPFY+fVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0VmFsdWVHZXRIZWxwZXJzPSh2YWx1ZSk9PlxuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbmhlbHBlcnNbYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpXTtcblxuLyoqIEB0eXBlIHsoYWxsZWdlZEJyYW5kOiBCcmFuZCwgYnJhbmQ/OiBCcmFuZCkgPT4gdm9pZH0gKi8kaOKAjV9vbmNlLmFzc2VydFZhbHVlR2V0SGVscGVycyhhc3NlcnRWYWx1ZUdldEhlbHBlcnMpO1xuY29uc3Qgb3B0aW9uYWxCcmFuZENoZWNrPShhbGxlZ2VkQnJhbmQsYnJhbmQpPT57XG5pZihicmFuZCE9PXVuZGVmaW5lZCl7XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hbGxlZ2VkQnJhbmQ9PT1icmFuZHx8XG5GYWlsIGBhbW91bnQncyBicmFuZCAke3EoYWxsZWdlZEJyYW5kKX0gZGlkIG5vdCBtYXRjaCBleHBlY3RlZCBicmFuZCAke3EoXG5icmFuZClcbiB9YDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPiB8IHVuZGVmaW5lZH0gYnJhbmRcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczwqPn1cbiAqL1xuY29uc3QgY2hlY2tMUkFuZEdldEhlbHBlcnM9KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0UmVjb3JkKGxlZnRBbW91bnQsJ2xlZnRBbW91bnQnKTtcbmFzc2VydFJlY29yZChyaWdodEFtb3VudCwncmlnaHRBbW91bnQnKTtcbmNvbnN0e3ZhbHVlOmxlZnRWYWx1ZSxicmFuZDpsZWZ0QnJhbmR9PWxlZnRBbW91bnQ7XG5jb25zdHt2YWx1ZTpyaWdodFZhbHVlLGJyYW5kOnJpZ2h0QnJhbmR9PXJpZ2h0QW1vdW50O1xuYXNzZXJ0UmVtb3RhYmxlKGxlZnRCcmFuZCwnbGVmdEJyYW5kJyk7XG5hc3NlcnRSZW1vdGFibGUocmlnaHRCcmFuZCwncmlnaHRCcmFuZCcpO1xub3B0aW9uYWxCcmFuZENoZWNrKGxlZnRCcmFuZCxicmFuZCk7XG5vcHRpb25hbEJyYW5kQ2hlY2socmlnaHRCcmFuZCxicmFuZCk7XG5sZWZ0QnJhbmQ9PT1yaWdodEJyYW5kfHxcbkZhaWwgYEJyYW5kcyBpbiBsZWZ0ICR7cShsZWZ0QnJhbmQpfSBhbmQgcmlnaHQgJHtxKFxucmlnaHRCcmFuZClcbiB9IHNob3VsZCBtYXRjaCBidXQgZG8gbm90YDtcbmNvbnN0IGxlZnRIZWxwZXJzPWFzc2VydFZhbHVlR2V0SGVscGVycyhsZWZ0VmFsdWUpO1xuY29uc3QgcmlnaHRIZWxwZXJzPWFzc2VydFZhbHVlR2V0SGVscGVycyhyaWdodFZhbHVlKTtcbmxlZnRIZWxwZXJzPT09cmlnaHRIZWxwZXJzfHxcbkZhaWwgYFRoZSBsZWZ0ICR7bGVmdEFtb3VudH0gYW5kIHJpZ2h0IGFtb3VudCAke3JpZ2h0QW1vdW50fSBoYWQgZGlmZmVyZW50IGFzc2V0S2luZHNgO1xucmV0dXJuIGxlZnRIZWxwZXJzO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7TWF0aEhlbHBlcnM8QXNzZXRWYWx1ZUZvcktpbmQ8Sz4+fSBoXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcmV0dXJucyB7W0ssIEtdfVxuICovXG5jb25zdCBjb2VyY2VMUj0oaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KT0+e1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBhcmJpdHJhcnkgc3VidHlwZSovXG5yZXR1cm5baC5kb0NvZXJjZShsZWZ0QW1vdW50LnZhbHVlKSxoLmRvQ29lcmNlKHJpZ2h0QW1vdW50LnZhbHVlKV07XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZVxuICogcmlnaHRBbW91bnQuIFRoZSBub3Rpb24gb2YgXCJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cIiBkZXBlbmRzXG4gKiBvbiB0aGUga2luZCBvZiBhbW91bnQsIGFzIGRlZmluZWQgYnkgdGhlIE1hdGhIZWxwZXJzLiBGb3IgZXhhbXBsZSxcbiAqIHdoZXRoZXIgcmVjdGFuZ2xlIEEgaXMgZ3JlYXRlciB0aGFuIHJlY3RhbmdsZSBCIGRlcGVuZHMgb24gd2hldGhlciByZWN0YW5nbGVcbiAqIEEgaW5jbHVkZXMgcmVjdGFuZ2xlIEIgYXMgZGVmaW5lZCBieSB0aGUgbG9naWMgaW4gTWF0aEhlbHBlcnMuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc0dURT0obGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xucmV0dXJuIGguZG9Jc0dURSguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbiB9O1xuXG4vKipcbiAqIExvZ2ljIGZvciBtYW5pcHVsYXRpbmcgYW1vdW50cy5cbiAqXG4gKiBBbW91bnRzIGFyZSB0aGUgY2Fub25pY2FsIGRlc2NyaXB0aW9uIG9mIHRyYWRhYmxlIGdvb2RzLiBUaGV5IGFyZSBtYW5pcHVsYXRlZFxuICogYnkgaXNzdWVycyBhbmQgbWludHMsIGFuZCByZXByZXNlbnQgdGhlIGdvb2RzIGFuZCBjdXJyZW5jeSBjYXJyaWVkIGJ5IHB1cnNlc1xuICogYW5kXG4gKiBwYXltZW50cy4gVGhleSBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgdGhpbmdzIGxpa2UgY3VycmVuY3ksIHN0b2NrLCBhbmQgdGhlXG4gKiBhYnN0cmFjdCByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgZXhjaGFuZ2UuXG4gKi9cbmNvbnN0IEFtb3VudE1hdGg9e1xuLyoqXG4gKiBNYWtlIGFuIGFtb3VudCBmcm9tIGEgdmFsdWUgYnkgYWRkaW5nIHRoZSBicmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59IGFsbGVnZWRWYWx1ZVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuLyogYWxsZWdlZFZhbHVlIGhhcyBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gZm9yIHR5cGUgd2lkZW5pbmcsIHRvIHByZXZlbnQgViBiZWluZyBib3VuZCB0byBhIGEgbGl0ZXJhbCBsaWtlIDFuKi9cbm1ha2U6KGJyYW5kLGFsbGVnZWRWYWx1ZSk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmNvbnN0IGg9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFsbGVnZWRWYWx1ZSk7XG5jb25zdCB2YWx1ZT1oLmRvQ29lcmNlKGFsbGVnZWRWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIE1ha2Ugc3VyZSB0aGlzIGFtb3VudCBpcyB2YWxpZCBlbm91Z2gsIGFuZCByZXR1cm4gYSBjb3JyZXNwb25kaW5nXG4gKiB2YWxpZCBhbW91bnQgaWYgc28uXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYWxsZWdlZEFtb3VudFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuY29lcmNlOihicmFuZCxhbGxlZ2VkQW1vdW50KT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0UmVjb3JkKGFsbGVnZWRBbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQ6YWxsZWdlZEJyYW5kLHZhbHVlOmFsbGVnZWRWYWx1ZX09YWxsZWdlZEFtb3VudDtcbmJyYW5kPT09YWxsZWdlZEJyYW5kfHxcbkZhaWwgYFRoZSBicmFuZCBpbiB0aGUgYWxsZWdlZEFtb3VudCAke2FsbGVnZWRBbW91bnR9IGluICdjb2VyY2UnIGRpZG4ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIGJyYW5kICR7YnJhbmR9LmA7XG4vKiBXaWxsIHRocm93IG9uIGluYXBwcm9wcmlhdGUgdmFsdWUqL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCxhbGxlZ2VkVmFsdWUpO1xuIH0sXG4vKipcbiAqIEV4dHJhY3QgYW5kIHJldHVybiB0aGUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59XG4gKi9cbmdldFZhbHVlOihicmFuZCxhbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbW91bnQpLnZhbHVlLFxuLyoqXG4gKiBSZXR1cm4gdGhlIGFtb3VudCByZXByZXNlbnRpbmcgYW4gZW1wdHkgYW1vdW50LiBUaGlzIGlzIHRoZVxuICogaWRlbnRpdHkgZWxlbWVudCBmb3IgTWF0aEhlbHBlcnMuYWRkIGFuZCBNYXRIZWxwZXJzLnN1YnRyYWN0LlxuICpcbiAqIEB0eXBlIHt7XG4gKiAgIChicmFuZDogQnJhbmQpOiBBbW91bnQ8J25hdCc+O1xuICogICA8SyBleHRlbmRzIEFzc2V0S2luZD4oYnJhbmQ6IEJyYW5kLCBhc3NldEtpbmQ6IEspOiBBbW91bnQ8Sz47XG4gKiB9fVxuICovXG5tYWtlRW1wdHk6KGJyYW5kLGFzc2V0S2luZD0vKiogQHR5cGUge2NvbnN0fSAqLyduYXQnKT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5jb25zdCB2YWx1ZT1oZWxwZXJzW2Fzc2V0S2luZF0uZG9NYWtlRW1wdHkoKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudCwgdXNpbmcgYW5vdGhlclxuICogYW1vdW50IGFzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGJyYW5kIGFuZCBhc3NldEtpbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbW91bnRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1ha2VFbXB0eUZyb21BbW91bnQ6KGFtb3VudCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQsdmFsdWV9PWFtb3VudDtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5jb25zdCBhc3NldEtpbmQ9YXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgQW1vdW50IGlzIGVtcHR5LiBPdGhlcndpc2UgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzRW1wdHk6KGFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kOmFsbGVnZWRCcmFuZCx2YWx1ZX09YW1vdW50O1xuYXNzZXJ0UmVtb3RhYmxlKGFsbGVnZWRCcmFuZCwnYnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhhbGxlZ2VkQnJhbmQsYnJhbmQpO1xuY29uc3QgaD1hc3NlcnRWYWx1ZUdldEhlbHBlcnModmFsdWUpO1xucmV0dXJuIGguZG9Jc0VtcHR5KGguZG9Db2VyY2UodmFsdWUpKTtcbiB9LFxuaXNHVEUsXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBlcXVhbHMgdGhlIHJpZ2h0QW1vdW50LiBXZSBhc3N1bWVcbiAqIHRoYXQgaWYgaXNHVEUgaXMgdHJ1ZSBpbiBib3RoIGRpcmVjdGlvbnMsIGlzRXF1YWwgaXMgYWxzbyB0cnVlXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0VxdWFsOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5yZXR1cm4gaC5kb0lzRXF1YWwoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgdW5pb24gb2YgYm90aCBsZWZ0QW1vdW50IGFuZCByaWdodEFtb3VudC5cbiAqXG4gKiBGb3IgZnVuZ2libGUgYW1vdW50IHRoaXMgbWVhbnMgYWRkaW5nIHRoZSB2YWx1ZXMuIEZvciBvdGhlciBraW5kcyBvZlxuICogYW1vdW50LCBpdCB1c3VhbGx5IG1lYW5zIGluY2x1ZGluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gYm90aFxuICogbGVmdCBhbmQgcmlnaHQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbmFkZDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb0FkZCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSBsZWZ0QW1vdW50IG1pbnVzIHRoZSByaWdodEFtb3VudFxuICogKGkuZS4gZXZlcnl0aGluZyBpbiB0aGUgbGVmdEFtb3VudCB0aGF0IGlzIG5vdCBpbiB0aGVcbiAqIHJpZ2h0QW1vdW50KS4gSWYgbGVmdEFtb3VudCBkb2Vzbid0IGluY2x1ZGUgcmlnaHRBbW91bnRcbiAqIChzdWJ0cmFjdGlvbiByZXN1bHRzIGluIGEgbmVnYXRpdmUpLCB0aHJvdyAgYW4gZXJyb3IuIEJlY2F1c2UgdGhlXG4gKiBsZWZ0IGFtb3VudCBtdXN0IGluY2x1ZGUgdGhlIHJpZ2h0IGFtb3VudCwgdGhpcyBpcyBOT1QgZXF1aXZhbGVudFxuICogdG8gc2V0IHN1YnRyYWN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5zdWJ0cmFjdDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb1N1YnRyYWN0KC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQ6bGVmdEFtb3VudC5icmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbiB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IHhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB5XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5taW46KHgseSxicmFuZD11bmRlZmluZWQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5pc0dURSh4LHksYnJhbmQpP1xueTpcbmlzR1RFKHkseCxicmFuZCk/XG54OlxuRmFpbCBgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYCxcbi8qKlxuICogUmV0dXJucyB0aGUgbWF4IHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHlcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1heDooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbmlzR1RFKHgseSxicmFuZCk/XG54OlxuaXNHVEUoeSx4KT9cbnk6XG5GYWlsIGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgfTskaOKAjV9vbmNlLkFtb3VudE1hdGgoQW1vdW50TWF0aCk7XG5cbmhhcmRlbihBbW91bnRNYXRoKTtcblxuLyoqXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKi9cbmNvbnN0IGdldEFzc2V0S2luZD0oYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHt2YWx1ZX09YW1vdW50O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuIH07JGjigI1fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkFzc2V0S2luZCI6WyJBc3NldEtpbmQiXSwiYXNzZXJ0QXNzZXRLaW5kIjpbImFzc2VydEFzc2V0S2luZCJdLCJBbW91bnRNYXRoIjpbIkFtb3VudE1hdGgiXSwiZ2V0QXNzZXRLaW5kIjpbImdldEFzc2V0S2luZCJdLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiOlsiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEqUAO3VBQAA1QUAACcAAABAYWdvcmljL2VydHAtdjAuMTYuMS9zcmMvZGlzcGxheUluZm8uanN7ImltcG9ydHMiOlsiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29lcmNlRGlzcGxheUluZm8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFpbCxtdXN0TWF0Y2gsRGlzcGxheUluZm9TaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkRpc3BsYXlJbmZvU2hhcGVcIiwgWyRo4oCNX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGFsbGVnZWREaXNwbGF5SW5mb1xuICogQHBhcmFtIHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHJldHVybnMge0Rpc3BsYXlJbmZvfVxuICovXG5jb25zdCAgICAgICAgY29lcmNlRGlzcGxheUluZm89KGFsbGVnZWREaXNwbGF5SW5mbyxhc3NldEtpbmQpPT57XG5tdXN0TWF0Y2goYWxsZWdlZERpc3BsYXlJbmZvLERpc3BsYXlJbmZvU2hhcGUsJ2Rpc3BsYXlJbmZvJyk7XG5cbmlmKGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQhPT11bmRlZmluZWQpe1xuYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZD09PWFzc2V0S2luZHx8XG5GYWlsIGBkaXNwbGF5SW5mby5hc3NldEtpbmQgd2FzIHByZXNlbnQgKCR7YWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZH0pIGFuZCBkaWQgbm90IG1hdGNoIHRoZSBhc3NldEtpbmQgYXJndW1lbnQgKCR7YXNzZXRLaW5kfSlgO1xuIH1cbmNvbnN0IGRpc3BsYXlJbmZvPWhhcmRlbih7Li4uYWxsZWdlZERpc3BsYXlJbmZvLGFzc2V0S2luZH0pO1xuXG5pZihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzIT09dW5kZWZpbmVkKXtcbk51bWJlci5pc1NhZmVJbnRlZ2VyKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMpfHxcbkZhaWwgYGRlY2ltYWxQbGFjZXMgJHtkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzfSBpcyBub3QgYSBzYWZlIGludGVnZXJgO1xuIH1cblxucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH07JGjigI1fb25jZS5jb2VyY2VEaXNwbGF5SW5mbyhjb2VyY2VEaXNwbGF5SW5mbyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29lcmNlRGlzcGxheUluZm8iOlsiY29lcmNlRGlzcGxheUluZm8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQzB73OgBAADoAQAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4xL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtdXSxbXCIuL2lzc3VlcktpdC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA1XcEomCAAAJggAAAlAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjEvc3JjL2lzc3VlcktpdC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbImhhc0lzc3VlciIsIm1ha2VEdXJhYmxlSXNzdWVyS2l0IiwibWFrZUlzc3VlcktpdCIsInByZXBhcmVJc3N1ZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LGFzc2VydFBhdHRlcm4sbWFrZVNjYWxhckJpZ01hcFN0b3JlLEFzc2V0S2luZCxhc3NlcnRBc3NldEtpbmQsY29lcmNlRGlzcGxheUluZm8scHJlcGFyZVBheW1lbnRMZWRnZXI7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0QXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChhc3NlcnRBc3NldEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9kaXNwbGF5SW5mby5qc1wiLCBbW1wiY29lcmNlRGlzcGxheUluZm9cIiwgWyRo4oCNX2EgPT4gKGNvZXJjZURpc3BsYXlJbmZvID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudExlZGdlci5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRMZWRnZXJcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVQYXltZW50TGVkZ2VyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlclJlY29yZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kXG4gKiBAcHJvcGVydHkge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmQ8Sz59IGlzc3VlclJlY29yZFxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3Qgc2V0dXBJc3N1ZXJLaXQ9KFxue25hbWUsYXNzZXRLaW5kLGRpc3BsYXlJbmZvLGVsZW1lbnRTaGFwZX0sXG5pc3N1ZXJCYWdnYWdlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5hc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcblxuLyogQWRkIGFzc2V0S2luZCB0byBkaXNwbGF5SW5mbywgb3Igb3ZlcnJpZGUgaWYgcHJlc2VudCovXG5jb25zdCBjbGVhbkRpc3BsYXlJbmZvPWNvZXJjZURpc3BsYXlJbmZvKGRpc3BsYXlJbmZvLGFzc2V0S2luZCk7XG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwnZnVuY3Rpb24nKTtcbiB9XG5cbmlmKGVsZW1lbnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gfVxuXG4vKiBBdHRlbnVhdGUgdGhlIHBvd2VyZnVsIGF1dGhvcml0eSB0byBtaW50IGFuZCBjaGFuZ2UgYmFsYW5jZXMqL1xuLyoqIEB0eXBlIHtQYXltZW50TGVkZ2VyPEs+fSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuY29uc3R7aXNzdWVyLG1pbnQsYnJhbmQsbWludFJlY292ZXJ5UHVyc2V9PXByZXBhcmVQYXltZW50TGVkZ2VyKFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5jbGVhbkRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5icmFuZCxcbmlzc3Vlcixcbm1pbnQsXG5taW50UmVjb3ZlcnlQdXJzZSxcbmRpc3BsYXlJbmZvOmNsZWFuRGlzcGxheUluZm99KTtcblxuIH07XG5oYXJkZW4oc2V0dXBJc3N1ZXJLaXQpO1xuXG4vKiogVGhlIGtleSBhdCB3aGljaCB0aGUgaXNzdWVyIHJlY29yZCBpcyBzdG9yZWQuICovXG5jb25zdCBJTlNUQU5DRV9LRVk9J2lzc3Vlcic7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgaXNzdWVyUmVjb3JkPWlzc3VlckJhZ2dhZ2UuZ2V0KElOU1RBTkNFX0tFWSk7XG5yZXR1cm4gc2V0dXBJc3N1ZXJLaXQoaXNzdWVyUmVjb3JkLGlzc3VlckJhZ2dhZ2Usb3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVJc3N1ZXJLaXQocHJlcGFyZUlzc3VlcktpdCk7XG5oYXJkZW4ocHJlcGFyZUlzc3VlcktpdCk7XG5cbi8qKlxuICogRG9lcyBiYWdnYWdlIGFscmVhZHkgaGF2ZSBhbiBpc3N1ZXIgZnJvbSBwcmVwYXJlSXNzdWVyS2l0KCk/XG4gKiBUaGF0IGlzOiBkb2VzIGl0IGhhdmUgdGhlIHJlbGV2YW50IGtleXMgZGVmaW5lZD9cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuY29uc3QgICAgICAgIGhhc0lzc3Vlcj0oYmFnZ2FnZSk9PmJhZ2dhZ2UuaGFzKElOU1RBTkNFX0tFWSk7XG5cbi8qKlxuICogQHR5cGVkZWYge1BhcnRpYWw8e2VsZW1lbnRTaGFwZTogUGF0dGVybn0+fSBJc3N1ZXJPcHRpb25zUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldCBkZXNjcmlwdGlvbnMuXG4gKiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS5cbiAqIEZvciBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXRcbiAqIGl0IGlzIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmdcbiAqIHRvIHRoYXQgaXNzdWVyIGFuZCBicmFuZC5cbiAqXG4gKiBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVyc1xuICogZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9QXNzZXRLaW5kLk5BVF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm89e31dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi8kaOKAjV9vbmNlLmhhc0lzc3VlcihoYXNJc3N1ZXIpO1xuY29uc3QgICAgICAgIG1ha2VEdXJhYmxlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBpc3N1ZXJEYXRhPWhhcmRlbih7bmFtZSxhc3NldEtpbmQsZGlzcGxheUluZm8sZWxlbWVudFNoYXBlfSk7XG5pc3N1ZXJCYWdnYWdlLmluaXQoSU5TVEFOQ0VfS0VZLGlzc3VlckRhdGEpO1xucmV0dXJuIHNldHVwSXNzdWVyS2l0KGlzc3VlckRhdGEsaXNzdWVyQmFnZ2FnZSxvcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcbiB9OyRo4oCNX29uY2UubWFrZUR1cmFibGVJc3N1ZXJLaXQobWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9J25hdCddXG4gKiBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0IGRlc2NyaXB0aW9ucy5cbiAqIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLlxuICogRm9yIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dFxuICogaXQgaXMgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZ1xuICogdG8gdGhhdCBpc3N1ZXIgYW5kIGJyYW5kLlxuICpcbiAqIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzXG4gKiBmcm9tIHRoZSBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZVxuICogZGVmYXVsdCwgaXMgdXNlZCBmb3IgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9J25hdCddXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvPXt9XVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUlzc3VlcktpdD0oXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG5cbm1ha2VEdXJhYmxlSXNzdWVyS2l0KFxubWFrZVNjYWxhckJpZ01hcFN0b3JlKCdkcm9wcGVkIGlzc3VlciBraXQnLHtkdXJhYmxlOnRydWV9KSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG57ZWxlbWVudFNoYXBlfSk7JGjigI1fb25jZS5tYWtlSXNzdWVyS2l0KG1ha2VJc3N1ZXJLaXQpO1xuXG5oYXJkZW4obWFrZUlzc3VlcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZUlzc3VlcktpdCI6WyJwcmVwYXJlSXNzdWVyS2l0Il0sImhhc0lzc3VlciI6WyJoYXNJc3N1ZXIiXSwibWFrZUR1cmFibGVJc3N1ZXJLaXQiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiXSwibWFrZUlzc3VlcktpdCI6WyJtYWtlSXNzdWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJOx9DeNFgAAjRYAADIAAABAYWdvcmljL2VydHAtdjAuMTYuMS9zcmMvbGVnYWN5LXBheW1lbnQtaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsiY2xhaW0iLCJjb21iaW5lIiwic3BsaXQiLCJzcGxpdE1hbnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbXVzdE1hdGNoLEUsQW1vdW50TWF0aDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEBmaWxlXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgc2FmZXIgaGVscGVyIGZ1bmN0aW9uIGFsdGVybmF0aXZlcyB0byB0aGVcbiAqIHNpbWlsYXJseSBuYW1lZCBtZXRob2RzIG9uIGlzc3Vlci5cbiAqIFRoZXNlIGFyZSBwYXJhbWV0ZXJpemVkIGJ5IGEgcHVyc2UgdXNlZCBmb3IgcmVjb3ZlcmluZyBsb3N0IHBheW1lbnRzLCB3aGljaFxuICogd2UgY2FsbCBhIGByZWNvdmVyeVB1cnNlYC4gQW55IHBheW1lbnRzIGNyZWF0ZWQgYnkgdGhlc2VcbiAqIGhlbHBlciBmdW5jdGlvbnMgYXJlIGluIHRoZSByZWNvdmVyeSBzZXQgb2YgdGhhdCBgcmVjb3ZlcnlQdXJzZWAgdW50aWxcbiAqIG90aGVyd2lzZSB1c2VkIHVwLlxuICpcbiAqIE9uZSBvZiB0aGVzZSBoZWxwZXIgZnVuY3Rpb25zIGlzIGxlc3Mgc2FmZSBpbiBvbmUgd2F5OlxuICogYGNvbWJpbmVgIGlzIG5vdCBmYWlsdXJlIGF0b21pYy4gSWYgdGhlIGBjb21iaW5lYCBoZWxwZXIgZnVuY3Rpb25cbiAqIGZhaWxzLCBzb21lIG9mIHRoZSBpbnB1dCBwYXltZW50cyBtYXkgaGF2ZSBiZWVuIHVzZWQgdXAuIEhvd2V2ZXIsIGV2ZW5cbiAqIGluIHRoYXQgY2FzZSwgbm8gYXNzZXRzIHdvdWxkIGJlIGxvc3QuIFRoZSBhc3NldHMgZnJvbSB0aGUgdXNlZCB1cCBwYXltZW50c1xuICogd2lsbCBiZSBpbiB0aGUgYXJndW1lbnQgYHJlY292ZXJ5UHVyc2VgLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7RVJlZjxQdXJzZTxLPj59IHJlY292ZXJ5UHVyc2VcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+Pn0gc3JjUGF5bWVudFBcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cbmNvbnN0ICAgICAgICBjbGFpbT1hc3luYyhcbnJlY292ZXJ5UHVyc2UsXG5zcmNQYXltZW50UCxcbm9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCk9Plxue1xuY29uc3Qgc3JjUGF5bWVudD1hd2FpdCBzcmNQYXltZW50UDtcbnJldHVybiBFLndoZW4oRShyZWNvdmVyeVB1cnNlKS5kZXBvc2l0KHNyY1BheW1lbnQsb3B0QW1vdW50U2hhcGUpLChhbW91bnQpPT5cbkUocmVjb3ZlcnlQdXJzZSkud2l0aGRyYXcoYW1vdW50KSk7XG5cbiB9OyRo4oCNX29uY2UuY2xhaW0oY2xhaW0pO1xuaGFyZGVuKGNsYWltKTtcblxuLyoqXG4gKiBOb3RlOiBOb3QgZmFpbHVyZSBhdG9taWMuIEJ1dCBhcyBsb25nIGFzIHlvdSBkb24ndCBsb3NlIHRoZSBhcmd1bWVudFxuICogYHJlY292ZXJ5UHVyc2VgLCBubyBhc3NldHMgYXJlIGxvc3QuXG4gKiBJZiBhbnkgb2YgdGhlIGRlcG9zaXRzIGZhaWwsIG9yIHRoZSB0b3RhbCBkb2VzIG5vdFxuICogbWF0Y2ggb3B0VG90YWxBbW91bnQsIHNvbWUgcGF5bWVudHMgbWF5IHN0aWxsIGhhdmUgYmVlbiBkZXBvc2l0ZWQuIFRob3NlXG4gKiBhc3NldHMgd2lsbCBiZSBpbiB0aGUgYXJndW1lbnQgYHJlY292ZXJ5UHVyc2VgLiBBbGwgdW5kZXBvc2l0ZWQgcGF5bWVudHNcbiAqIHdpbGwgc3RpbGwgYmUgaW4gdGhlIHJlY292ZXJ5IHNldHMgb2YgdGhlaXIgcHVyc2VzIG9mIG9yaWdpbi5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtFUmVmPFB1cnNlPEs+Pn0gcmVjb3ZlcnlQdXJzZVxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+W119IHNyY1BheW1lbnRzUHNcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdFRvdGFsQW1vdW50XVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cbmNvbnN0ICAgICAgICBjb21iaW5lPWFzeW5jKFxucmVjb3ZlcnlQdXJzZSxcbnNyY1BheW1lbnRzUHMsXG5vcHRUb3RhbEFtb3VudD11bmRlZmluZWQpPT5cbntcbmNvbnN0IGJyYW5kUD1FKHJlY292ZXJ5UHVyc2UpLmdldEFsbGVnZWRCcmFuZCgpO1xuY29uc3RbYnJhbmQsZGlzcGxheUluZm8sLi4uc3JjUGF5bWVudHNdPWF3YWl0IFByb21pc2UuYWxsKFtcbmJyYW5kUCxcbkUoYnJhbmRQKS5nZXREaXNwbGF5SW5mbygpLFxuLi4uc3JjUGF5bWVudHNQc10pO1xuXG5jb25zdCBlbXB0eUFtb3VudD1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxkaXNwbGF5SW5mby5hc3NldEtpbmQpO1xuY29uc3QgYW1vdW50UHM9c3JjUGF5bWVudHMubWFwKChzcmNQYXltZW50KT0+XG5FKHJlY292ZXJ5UHVyc2UpLmRlcG9zaXQoc3JjUGF5bWVudCkpO1xuXG5jb25zdCBhbW91bnRzPWF3YWl0IFByb21pc2UuYWxsKGFtb3VudFBzKTtcbmNvbnN0IHRvdGFsPWFtb3VudHMucmVkdWNlKFxuKHgseSk9PkFtb3VudE1hdGguYWRkKHgseSxicmFuZCksXG5lbXB0eUFtb3VudCk7XG5cbmlmKG9wdFRvdGFsQW1vdW50IT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaCh0b3RhbCxvcHRUb3RhbEFtb3VudCwnYW1vdW50Jyk7XG4gfVxucmV0dXJuIEUocmVjb3ZlcnlQdXJzZSkud2l0aGRyYXcodG90YWwpO1xuIH07JGjigI1fb25jZS5jb21iaW5lKGNvbWJpbmUpO1xuaGFyZGVuKGNvbWJpbmUpO1xuXG4vKipcbiAqIE5vdGU6IE5vdCBmYWlsdXJlIGF0b21pYy4gQnV0IGFzIGxvbmcgYXMgeW91IGRvbid0IGxvc2UgdGhlIGFyZ3VtZW50XG4gKiBgcmVjb3ZlcnlQdXJzZWAsIG5vIGFzc2V0cyBhcmUgbG9zdC5cbiAqIElmIHRoZSBhbW91bnQgaW4gYHNyY1BheW1lbnRQYCBpcyBub3QgPj0gYHBheW1lbnRBbW91bnRBYCwgdGhlIHBheW1lbnQgbWF5XG4gKiBzdGlsbCBiZSBkZXBvc2l0ZWQgYW55d2F5LCBiZWZvcmUgZmFpbGluZyBpbiB0aGUgc3Vic2VxdWVudCBzdWJ0cmFjdC5cbiAqIEluIHRoYXQgY2FzZSwgdGhvc2VcbiAqIGFzc2V0cyB3aWxsIGJlIGluIHRoZSBhcmd1bWVudCBgcmVjb3ZlcnlQdXJzZWAuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7RVJlZjxQdXJzZTxLPj59IHJlY292ZXJ5UHVyc2VcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+Pn0gc3JjUGF5bWVudFBcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBwYXltZW50QW1vdW50QVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPltdPn1cbiAqL1xuY29uc3QgICAgICAgIHNwbGl0PWFzeW5jKHJlY292ZXJ5UHVyc2Usc3JjUGF5bWVudFAscGF5bWVudEFtb3VudEEpPT57XG5jb25zdCBzcmNQYXltZW50PWF3YWl0IHNyY1BheW1lbnRQO1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNzE5MyB3aGljaCBleHBsYWlucyovXG4vKiBob3cgd2Ugd291bGQgbGlrZSB0byB3cml0ZSB0aGUgZm9sbG93aW5nIGxpbmUsIGFuZCB3aHkgd2UgY2Fubm90IHlldCBkbyBzby4qL1xuY29uc3Qgc3JjQW1vdW50PWF3YWl0IEUocmVjb3ZlcnlQdXJzZSkuZGVwb3NpdChzcmNQYXltZW50KTtcbmNvbnN0IHBheW1lbnRBbW91bnRCPUFtb3VudE1hdGguc3VidHJhY3Qoc3JjQW1vdW50LHBheW1lbnRBbW91bnRBKTtcbnJldHVybiBQcm9taXNlLmFsbChbXG5FKHJlY292ZXJ5UHVyc2UpLndpdGhkcmF3KHBheW1lbnRBbW91bnRBKSxcbkUocmVjb3ZlcnlQdXJzZSkud2l0aGRyYXcocGF5bWVudEFtb3VudEIpXSk7XG5cbiB9OyRo4oCNX29uY2Uuc3BsaXQoc3BsaXQpO1xuaGFyZGVuKHNwbGl0KTtcblxuLyoqXG4gKiBOb3RlOiBOb3QgZmFpbHVyZSBhdG9taWMuIEJ1dCBhcyBsb25nIGFzIHlvdSBkb24ndCBsb3NlIHRoZSBhcmd1bWVudFxuICogYHJlY292ZXJ5UHVyc2VgLCBubyBhc3NldHMgYXJlIGxvc3QuXG4gKiBJZiB0aGUgYW1vdW50IGluIGBzcmNQYXltZW50UGAgaXMgZXhhY3RseSB0aGUgc3VtIG9mIHRoZSBhbW91bnRzLFxuICogdGhlIHBheW1lbnQgbWF5XG4gKiBzdGlsbCBiZSBkZXBvc2l0ZWQgYW55d2F5LCBiZWZvcmUgZmFpbGluZyBpbiB0aGUgc3Vic2VxdWVudCBlcXVhbGl0eSBjaGVjay5cbiAqIEluIHRoYXQgY2FzZSwgdGhvc2VcbiAqIGFzc2V0cyB3aWxsIGJlIGluIHRoZSBhcmd1bWVudCBgcmVjb3ZlcnlQdXJzZWAuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7RVJlZjxQdXJzZTxLPj59IHJlY292ZXJ5UHVyc2VcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+Pn0gc3JjUGF5bWVudFBcbiAqIEBwYXJhbSB7QW1vdW50PEs+W119IGFtb3VudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnRbXT59XG4gKi9cbmNvbnN0ICAgICAgICBzcGxpdE1hbnk9YXN5bmMocmVjb3ZlcnlQdXJzZSxzcmNQYXltZW50UCxhbW91bnRzKT0+e1xuY29uc3Qgc3JjUGF5bWVudD1hd2FpdCBzcmNQYXltZW50UDtcbi8qIElmIHdlIGNvdWxkIGNhbGN1bGF0ZSBgdG90YWxgIGJlZm9yZSB0aGUgYGRlcG9zaXRgLCB0aGVuIHdlKi9cbi8qIGNvdWxkIHVzZSB0aGUgYHRvdGFsYCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBkZXBvc2l0YCBhbmQgYmUqL1xuLyogZmFpbHVyZSBhdG9taWMuIEJ1dCB0aGlzIHdvdWxkIHJlcXVpcmUgbWFraW5nIGFuIGVtcHR5IGFtb3VudCBmaXJzdCwqL1xuLyogd2hpY2ggaXMgcG9zc2libGUsIGJ1dCB0b28gbXVjaCB0cm91YmxlIGZvciBhIGRlcHJlY2F0ZWQgbGVnYWN5IHN1cHBvcnQqL1xuLyogbWV0aG9kLiovXG5jb25zdCBzcmNBbW91bnQ9YXdhaXQgRShyZWNvdmVyeVB1cnNlKS5kZXBvc2l0KHNyY1BheW1lbnQpO1xuY29uc3QgYnJhbmQ9c3JjQW1vdW50LmJyYW5kO1xuY29uc3QgZW1wdHlBbW91bnQ9QW1vdW50TWF0aC5tYWtlRW1wdHlGcm9tQW1vdW50KHNyY0Ftb3VudCk7XG5jb25zdCB0b3RhbD1hbW91bnRzLnJlZHVjZShcbih4LHkpPT5BbW91bnRNYXRoLmFkZCh4LHksYnJhbmQpLFxuZW1wdHlBbW91bnQpO1xuXG5BbW91bnRNYXRoLmlzRXF1YWwoc3JjQW1vdW50LHRvdGFsKXx8XG5GYWlsIGByaWdodHMgd2VyZSBub3QgY29uc2VydmVkOiAke3RvdGFsfSB2cyAke3NyY0Ftb3VudH1gO1xuXG5yZXR1cm4gUHJvbWlzZS5hbGwoYW1vdW50cy5tYXAoKGFtb3VudCk9PkUocmVjb3ZlcnlQdXJzZSkud2l0aGRyYXcoYW1vdW50KSkpO1xuIH07JGjigI1fb25jZS5zcGxpdE1hbnkoc3BsaXRNYW55KTtcbmhhcmRlbihzcGxpdE1hbnkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNsYWltIjpbImNsYWltIl0sImNvbWJpbmUiOlsiY29tYmluZSJdLCJzcGxpdCI6WyJzcGxpdCJdLCJzcGxpdE1hbnkiOlsic3BsaXRNYW55Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIDIbu6zBQAAswUAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMS9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGtleUVRLG1ha2VDb3B5QmFnLG11c3RNYXRjaCxNLGdldENvcHlCYWdFbnRyaWVzLGJhZ0lzU3VwZXJiYWcsYmFnVW5pb24sYmFnRGlzam9pbnRTdWJ0cmFjdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5QmFnXCIsIFskaOKAjV9hID0+IChtYWtlQ29weUJhZyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5QmFnRW50cmllcyA9ICRo4oCNX2EpXV0sW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjigI1fYSA9PiAoYmFnSXNTdXBlcmJhZyA9ICRo4oCNX2EpXV0sW1wiYmFnVW5pb25cIiwgWyRo4oCNX2EgPT4gKGJhZ1VuaW9uID0gJGjigI1fYSldXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChiYWdEaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q29weUJhZ30gKi9cbmNvbnN0IGVtcHR5PW1ha2VDb3B5QmFnKFtdKTtcblxuLyoqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weUJhZz59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5QmFnTWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihiYWcpPT57XG5tdXN0TWF0Y2goYmFnLE0uYmFnKCksJ2JhZyBvZiBhbW91bnQnKTtcbnJldHVybiBiYWc7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooYmFnKT0+Z2V0Q29weUJhZ0VudHJpZXMoYmFnKS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpiYWdJc1N1cGVyYmFnLFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6YmFnVW5pb24sXG5kb1N1YnRyYWN0OmJhZ0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLmNvcHlCYWdNYXRoSGVscGVycyhjb3B5QmFnTWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlCYWdNYXRoSGVscGVycyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAcediPccFAADHBQAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4xL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQga2V5RVEsbWFrZUNvcHlTZXQsbXVzdE1hdGNoLE0sZ2V0Q29weVNldEtleXMsc2V0SXNTdXBlcnNldCxzZXREaXNqb2ludFVuaW9uLHNldERpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaOKAjV9hKV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2EgPT4gKHNldElzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50VW5pb25cIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50VW5pb24gPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50U3VidHJhY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtDb3B5U2V0fSAqL1xuY29uc3QgZW1wdHk9bWFrZUNvcHlTZXQoW10pO1xuXG4vKipcbiAqIEB0eXBlIHtNYXRoSGVscGVyczxDb3B5U2V0Pn1cbiAqL1xuY29uc3QgICAgICAgIGNvcHlTZXRNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KHNldCk9Pntcbm11c3RNYXRjaChzZXQsTS5zZXQoKSwnc2V0IG9mIGFtb3VudCcpO1xucmV0dXJuIHNldDtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihzZXQpPT5nZXRDb3B5U2V0S2V5cyhzZXQpLmxlbmd0aD09PTAsXG5kb0lzR1RFOnNldElzU3VwZXJzZXQsXG5kb0lzRXF1YWw6a2V5RVEsXG5kb0FkZDpzZXREaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDpzZXREaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5U2V0TWF0aEhlbHBlcnMiOlsiY29weVNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP/csPsqBgAAKgYAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMS9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm5hdE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxpc05hdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXSxbXCJpc05hdFwiLCBbJGjigI1fYSA9PiAoaXNOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5jb25zdCBlbXB0eT0wbjtcblxuLyoqXG4gKiBGdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB1c2UgdGhlIG5hdE1hdGhIZWxwZXJzIHRvIG1hbmFnZSBiYWxhbmNlcyAtXG4gKiB0aGUgb3BlcmF0aW9ucyBhcmUgbWVyZWx5IGFyaXRobWV0aWMgb24gbmF0dXJhbCwgbm9uLW5lZ2F0aXZlXG4gKiBudW1iZXJzLlxuICpcbiAqIE5hdHVyYWwgbnVtYmVycyBhcmUgdXNlZCBmb3IgZnVuZ2libGUgZXJpZ2h0cyBzdWNoIGFzIG1vbmV5IGJlY2F1c2VcbiAqIHJvdW5kaW5nIGlzc3VlcyBtYWtlIGZsb2F0cyBwcm9ibGVtYXRpYy4gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGJlXG4gKiBkb25lIHdpdGggdGhlIHNtYWxsZXN0IHdob2xlIHVuaXQgc3VjaCB0aGF0IHRoZSBgbmF0TWF0aEhlbHBlcnNgIG5ldmVyXG4gKiBkZWFscyB3aXRoIGZyYWN0aW9uYWwgcGFydHMuXG4gKlxuICogQHR5cGUge01hdGhIZWxwZXJzPE5hdFZhbHVlPn1cbiAqL1xuY29uc3QgICAgICAgIG5hdE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobmF0KT0+e1xuLyogVE9ETzogdGlnaHRlbiB0aGUgZGVmaW5pdGlvbiBvZiBOYXQgaW4gQGFnb3JpYy9uYXQgdG8gdGhyb3cgb24gYG51bWJlcmAqL1xuYXNzZXJ0LnR5cGVvZihuYXQsJ2JpZ2ludCcpO1xuaXNOYXQobmF0KXx8RmFpbCBgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmA7XG5yZXR1cm4gTmF0KG5hdCk7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eToobmF0KT0+bmF0PT09ZW1wdHksXG5kb0lzR1RFOihsZWZ0LHJpZ2h0KT0+bGVmdD49cmlnaHQsXG5kb0lzRXF1YWw6KGxlZnQscmlnaHQpPT5sZWZ0PT09cmlnaHQsXG4vKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuZG9BZGQ6KGxlZnQscmlnaHQpPT5sZWZ0K3JpZ2h0LFxuZG9TdWJ0cmFjdDoobGVmdCxyaWdodCk9Pk5hdChsZWZ0LXJpZ2h0KX0pOyRo4oCNX29uY2UubmF0TWF0aEhlbHBlcnMobmF0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACaZmC+fBwAAnwcAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMS9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsic2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0S2V5LGVsZW1lbnRzSXNTdXBlcnNldCxlbGVtZW50c0Rpc2pvaW50VW5pb24sZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LGNvZXJjZVRvRWxlbWVudHMsZWxlbWVudHNDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChlbGVtZW50c0lzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNEaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fYSA9PiAoY29lcmNlVG9FbGVtZW50cyA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsIFskaOKAjV9hID0+IChlbGVtZW50c0NvbXBhcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIE9wZXJhdGlvbnMgZm9yIGFycmF5cyB3aXRoIHVuaXF1ZSBvYmplY3RzIGlkZW50aWZ5aW5nIGFuZCBwcm92aWRpbmcqL1xuLyogaW5mb3JtYXRpb24gYWJvdXQgZGlnaXRhbCBhc3NldHMuIFVzZWQgZm9yIFpvZSBpbnZpdGVzLiovXG4vKiogQHR5cGUge1NldFZhbHVlfSAqL1xuY29uc3QgZW1wdHk9aGFyZGVuKFtdKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlIGFycmF5LWJhc2VkIFNldE1hdGggd2l0aCBDb3B5U2V0LWJhc2VkIENvcHlTZXRNYXRoXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8U2V0VmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgc2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihsaXN0KT0+e1xubGlzdD1jb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuLyogQXNzZXJ0IHRoYXQgbGlzdCBjb250YWlucyBvbmx5Ki9cbi8qICogcGFzcy1ieS1jb3B5IHByaW1pdGl2ZXMsKi9cbi8qICogcGFzcy1ieS1jb3B5IGNvbnRhaW5lcnMgY29udGFpbmluZyBrZXlzLCovXG4vKiAqIHJlbW90YWJsZXMuKi9cbmFzc2VydEtleShsaXN0KTtcbnJldHVybiBsaXN0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGxpc3QpPT5wYXNzU3R5bGVPZihsaXN0KT09PSdjb3B5QXJyYXknJiZsaXN0Lmxlbmd0aD09PTAsXG5kb0lzR1RFOmVsZW1lbnRzSXNTdXBlcnNldCxcbmRvSXNFcXVhbDooeCx5KT0+ZWxlbWVudHNDb21wYXJlKHgseSk9PT0wLFxuZG9BZGQ6ZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDplbGVtZW50c0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLnNldE1hdGhIZWxwZXJzKHNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRNYXRoSGVscGVycyI6WyJzZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACwOKgfpQQAAKUEAAAjAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjEvc3JjL3BheW1lbnQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHByZXBhcmVFeG9DbGFzczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBQYXltZW50SVxuICogQHJldHVybnMgeygpID0+IFBheW1lbnQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUGF5bWVudEtpbmQ9KGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk9PntcbmNvbnN0IG1ha2VQYXltZW50PXByZXBhcmVFeG9DbGFzcyhcbmlzc3VlckJhZ2dhZ2UsXG4gYCR7bmFtZX0gcGF5bWVudGAsXG5QYXltZW50SSxcbmluaXRFbXB0eSxcbntcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH19KTtcblxuXG5yZXR1cm4gbWFrZVBheW1lbnQ7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQYXltZW50S2luZChwcmVwYXJlUGF5bWVudEtpbmQpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50S2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRLaW5kIjpbInByZXBhcmVQYXltZW50S2luZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAP1+ju6zEAAOsxAAApAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjEvc3JjL3BheW1lbnRMZWRnZXIuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9wYXltZW50LmpzIiwiLi9wdXJzZS5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLG11c3RNYXRjaCxNLGtleUVRLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHByZXBhcmVFeG8scHJvdmlkZSxBbW91bnRNYXRoLHByZXBhcmVQYXltZW50S2luZCxwcmVwYXJlUHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9cIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG8gPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudC5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRLaW5kXCIsIFskaOKAjV9hID0+IChwcmVwYXJlUGF5bWVudEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1wicHJlcGFyZVB1cnNlS2luZFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZVB1cnNlS2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLCBbJGjigI1fYSA9PiAoQnJhbmRJID0gJGjigI1fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLCBbJGjigI1fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKi9cbmNvbnN0IGFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZT0oYnJhbmQsYXNzZXRLaW5kLGVsZW1lbnRTaGFwZSk9PntcbmxldCB2YWx1ZVNoYXBlO1xuc3dpdGNoKGFzc2V0S2luZCl7XG5jYXNlJ25hdCc6e1xudmFsdWVTaGFwZT1NLm5hdCgpO1xuZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkfHxcbkZhaWwgYEZ1bmdpYmxlIGFzc2V0cyBjYW5ub3QgaGF2ZSBhbiBlbGVtZW50U2hhcGU6ICR7cShlbGVtZW50U2hhcGUpfWA7XG5icmVhaztcbiB9XG5jYXNlJ3NldCc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmFycmF5T2YoTS5hbmQoTS5rZXkoKSxlbGVtZW50U2hhcGUpKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlTZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uc2V0KCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uc2V0T2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYmFnKCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uYmFnT2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbkZhaWwgYHVuZXhwZWN0ZWQgYXNzZXQga2luZCAke3EoYXNzZXRLaW5kKX1gO1xuIH19XG5cblxuY29uc3QgYW1vdW50U2hhcGU9aGFyZGVuKHtcbmJyYW5kLC8qIG1hdGNoZXMgb25seSB0aGlzIGV4YWN0IGJyYW5kKi9cbnZhbHVlOnZhbHVlU2hhcGV9KTtcblxucmV0dXJuIGFtb3VudFNoYXBlO1xuIH07XG5cbi8qKlxuICogTWFrZSB0aGUgcGF5bWVudExlZGdlciwgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGJhbGFuY2VzIG9mXG4gKiBwYXltZW50cy4gQWxsIG1pbnRpbmcgYW5kIHRyYW5zZmVyIGF1dGhvcml0eSBvcmlnaW5hdGVzIGhlcmUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge0Rpc3BsYXlJbmZvPEs+fSBkaXNwbGF5SW5mb1xuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdXG4gKiBAcmV0dXJucyB7UGF5bWVudExlZGdlcjxLPn1cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVQYXltZW50TGVkZ2VyPShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5lbGVtZW50U2hhcGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuLyoqIEB0eXBlIHtCcmFuZDxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIGNhbGxXaGVuKi9cbmNvbnN0IGJyYW5kPXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gYnJhbmRgLEJyYW5kSSx7XG5pc015SXNzdWVyKGFsbGVnZWRJc3N1ZXIpe1xuLyogQnJhbmRJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBhbGxlZ2VkSXNzdWVyYCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gYWxsZWdlZElzc3Vlcj09PWlzc3VlcjtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG4vKiBHaXZlIGluZm9ybWF0aW9uIHRvIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuKi9cbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbmdldEFtb3VudFNoYXBlKCl7XG5yZXR1cm4gYW1vdW50U2hhcGU7XG4gfX0pO1xuXG5cbmNvbnN0IGFtb3VudFNoYXBlPWFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZShcbmJyYW5kLFxuYXNzZXRLaW5kLFxuZWxlbWVudFNoYXBlKTtcblxuXG5jb25zdHtJc3N1ZXJJLE1pbnRJLFBheW1lbnRJLFB1cnNlSUtpdH09bWFrZUlzc3VlckludGVyZmFjZXMoXG5icmFuZCxcbmFzc2V0S2luZCxcbmFtb3VudFNoYXBlKTtcblxuXG5jb25zdCBtYWtlUGF5bWVudD1wcmVwYXJlUGF5bWVudEtpbmQoaXNzdWVyQmFnZ2FnZSxuYW1lLGJyYW5kLFBheW1lbnRJKTtcblxuLyoqIEB0eXBlIHtTaHV0ZG93bldpdGhGYWlsdXJlfSAqL1xuY29uc3Qgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZT0ocmVhc29uKT0+e1xuLyogVE9ETyBUaGlzIHNob3VsZCBhbHNvIGRlc3Ryb3kgbGVkZ2VyIHN0YXRlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0Ki9cbmlmKG9wdFNodXRkb3duV2l0aEZhaWx1cmUhPT11bmRlZmluZWQpe1xudHJ5e1xub3B0U2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pO1xuIH1jYXRjaChlcnJJblNodXRkb3duKXtcbmFzc2VydC5ub3RlKGVyckluU2h1dGRvd24sWCBgQ2F1c2VkIGJ5OiAke3JlYXNvbn1gKTtcbnRocm93IGVyckluU2h1dGRvd247XG4gfVxuIH1cbnRocm93IHJlYXNvbjtcbiB9O1xuXG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBBbW91bnQ+fSAqL1xuY29uc3QgcGF5bWVudExlZGdlcj1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShcbmlzc3VlckJhZ2dhZ2UsXG4ncGF5bWVudExlZGdlcicsXG57dmFsdWVTaGFwZTphbW91bnRTaGFwZX0pO1xuXG5cbi8qKlxuICogQSB3aXRoZHJhd24gbGl2ZSBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjb3Zlcnkgc2V0IG9mXG4gKiB0aGUgcHVyc2UgaXQgd2FzIHdpdGhkcmF3biBmcm9tLiBMZXQncyBjYWxsIHRoZXNlIFwicmVjb3ZlcmFibGVcIlxuICogcGF5bWVudHMuIEFsbCByZWNvdmVyYWJsZSBwYXltZW50cyBhcmUgbGl2ZSwgYnV0IG5vdCBhbGwgbGl2ZVxuICogcGF5bWVudHMgYXJlIHJlY292ZXJhYmxlLiBXZSBkbyB0aGUgYm9va2tlZXBpbmcgZm9yIHBheW1lbnQgcmVjb3ZlcnlcbiAqIHdpdGggdGhpcyB3ZWFrbWFwIGZyb20gcmVjb3ZlcmFibGUgcGF5bWVudHMgdG8gdGhlIHJlY292ZXJ5IHNldCB0aGV5IGFyZVxuICogaW4uXG4gKiBBIGJ1bmNoIG9mIGludGVyZXN0aW5nIGludmFyaWFudHMgaGVyZTpcbiAqICAgICogRXZlcnkgcGF5bWVudCB0aGF0IGlzIGEga2V5IGluIHRoZSBvdXRlciBgcGF5bWVudFJlY292ZXJ5U2V0c2BcbiAqICAgICAgd2Vha01hcCBpcyBhbHNvIGluIHRoZSByZWNvdmVyeSBzZXQgaW5kZXhlZCBieSB0aGF0IHBheW1lbnQuXG4gKiAgICAqIEltcGxpZWQgYnkgdGhlIGFib3ZlIGJ1dCB3b3J0aCBzdGF0aW5nOiB0aGUgcGF5bWVudCBpcyBvbmx5XG4gKiAgICAgIGluIGF0IG1vc3Qgb25lIHJlY292ZXJ5IHNldC5cbiAqICAgICogQSByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBzdWNoIHBheW1lbnRzLlxuICogICAgKiBFdmVyeSBwdXJzZSBpcyBhc3NvY2lhdGVkIHdpdGggZXhhY3RseSBvbmUgcmVjb3Zlcnkgc2V0IHVuaXF1ZSB0b1xuICogICAgICBpdC5cbiAqICAgICogQSBwdXJzZSdzIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tXG4gKiAgICAgIHRoYXQgcHVyc2UgYW5kIG5vdCB5ZXQgY29uc3VtZWQuXG4gKlxuICogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBTZXRTdG9yZTxQYXltZW50Pj59XG4gKi9cbmNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHM9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRSZWNvdmVyeVNldHMnKTtcblxuXG4vKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgaW5pdFBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmluaXRgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtTZXRTdG9yZTxQYXltZW50Pn0gW29wdFJlY292ZXJ5U2V0XVxuICovXG5jb25zdCBpbml0UGF5bWVudD0ocGF5bWVudCxhbW91bnQsb3B0UmVjb3ZlcnlTZXQ9dW5kZWZpbmVkKT0+e1xuaWYob3B0UmVjb3ZlcnlTZXQhPT11bmRlZmluZWQpe1xub3B0UmVjb3ZlcnlTZXQuYWRkKHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5pbml0KHBheW1lbnQsb3B0UmVjb3ZlcnlTZXQpO1xuIH1cbnBheW1lbnRMZWRnZXIuaW5pdChwYXltZW50LGFtb3VudCk7XG4gfTtcblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGRlbGV0ZVBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmRlbGV0ZWAuXG4gKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKi9cbmNvbnN0IGRlbGV0ZVBheW1lbnQ9KHBheW1lbnQpPT57XG5wYXltZW50TGVkZ2VyLmRlbGV0ZShwYXltZW50KTtcbmlmKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKXtcbmNvbnN0IHJlY292ZXJ5U2V0PXBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG5yZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gfVxuIH07XG5cbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IGFkZD0obGVmdCxyaWdodCk9PkFtb3VudE1hdGguYWRkKGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsobGVmdDogQW1vdW50LCByaWdodDogQW1vdW50KSA9PiBBbW91bnQgfSAqL1xuY29uc3Qgc3VidHJhY3Q9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLnN1YnRyYWN0KGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsoYWxsZWdlZEFtb3VudDogQW1vdW50KSA9PiBBbW91bnR9ICovXG5jb25zdCBjb2VyY2U9KGFsbGVnZWRBbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbGxlZ2VkQW1vdW50KTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gYm9vbGVhbiB9ICovXG5cbi8qKlxuICogTWV0aG9kcyBsaWtlIGRlcG9zaXQoKSBoYXZlIGFuIG9wdGlvbmFsIHNlY29uZCBwYXJhbWV0ZXJcbiAqIGBvcHRBbW91bnRTaGFwZWBcbiAqIHdoaWNoLCBpZiBwcmVzZW50LCBpcyBzdXBwb3NlZCB0byBtYXRjaCB0aGUgYmFsYW5jZSBvZiB0aGVcbiAqIHBheW1lbnQuIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGRvZXMgdGhhdCBjaGVjay5cbiAqXG4gKiBOb3RlOiBgb3B0QW1vdW50U2hhcGVgIGlzIHVzZXItc3VwcGxpZWQgd2l0aCBubyBwcmV2aW91cyB2YWxpZGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBwYXltZW50QmFsYW5jZVxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgYXNzZXJ0QW1vdW50Q29uc2lzdGVudD0ocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpPT57XG5pZihvcHRBbW91bnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2gocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUsJ2Ftb3VudCcpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydExpdmVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5oYXMocGF5bWVudCl8fFxuRmFpbCBgJHtwYXltZW50fSB3YXMgbm90IGEgbGl2ZSBwYXltZW50IGZvciBicmFuZCAke3EoXG5icmFuZClcbiB9LiBJdCBjb3VsZCBiZSBhIHVzZWQtdXAgcGF5bWVudCwgYSBwYXltZW50IGZvciBhbm90aGVyIGJyYW5kLCBvciBpdCBtaWdodCBub3QgYmUgYSBwYXltZW50IGF0IGFsbC5gO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2UuZGVwb3NpdFxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSBkZXBvc2l0XG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtQYXltZW50fSBzcmNQYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cbmNvbnN0IGRlcG9zaXRJbnRlcm5hbD0oXG5jdXJyZW50QmFsYW5jZSxcbnVwZGF0ZVB1cnNlQmFsYW5jZSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZT11bmRlZmluZWQpPT5cbntcbiFpc1Byb21pc2Uoc3JjUGF5bWVudCl8fFxuYXNzZXJ0LmZhaWwoXG4gYGRlcG9zaXQgZG9lcyBub3QgYWNjZXB0IHByb21pc2VzIGFzIGZpcnN0IGFyZ3VtZW50LiBJbnN0ZWFkIG9mIHBhc3NpbmcgdGhlIHByb21pc2UgKGRlcG9zaXQocGF5bWVudFByb21pc2UpKSwgY29uc2lkZXIgdW53cmFwcGluZyB0aGUgcHJvbWlzZSBmaXJzdDogRS53aGVuKHBheW1lbnRQcm9taXNlLCAoYWN0dWFsUGF5bWVudCA9PiBkZXBvc2l0KGFjdHVhbFBheW1lbnQpKWAsXG5UeXBlRXJyb3IpO1xuXG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChzcmNQYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG5jb25zdCBuZXdQdXJzZUJhbGFuY2U9YWRkKHNyY1BheW1lbnRCYWxhbmNlLGN1cnJlbnRCYWxhbmNlKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCovXG4vKiBNb3ZlIHRoZSBhc3NldHMgaW4gYHNyY1BheW1lbnRgIGludG8gdGhpcyBwdXJzZSwgdXNpbmcgdXAgdGhlKi9cbi8qIHNvdXJjZSBwYXltZW50LCBzdWNoIHRoYXQgdG90YWwgYXNzZXRzIGFyZSBjb25zZXJ2ZWQuKi9cbmRlbGV0ZVBheW1lbnQoc3JjUGF5bWVudCk7XG51cGRhdGVQdXJzZUJhbGFuY2UobmV3UHVyc2VCYWxhbmNlKTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gfTtcblxuLyoqXG4gKiBVc2VkIGJ5IHRoZSBwdXJzZSBjb2RlIHRvIGltcGxlbWVudCBwdXJzZS53aXRoZHJhd1xuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSB3aXRoZHJhd2FsXG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudCAtIHRoZSBhbW91bnQgdG8gYmUgd2l0aGRyYXduXG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSByZWNvdmVyeVNldFxuICogQHJldHVybnMge1BheW1lbnR9XG4gKi9cbmNvbnN0IHdpdGhkcmF3SW50ZXJuYWw9KFxuY3VycmVudEJhbGFuY2UsXG51cGRhdGVQdXJzZUJhbGFuY2UsXG5hbW91bnQsXG5yZWNvdmVyeVNldCk9Plxue1xuYW1vdW50PWNvZXJjZShhbW91bnQpO1xuQW1vdW50TWF0aC5pc0dURShjdXJyZW50QmFsYW5jZSxhbW91bnQpfHxcbkZhaWwgYFdpdGhkcmF3YWwgb2YgJHthbW91bnR9IGZhaWxlZCBiZWNhdXNlIHRoZSBwdXJzZSBvbmx5IGNvbnRhaW5lZCAke2N1cnJlbnRCYWxhbmNlfWA7XG5jb25zdCBuZXdQdXJzZUJhbGFuY2U9c3VidHJhY3QoY3VycmVudEJhbGFuY2UsYW1vdW50KTtcblxuY29uc3QgcGF5bWVudD1tYWtlUGF5bWVudCgpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5UIE1vdmUgdGhlIHdpdGhkcmF3biBhc3NldHMgZnJvbSB0aGlzIHB1cnNlIGludG8qL1xuLyogcGF5bWVudC4gVG90YWwgYXNzZXRzIG11c3QgcmVtYWluIGNvbnNlcnZlZC4qL1xudXBkYXRlUHVyc2VCYWxhbmNlKG5ld1B1cnNlQmFsYW5jZSk7XG5pbml0UGF5bWVudChwYXltZW50LGFtb3VudCxyZWNvdmVyeVNldCk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHBheW1lbnQ7XG4gfTtcblxuY29uc3QgbWFrZUVtcHR5UHVyc2U9cHJlcGFyZVB1cnNlS2luZChcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuYnJhbmQsXG5QdXJzZUlLaXQsXG5oYXJkZW4oe1xuZGVwb3NpdEludGVybmFsLFxud2l0aGRyYXdJbnRlcm5hbH0pKTtcblxuXG5cbi8qKiBAdHlwZSB7SXNzdWVyPEs+fSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IGR1ZSB0byBjYWxsV2hlbiBkaXNjcmVwYW5jeSovXG5jb25zdCBpc3N1ZXI9cHJlcGFyZUV4byhpc3N1ZXJCYWdnYWdlLCBgJHtuYW1lfSBpc3N1ZXJgLElzc3Vlckkse1xuZ2V0QnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG5nZXRBc3NldEtpbmQoKXtcbnJldHVybiBhc3NldEtpbmQ7XG4gfSxcbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbm1ha2VFbXB0eVB1cnNlKCl7XG5yZXR1cm4gbWFrZUVtcHR5UHVyc2UoKTtcbiB9LFxuLyoqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudCBhd2FpdGVkIGJ5IGNhbGxXaGVuICovXG5pc0xpdmUocGF5bWVudCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gcGF5bWVudExlZGdlci5oYXMocGF5bWVudCk7XG4gfSxcbi8qKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlbiAqL1xuZ2V0QW1vdW50T2YocGF5bWVudCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbnJldHVybiBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiB9LFxuLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlblxuICogQHBhcmFtIHtQYXR0ZXJufSBvcHRBbW91bnRTaGFwZVxuICovXG5idXJuKHBheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbmFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xuY29uc3QgcGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVC4qL1xuZGVsZXRlUGF5bWVudChwYXltZW50KTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gcGF5bWVudEJhbGFuY2U7XG4gfX0pO1xuXG5cbi8qKlxuICogUHJvdmlkZXMgZm9yIHRoZSByZWNvdmVyeSBvZiBuZXdseSBtaW50ZWQgYnV0IG5vdC15ZXQtZGVwb3NpdGVkIHBheW1lbnRzLlxuICpcbiAqIEJlY2F1c2UgdGhlIGBtaW50UmVjb3ZlcnlQdXJzZWAgaXMgcGxhY2VkIGluIGJhZ2dhZ2UsIGV2ZW4gaWYgdGhlXG4gKiBjYWxsZXIgb2YgYG1ha2VJc3N1ZXJLaXRgIGRyb3BzIGl0IG9uIHRoZSBmbG9vciwgaXQgY2FuIHN0aWxsIGJlXG4gKiByZWNvdmVyZWQgaW4gYW4gZW1lcmdlbmN5IHVwZ3JhZGUuXG4gKlxuICogQHR5cGUge1B1cnNlPEs+fVxuICovXG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZT1wcm92aWRlKGlzc3VlckJhZ2dhZ2UsJ21pbnRSZWNvdmVyeVB1cnNlJywoKT0+XG5tYWtlRW1wdHlQdXJzZSgpKTtcblxuXG4vKiogQHR5cGUge01pbnQ8Sz59ICovXG5jb25zdCBtaW50PXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gbWludGAsTWludEkse1xuZ2V0SXNzdWVyKCl7XG5yZXR1cm4gaXNzdWVyO1xuIH0sXG5taW50UGF5bWVudChuZXdBbW91bnQpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjaGVja2VkIGNhc3QqL1xubmV3QW1vdW50PWNvZXJjZShuZXdBbW91bnQpO1xubXVzdE1hdGNoKG5ld0Ftb3VudCxhbW91bnRTaGFwZSwnbWludGVkIGFtb3VudCcpO1xuLyogYHJhd1BheW1lbnRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHJlY292ZXJ5IHNldCwgYW5kKi9cbi8qIHNvIG11c3Qgbm90IGVzY2FwZS4qL1xuY29uc3QgcmF3UGF5bWVudD1tYWtlUGF5bWVudCgpO1xuaW5pdFBheW1lbnQocmF3UGF5bWVudCxuZXdBbW91bnQsdW5kZWZpbmVkKTtcblxuY29uc3QgbWludFJlY292ZXJ5UHVyc2VCZWZvcmU9bWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xubWludFJlY292ZXJ5UHVyc2UuZGVwb3NpdChyYXdQYXltZW50LG5ld0Ftb3VudCk7XG5jb25zdCBwYXltZW50PW1pbnRSZWNvdmVyeVB1cnNlLndpdGhkcmF3KG5ld0Ftb3VudCk7XG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyPW1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbmFzc2VydChrZXlFUShtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSxtaW50UmVjb3ZlcnlQdXJzZUFmdGVyKSk7XG5yZXR1cm4gcGF5bWVudDtcbiB9fSk7XG5cblxuY29uc3QgaXNzdWVyS2l0PWhhcmRlbih7aXNzdWVyLG1pbnQsYnJhbmQsbWludFJlY292ZXJ5UHVyc2V9KTtcbnJldHVybiBpc3N1ZXJLaXQ7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQYXltZW50TGVkZ2VyKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudExlZGdlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRMZWRnZXIiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAokVFQsAPAADADwAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4xL3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUHVyc2VLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0scHJlcGFyZUV4b0NsYXNzS2l0LG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxBbW91bnRNYXRoLG1ha2VUcmFuc2llbnROb3RpZmllcktpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyQmlnU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiLi90cmFuc2llbnROb3RpZmllci5qc1wiLCBbW1wibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgcHJlcGFyZVB1cnNlS2luZD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxucHVyc2VNZXRob2RzKT0+XG57XG5jb25zdCBhbW91bnRTaGFwZT1icmFuZC5nZXRBbW91bnRTaGFwZSgpO1xuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3R7cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZTp1cGRhdGVCYWxhbmNlfT1tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQoKTtcblxuY29uc3QgdXBkYXRlUHVyc2VCYWxhbmNlPShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UscHVyc2UpPT57XG5zdGF0ZS5jdXJyZW50QmFsYW5jZT1uZXdQdXJzZUJhbGFuY2U7XG51cGRhdGVCYWxhbmNlKHB1cnNlLHB1cnNlLmdldEN1cnJlbnRBbW91bnQoKSk7XG4gfTtcblxuLyogLSBUaGlzIGtpbmQgaXMgYSBwYWlyIG9mIHB1cnNlIGFuZCBkZXBvc2l0RmFjZXQgdGhhdCBoYXZlIGEgMToxKi9cbi8qIGNvcnJlc3BvbmRlbmNlLiovXG4vKiAtIFRoZXkgYXJlIHZpcnR1YWxpemVkIHRvZ2V0aGVyIHRvIHNoYXJlIGEgc2luZ2xlIHN0YXRlIHJlY29yZC4qL1xuLyogLSBBbiBhbHRlcm5hdGl2ZSBkZXNpZ24gY29uc2lkZXJlZCB3YXMgdG8gaGF2ZSB0aGlzIHJldHVybiBhIFB1cnNlIGFsb25lKi9cbi8qIHRoYXQgY3JlYXRlZCBkZXBvc2l0RmFjZXQgYXMgbmVlZGVkLiBCdXQgdGhpcyBhcHByb2FjaCBlbnN1cmVzIGEgY29uc3RhbnQqL1xuLyogaWRlbnRpdHkgZm9yIHRoZSBmYWNldCBhbmQgZXhlcmNpc2VzIHRoZSBtdWx0aS1mYWNldGVkIG9iamVjdCBzdHlsZS4qL1xuY29uc3R7ZGVwb3NpdEludGVybmFsLHdpdGhkcmF3SW50ZXJuYWx9PXB1cnNlTWV0aG9kcztcbmNvbnN0IG1ha2VQdXJzZUtpdD1wcmVwYXJlRXhvQ2xhc3NLaXQoXG5pc3N1ZXJCYWdnYWdlLFxuIGAke25hbWV9IFB1cnNlYCxcblB1cnNlSUtpdCxcbigpPT57XG5jb25zdCBjdXJyZW50QmFsYW5jZT1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuXG4vKiogQHR5cGUge1NldFN0b3JlPFBheW1lbnQ+fSAqL1xuY29uc3QgcmVjb3ZlcnlTZXQ9bWFrZVNjYWxhckJpZ1NldFN0b3JlKCdyZWNvdmVyeSBzZXQnLHtcbmR1cmFibGU6dHJ1ZX0pO1xuXG5cbnJldHVybntcbmN1cnJlbnRCYWxhbmNlLFxucmVjb3ZlcnlTZXR9O1xuXG4gfSxcbntcbnB1cnNlOntcbmRlcG9zaXQoc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbi8qIFNlZSB0aGUgY29tbWVudHMgb24gUHVyc2VJLmRlcG9zaXQgaW4gdHlwZUd1YXJkcy5qcyovXG5jb25zdHtzdGF0ZX09dGhpcztcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBkZXBvc2l0LiovXG5yZXR1cm4gZGVwb3NpdEludGVybmFsKFxuc3RhdGUuY3VycmVudEJhbGFuY2UsXG4obmV3UHVyc2VCYWxhbmNlKT0+XG51cGRhdGVQdXJzZUJhbGFuY2Uoc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHRoaXMuZmFjZXRzLnB1cnNlKSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZSk7XG5cbiB9LFxud2l0aGRyYXcoYW1vdW50KXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIHdpdGhkcmF3LiovXG5yZXR1cm4gd2l0aGRyYXdJbnRlcm5hbChcbnN0YXRlLmN1cnJlbnRCYWxhbmNlLFxuKG5ld1B1cnNlQmFsYW5jZSk9PlxudXBkYXRlUHVyc2VCYWxhbmNlKHN0YXRlLG5ld1B1cnNlQmFsYW5jZSx0aGlzLmZhY2V0cy5wdXJzZSksXG5hbW91bnQsXG5zdGF0ZS5yZWNvdmVyeVNldCk7XG5cbiB9LFxuZ2V0Q3VycmVudEFtb3VudCgpe1xucmV0dXJuIHRoaXMuc3RhdGUuY3VycmVudEJhbGFuY2U7XG4gfSxcbmdldEN1cnJlbnRBbW91bnROb3RpZmllcigpe1xucmV0dXJuIHByb3ZpZGVOb3RpZmllcih0aGlzLmZhY2V0cy5wdXJzZSk7XG4gfSxcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH0sXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuZ2V0RGVwb3NpdEZhY2V0KCl7XG5yZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdEZhY2V0O1xuIH0sXG5cbmdldFJlY292ZXJ5U2V0KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5yZWNvdmVyeVNldC5zbmFwc2hvdCgpO1xuIH0sXG5yZWNvdmVyQWxsKCl7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5sZXQgYW1vdW50PUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5mb3IoY29uc3QgcGF5bWVudCBvZiBzdGF0ZS5yZWNvdmVyeVNldC5rZXlzKCkpe1xuLyogVGhpcyBkb2VzIGNhdXNlIGRlbGV0aW9ucyBmcm9tIHRoZSBzZXQgd2hpbGUgaXRlcmF0aW5nLCovXG4vKiBidXQgdGhpcyBzcGVjaWFsIGNhc2UgaXMgYWxsb3dlZC4qL1xuY29uc3QgZGVsdGE9ZmFjZXRzLnB1cnNlLmRlcG9zaXQocGF5bWVudCk7XG5hbW91bnQ9QW1vdW50TWF0aC5hZGQoYW1vdW50LGRlbHRhLGJyYW5kKTtcbiB9XG5zdGF0ZS5yZWNvdmVyeVNldC5nZXRTaXplKCk9PT0wfHxcbkZhaWwgYGludGVybmFsOiBSZW1haW5pbmcgdW5yZWNvdmVyZWQgcGF5bWVudHM6ICR7ZmFjZXRzLnB1cnNlLmdldFJlY292ZXJ5U2V0KCl9YDtcbnJldHVybiBhbW91bnQ7XG4gfX0sXG5cbmRlcG9zaXRGYWNldDp7XG5yZWNlaXZlKC4uLmFyZ3Mpe1xucmV0dXJuIHRoaXMuZmFjZXRzLnB1cnNlLmRlcG9zaXQoLi4uYXJncyk7XG4gfX19LFxuXG5cbntcbnN0YXRlU2hhcGU6e1xuY3VycmVudEJhbGFuY2U6YW1vdW50U2hhcGUsXG5yZWNvdmVyeVNldDpNLnJlbW90YWJsZSgncmVjb3ZlcnlTZXQnKX19KTtcblxuXG5cbnJldHVybigpPT5tYWtlUHVyc2VLaXQoKS5wdXJzZTtcbiB9OyRo4oCNX29uY2UucHJlcGFyZVB1cnNlS2luZChwcmVwYXJlUHVyc2VLaW5kKTtcbmhhcmRlbihwcmVwYXJlUHVyc2VLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUHVyc2VLaW5kIjpbInByZXBhcmVQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALkljqRQGAAAUBgAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4xL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxwcm92aWRlTGF6eSxtYWtlTm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3QgICAgICAgIG1ha2VUcmFuc2llbnROb3RpZmllcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UHVyc2UsIE5vdGlmaWVyUmVjb3JkPGFueT4+fSAqL1xuY29uc3QgdHJhbnNpZW50Tm90aWZlcktpdHM9bWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShcbid0cmFuc2llbnROb3RpZmVyS2l0cycpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcktpdD0oa2V5KT0+XG5wcm92aWRlTGF6eSh0cmFuc2llbnROb3RpZmVyS2l0cyxrZXksKCk9PlxubWFrZU5vdGlmaWVyS2l0KGtleS5nZXRDdXJyZW50QW1vdW50KCkpKTtcblxuXG5jb25zdCBwcm92aWRlTm90aWZpZXI9KGtleSk9PnByb3ZpZGVOb3RpZmllcktpdChrZXkpLm5vdGlmaWVyO1xuY29uc3QgdXBkYXRlPShrZXksbmV3VmFsdWUpPT57XG5pZih0cmFuc2llbnROb3RpZmVyS2l0cy5oYXMoa2V5KSl7XG5jb25zdHt1cGRhdGVyfT10cmFuc2llbnROb3RpZmVyS2l0cy5nZXQoa2V5KTtcbnVwZGF0ZXIudXBkYXRlU3RhdGUobmV3VmFsdWUpO1xuIH1cbiB9O1xuXG5yZXR1cm57cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZX07XG4gfTskaOKAjV9vbmNlLm1ha2VUcmFuc2llbnROb3RpZmllcktpdChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xuaGFyZGVuKG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0IjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAo7p4+EicAABInAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjEvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIkFtb3VudFNoYXBlIiwiQXNzZXRLaW5kU2hhcGUiLCJCcmFuZEkiLCJCcmFuZFNoYXBlIiwiRGVwb3NpdEZhY2V0U2hhcGUiLCJEaXNwbGF5SW5mb1NoYXBlIiwiSXNzdWVyS2l0U2hhcGUiLCJJc3N1ZXJTaGFwZSIsIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyIsIk1pbnRTaGFwZSIsIk5vdGlmaWVyU2hhcGUiLCJQYXltZW50U2hhcGUiLCJQdXJzZVNoYXBlIiwiUmF0aW9TaGFwZSIsImlzQ29weUJhZ1ZhbHVlIiwiaXNDb3B5U2V0VmFsdWUiLCJpc05hdFZhbHVlIiwiaXNTZXRWYWx1ZSIsIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0sbWF0Y2hlczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdCAgICAgICAgQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgnQnJhbmQnKTskaOKAjV9vbmNlLkJyYW5kU2hhcGUoQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgSXNzdWVyU2hhcGU9TS5yZW1vdGFibGUoJ0lzc3VlcicpOyRo4oCNX29uY2UuSXNzdWVyU2hhcGUoSXNzdWVyU2hhcGUpO1xuY29uc3QgICAgICAgIFBheW1lbnRTaGFwZT1NLnJlbW90YWJsZSgnUGF5bWVudCcpOyRo4oCNX29uY2UuUGF5bWVudFNoYXBlKFBheW1lbnRTaGFwZSk7XG5jb25zdCAgICAgICAgUHVyc2VTaGFwZT1NLnJlbW90YWJsZSgnUHVyc2UnKTskaOKAjV9vbmNlLlB1cnNlU2hhcGUoUHVyc2VTaGFwZSk7XG5jb25zdCAgICAgICAgRGVwb3NpdEZhY2V0U2hhcGU9TS5yZW1vdGFibGUoJ0RlcG9zaXRGYWNldCcpOyRo4oCNX29uY2UuRGVwb3NpdEZhY2V0U2hhcGUoRGVwb3NpdEZhY2V0U2hhcGUpO1xuY29uc3QgICAgICAgIE5vdGlmaWVyU2hhcGU9TS5yZW1vdGFibGUoJ05vdGlmaWVyJyk7JGjigI1fb25jZS5Ob3RpZmllclNoYXBlKE5vdGlmaWVyU2hhcGUpO1xuY29uc3QgICAgICAgIE1pbnRTaGFwZT1NLnJlbW90YWJsZSgnTWludCcpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBOYXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0IGlzXG4gKiBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGF0IG1hbnkgdW5pdHMgb2YgdGhlXG4gKiBmdW5naWJsZSBhc3NldCByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudC4gVGhlIGJyYW5kIG9mIHRoYXQgYW1vdW50XG4gKiBzaG91bGQgaW5kZWVkIHJlcHJlc2VudCBhIGtpbmQgb2YgYXNzZXQgY29uc2lzdGluZyBvZiBhIGNvdW50YWJsZVxuICogc2V0IG9mIGZ1bmdpYmxlIHVuaXRzLlxuICovJGjigI1fb25jZS5NaW50U2hhcGUoTWludFNoYXBlKTtcbmNvbnN0IE5hdFZhbHVlU2hhcGU9TS5uYXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weVNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weVNldCwgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhvc2VcbiAqIGtleXMsIHdoZXJlIGVhY2gga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIG5vbi1mdW5naWJsZVxuICogaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LCBmcm9tIHRoZSBub24tZnVuZ2libGUgYXNzZXQgY2xhc3NcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBhbW91bnQgaXRzZWxmIHJlcHJlc2VudHNcbiAqIHRoZSBzZXQgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWQgdG8gYW55IG9mIHRoZSBvdGhlciBpdGVtc1xuICogZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlXG4gKiB0aGF0IHdlIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0XG4gKiB0aGUgY29kZSB0aGF0IGhvbGRzIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoYXQgYnJhbmQsIG9ubHkgbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0c1xuICogb2YgdGhhdCBhc3NldCBjbGFzcyBhcyBkZWZpbmVkIGJ5IGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyXG4gKiBhbiBhbW91bnQgZXhwcmVzc2luZywgZm9yIGV4YW1wbGUsIHRoYXQgdGhleSBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXRcbiAqIHdpbGwgbmV2ZXIgYmUgbWludGVkLiBUaGF0IHdhbnQgd2lsbCBuZXZlciBiZSBzYXRpc2ZpZWQuXG4gKiBcIllvdSBjYW4ndCBhbHdheXMgZ2V0Li4uXCJcbiAqL1xuY29uc3QgQ29weVNldFZhbHVlU2hhcGU9TS5zZXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgU2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QXJyYXkgb2YgcGFzc2FibGUgS2V5cy4gVGhpcyByZXByZXNlbnRhdGlvbiBpcyBkZXByZWNhdGVkLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogQ29weVNldFZhbHVlcy5cbiAqL1xuY29uc3QgU2V0VmFsdWVTaGFwZT1NLmFycmF5T2YoTS5rZXkoKSk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlCYWdWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlCYWcsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgYmFnIChtdWx0aXNldCkgb2YgdGhvc2VcbiAqIGtleXMsIHdoZXJlIGVhY2gga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIHNlbWktZnVuZ2libGVcbiAqIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCwgZnJvbSB0aGUgc2VtaS1mdW5naWJsZSBhc3NldCBjbGFzc1xuICogcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGtleVxuICogYXBwZWFycyBpbiB0aGUgYmFnIGlzIHRoZSBudW1iZXIgb2YgZnVuZ2libGUgdW5pdHMgb2YgdGhhdCBrZXkuXG4gKiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzXG4gKiB0aGUgYmFnIG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXNcbiAqIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZVxuICogdGhhdCB3ZSBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdFxuICogdGhlIGNvZGUgdGhhdCBob2xkcyB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGF0IGJyYW5kLCBvbmx5IG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHNcbiAqIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieSBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlclxuICogYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXkgXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0XG4gKiB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmUgc2F0aXNmaWVkLlxuICogXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlCYWdWYWx1ZVNoYXBlPU0uYmFnKCk7XG5cbmNvbnN0IEFtb3VudFZhbHVlU2hhcGU9TS5vcihcbk5hdFZhbHVlU2hhcGUsXG5Db3B5U2V0VmFsdWVTaGFwZSxcblNldFZhbHVlU2hhcGUsXG5Db3B5QmFnVmFsdWVTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEFtb3VudFNoYXBlPWhhcmRlbih7XG5icmFuZDpCcmFuZFNoYXBlLFxudmFsdWU6QW1vdW50VmFsdWVTaGFwZX0pOyRo4oCNX29uY2UuQW1vdW50U2hhcGUoQW1vdW50U2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBSYXRpb1NoYXBlPWhhcmRlbih7XG5udW1lcmF0b3I6QW1vdW50U2hhcGUsXG5kZW5vbWluYXRvcjpBbW91bnRTaGFwZX0pO1xuXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgTmF0IGJpZ2ludC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFhpbXBvcnQoJy4vdHlwZXMuanMnKS5OYXRWYWx1ZX1cbiAqLyRo4oCNX29uY2UuUmF0aW9TaGFwZShSYXRpb1NoYXBlKTtcbmNvbnN0ICAgICAgICBpc05hdFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsTmF0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc05hdFZhbHVlKGlzTmF0VmFsdWUpO1xuaGFyZGVuKGlzTmF0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlTZXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlTZXR9XG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLENvcHlTZXRWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzQ29weVNldFZhbHVlKGlzQ29weVNldFZhbHVlKTtcbmhhcmRlbihpc0NvcHlTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgcGFzcyBieSBjb3B5IGFycmF5IHN0cnVjdHVyZS4gRG9lcyBub3RcbiAqIGNoZWNrIGZvciBkdXBsaWNhdGVzLiBUbyBjaGVjayBmb3IgZHVwbGljYXRlcywgdXNlIHNldE1hdGhIZWxwZXJzLmNvZXJjZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqIENvcHlTZXRWYWx1ZXMuXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFNldFZhbHVlfVxuICovXG5jb25zdCAgICAgICAgaXNTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLFNldFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNTZXRWYWx1ZShpc1NldFZhbHVlKTtcbmhhcmRlbihpc1NldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5QmFnXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5QmFnfVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnVmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5QmFnVmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc0NvcHlCYWdWYWx1ZShpc0NvcHlCYWdWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5QmFnVmFsdWUpO1xuXG4vKiBPbmUgR09PR09MdGggc2hvdWxkIGJlIGVub3VnaCBkZWNpbWFsIHBsYWNlcyBmb3IgYW55Ym9keS4qL1xuY29uc3QgICAgICAgIE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUz0xMDA7JGjigI1fb25jZS5NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKTtcblxuY29uc3QgICAgICAgIEFzc2V0S2luZFNoYXBlPU0ub3IoJ25hdCcsJ3NldCcsJ2NvcHlTZXQnLCdjb3B5QmFnJyk7JGjigI1fb25jZS5Bc3NldEtpbmRTaGFwZShBc3NldEtpbmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBEaXNwbGF5SW5mb1NoYXBlPU0uc3BsaXRSZWNvcmQoXG57fSxcbntcbmRlY2ltYWxQbGFjZXM6TS5hbmQoXG5NLmd0ZSgtTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbk0ubHRlKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUykpLFxuXG5hc3NldEtpbmQ6QXNzZXRLaW5kU2hhcGV9LFxuXG57XG4vKiBJbmNsdWRpbmcgdGhpcyBlbXB0eSBgcmVzdGAgZW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBubyBvdGhlciovXG4vKiBwcm9wZXJ0aWVzIGJleW9uZCB0aG9zZSBpbiB0aGUgYGJhc2VgIHJlY29yZC4qL30pOyRo4oCNX29uY2UuRGlzcGxheUluZm9TaGFwZShEaXNwbGF5SW5mb1NoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBJc3N1ZXJLaXRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbm1pbnQ6TWludFNoYXBlLFxubWludFJlY292ZXJ5UHVyc2U6UHVyc2VTaGFwZSxcbmlzc3VlcjpJc3N1ZXJTaGFwZSxcbmRpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9KTtcblxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW50ZXJmYWNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovJGjigI1fb25jZS5Jc3N1ZXJLaXRTaGFwZShJc3N1ZXJLaXRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBCcmFuZEk9TS5pbnRlcmZhY2UoJ0JyYW5kJyx7XG5pc015SXNzdWVyOk0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5nZXRBbW91bnRTaGFwZTpNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBbYnJhbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Fzc2V0S2luZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYW1vdW50U2hhcGVdXG4gKi8kaOKAjV9vbmNlLkJyYW5kSShCcmFuZEkpO1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJJbnRlcmZhY2VzPShcbmJyYW5kU2hhcGU9QnJhbmRTaGFwZSxcbmFzc2V0S2luZFNoYXBlPUFzc2V0S2luZFNoYXBlLFxuYW1vdW50U2hhcGU9QW1vdW50U2hhcGUpPT5cbntcbmNvbnN0IElzc3Vlckk9TS5pbnRlcmZhY2UoJ0lzc3Vlcicse1xuZ2V0QnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEFsbGVnZWROYW1lOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXRBc3NldEtpbmQ6TS5jYWxsKCkucmV0dXJucyhhc3NldEtpbmRTaGFwZSksXG5nZXREaXNwbGF5SW5mbzpNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxubWFrZUVtcHR5UHVyc2U6TS5jYWxsKCkucmV0dXJucyhQdXJzZVNoYXBlKSxcblxuaXNMaXZlOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldEFtb3VudE9mOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmJ1cm46TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLlxub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBNaW50ST1NLmludGVyZmFjZSgnTWludCcse1xuZ2V0SXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxubWludFBheW1lbnQ6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSl9KTtcblxuXG5jb25zdCBQYXltZW50ST1NLmludGVyZmFjZSgnUGF5bWVudCcse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSl9KTtcblxuXG5jb25zdCBQdXJzZUk9TS5pbnRlcmZhY2UoJ1B1cnNlJyx7XG5nZXRBbGxlZ2VkQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEN1cnJlbnRBbW91bnQ6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXI6TS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbi8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4vKiBSYXRoZXIsIHRoZSBzZW1hbnRpY3Mgb2YgYGRlcG9zaXRgIHJlcXVpcmUgaXQgdG8gcHJvdmlkZSBpdHMqL1xuLyogY2FsbGVycyB3aXRoIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IGBkZXBvc2l0YCBtZXNzYWdlcyBhcmUqL1xuLyogcHJvY2Vzc2VkIHdpdGhvdXQgZnVydGhlciBkZWxheSBpbiB0aGUgb3JkZXIgdGhleSBhcnJpdmUuKi9cbi8qIFB1cnNlSSB0aGVyZWZvcmUgcmVxdWlyZXMgdGhhdCB0aGUgYHNyY1BheW1lbnRgIGFyZ3VtZW50IGFscmVhZHkqL1xuLyogYmUgYSByZW1vdGFibGUsIG5vdCBhIHByb21pc2UuKi9cbi8qIFB1cnNlSSBvbmx5IGNhbGxzIHRoaXMgcmF3IG1ldGhvZCBhZnRlciB2YWxpZGF0aW5nIHRoYXQqL1xuLyogYHNyY1BheW1lbnRgIGlzIGEgcmVtb3RhYmxlLCBsZWF2aW5nIGl0Ki9cbi8qIHRvIHRoaXMgcmF3IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgcmVtb3RhYmxlIGlzIGFjdHVhbGx5Ki9cbi8qIGEgbGl2ZSBwYXltZW50IG9mIHRoZSBjb3JyZWN0IGJyYW5kIHdpdGggc3VmZmljaWVudCBmdW5kcy4qL1xuZGVwb3NpdDpNLmNhbGwoUGF5bWVudFNoYXBlKS5vcHRpb25hbChNLnBhdHRlcm4oKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXREZXBvc2l0RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhEZXBvc2l0RmFjZXRTaGFwZSksXG53aXRoZHJhdzpNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmdldFJlY292ZXJ5U2V0Ok0uY2FsbCgpLnJldHVybnMoTS5zZXRPZihQYXltZW50U2hhcGUpKSxcbnJlY292ZXJBbGw6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBEZXBvc2l0RmFjZXRJPU0uaW50ZXJmYWNlKCdEZXBvc2l0RmFjZXQnLHtcbnJlY2VpdmU6UHVyc2VJLm1ldGhvZEd1YXJkcy5kZXBvc2l0fSk7XG5cblxuY29uc3QgUHVyc2VJS2l0PWhhcmRlbih7XG5wdXJzZTpQdXJzZUksXG5kZXBvc2l0RmFjZXQ6RGVwb3NpdEZhY2V0SX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuSXNzdWVySSxcbk1pbnRJLFxuUGF5bWVudEksXG5QdXJzZUlLaXR9KTtcblxuIH07JGjigI1fb25jZS5tYWtlSXNzdWVySW50ZXJmYWNlcyhtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG5oYXJkZW4obWFrZUlzc3VlckludGVyZmFjZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyYW5kU2hhcGUiOlsiQnJhbmRTaGFwZSJdLCJJc3N1ZXJTaGFwZSI6WyJJc3N1ZXJTaGFwZSJdLCJQYXltZW50U2hhcGUiOlsiUGF5bWVudFNoYXBlIl0sIlB1cnNlU2hhcGUiOlsiUHVyc2VTaGFwZSJdLCJEZXBvc2l0RmFjZXRTaGFwZSI6WyJEZXBvc2l0RmFjZXRTaGFwZSJdLCJOb3RpZmllclNoYXBlIjpbIk5vdGlmaWVyU2hhcGUiXSwiTWludFNoYXBlIjpbIk1pbnRTaGFwZSJdLCJBbW91bnRTaGFwZSI6WyJBbW91bnRTaGFwZSJdLCJSYXRpb1NoYXBlIjpbIlJhdGlvU2hhcGUiXSwiaXNOYXRWYWx1ZSI6WyJpc05hdFZhbHVlIl0sImlzQ29weVNldFZhbHVlIjpbImlzQ29weVNldFZhbHVlIl0sImlzU2V0VmFsdWUiOlsiaXNTZXRWYWx1ZSJdLCJpc0NvcHlCYWdWYWx1ZSI6WyJpc0NvcHlCYWdWYWx1ZSJdLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiOlsiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIl0sIkFzc2V0S2luZFNoYXBlIjpbIkFzc2V0S2luZFNoYXBlIl0sIkRpc3BsYXlJbmZvU2hhcGUiOlsiRGlzcGxheUluZm9TaGFwZSJdLCJJc3N1ZXJLaXRTaGFwZSI6WyJJc3N1ZXJLaXRTaGFwZSJdLCJCcmFuZEkiOlsiQnJhbmRJIl0sIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIjpbIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACzPqVFwPwAAcD8AACkAAABAYWdvcmljL2VydHAtdjAuMTYuMS9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbW91bnRcbiAqIEFtb3VudHMgYXJlIGRlc2NyaXB0aW9ucyBvZiBkaWdpdGFsIGFzc2V0cywgYW5zd2VyaW5nIHRoZSBxdWVzdGlvbnNcbiAqIFwiaG93IG11Y2hcIiBhbmQgXCJvZiB3aGF0IGtpbmRcIi4gQW1vdW50cyBhcmUgdmFsdWVzIGxhYmVsZWQgd2l0aCBhIGJyYW5kLlxuICogQW1vdW50TWF0aCBleGVjdXRlcyB0aGUgbG9naWMgb2YgaG93IGFtb3VudHMgYXJlIGNoYW5nZWQgd2hlbiBkaWdpdGFsXG4gKiBhc3NldHMgYXJlIG1lcmdlZCwgc2VwYXJhdGVkLCBvciBvdGhlcndpc2UgbWFuaXB1bGF0ZWQuIEZvclxuICogZXhhbXBsZSwgYSBkZXBvc2l0IG9mIDIgYnVja3MgaW50byBhIHB1cnNlIHRoYXQgYWxyZWFkeSBoYXMgMyBidWNrc1xuICogZ2l2ZXMgYSBuZXcgcHVyc2UgYmFsYW5jZSBvZiA1IGJ1Y2tzLiBBbiBlbXB0eSBwdXJzZSBoYXMgMCBidWNrcy4gQW1vdW50TWF0aFxuICogcmVsaWVzIGhlYXZpbHkgb24gcG9seW1vcnBoaWMgTWF0aEhlbHBlcnMsIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHVuYnJhbmRlZFxuICogcG9ydGlvbi5cbiAqXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtBc3NldFZhbHVlRm9yS2luZDxLPn0gdmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtOYXRWYWx1ZSB8IFNldFZhbHVlIHwgQ29weVNldCB8IENvcHlCYWd9IEFtb3VudFZhbHVlXG4gKiBBbiBgQW1vdW50VmFsdWVgIGRlc2NyaWJlcyBhIHNldCBvciBxdWFudGl0eSBvZiBhc3NldHMgdGhhdCBjYW4gYmUgb3duZWQgb3JcbiAqIHNoYXJlZC5cbiAqXG4gKiBBIGZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQgdG8gcmVwcmVzZW50IGEgcXVhbnRpdHlcbiAqIG9mIHRoYXQgbWFueSBhc3NldHMuXG4gKlxuICogQSBub24tZnVuZ2libGUgYEFtb3VudFZhbHVlYCB1c2VzIGFuIGFycmF5IG9yIENvcHlTZXQgb2YgYEtleWBzIHRvIHJlcHJlc2VudFxuICogYSBzZXQgb2Ygd2hhdGV2ZXIgYXNzZXQgZWFjaCBrZXkgcmVwcmVzZW50cy4gQSBgS2V5YCBpcyBhIHBhc3NhYmxlIHZhbHVlXG4gKiB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIGVsZW1lbnQgaW4gYSBzZXQgKFNldFN0b3JlIG9yIENvcHlTZXQpIG9yIGFzIHRoZVxuICoga2V5IGluIGEgbWFwIChNYXBTdG9yZSBvciBDb3B5TWFwKS5cbiAqXG4gKiBgU2V0VmFsdWVgIGlzIGZvciB0aGUgZGVwcmVjYXRlZCBzZXQgcmVwcmVzZW50YXRpb24sIHVzaW5nIGFuIGFycmF5IGRpcmVjdGx5XG4gKiB0byByZXByZXNlbnQgdGhlIGFycmF5IG9mIGl0cyBlbGVtZW50cy4gYENvcHlTZXRgIGlzIHRoZSBwcm9wZXJcbiAqIHJlcHJlc2VudGF0aW9uIHVzaW5nIGEgQ29weVNldC5cbiAqXG4gKiBBIHNlbWktZnVuZ2libGUgYENvcHlCYWdgIGlzIHJlcHJlc2VudGVkIGFzIGFcbiAqIGBDb3B5QmFnYCBvZiBgS2V5YCBvYmplY3RzLiBcIkJhZ1wiIGlzIHN5bm9ueW1vdXMgd2l0aCBNdWx0aVNldCwgd2hlcmUgYW5cbiAqIGVsZW1lbnQgb2YgYSBiYWcgY2FuIGJlIHByZXNlbnQgb25jZSBvciBtb3JlIHRpbWVzLCBpLmUuLCBzb21lIHBvc2l0aXZlXG4gKiBiaWdpbnQgbnVtYmVyIG9mIHRpbWVzLCByZXByZXNlbnRpbmcgdGhhdCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgcmVwcmVzZW50ZWRcbiAqIGJ5IHRoYXQga2V5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyduYXQnIHwgJ3NldCcgfCAnY29weVNldCcgfCAnY29weUJhZycgfSBBc3NldEtpbmRcbiAqXG4gKiBTZWUgZG9jLWNvbW1lbnQgZm9yIGBBbW91bnRWYWx1ZWAuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHR5cGVkZWYge0sgZXh0ZW5kcyAnbmF0JyA/IE5hdFZhbHVlIDpcbiAqIEsgZXh0ZW5kcyAnc2V0JyA/IFNldFZhbHVlIDpcbiAqIEsgZXh0ZW5kcyAnY29weVNldCcgPyBDb3B5U2V0OlxuICogSyBleHRlbmRzICdjb3B5QmFnJyA/IENvcHlCYWcgOlxuICogbmV2ZXJcbiAqIH0gQXNzZXRWYWx1ZUZvcktpbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtWIGV4dGVuZHMgTmF0VmFsdWUgPyAnbmF0JyA6XG4gKiAgViBleHRlbmRzIFNldFZhbHVlID8gJ3NldCcgOlxuICogIFYgZXh0ZW5kcyBDb3B5U2V0ID8gJ2NvcHlTZXQnIDpcbiAqICBWIGV4dGVuZHMgQ29weUJhZyA/ICdjb3B5QmFnJyA6XG4gKiAgbmV2ZXJ9IEFzc2V0S2luZEZvclZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gRGlzcGxheUluZm9cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVjaW1hbFBsYWNlc10gVGVsbHMgdGhlIGRpc3BsYXkgc29mdHdhcmUgaG93XG4gKiAgIG1hbnkgZGVjaW1hbCBwbGFjZXMgdG8gbW92ZSB0aGUgZGVjaW1hbCBvdmVyIHRvIHRoZSBsZWZ0LCBvciBpblxuICogICBvdGhlciB3b3Jkcywgd2hpY2ggcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gd2hvbGUgbnVtYmVycy4gV2VcbiAqICAgcmVxdWlyZSBmdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB0byBiZSByZXByZXNlbnRlZCBpbiBpbnRlZ2VycywgaW5cbiAqICAgdGhlIHNtYWxsZXN0IHVuaXQgKGkuZS4gVVNEIG1pZ2h0IGJlIHJlcHJlc2VudGVkIGluIG1pbGwsIGFcbiAqICAgdGhvdXNhbmR0aCBvZiBhIGRvbGxhci4gSW4gdGhhdCBjYXNlLCBgZGVjaW1hbFBsYWNlc2Agd291bGQgYmVcbiAqICAgMy4pIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwsIGFuZCBmb3Igbm9uLWZ1bmdpYmxlIGRpZ2l0YWxcbiAqICAgYXNzZXRzLCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4gVGhlIGRlY2ltYWxQbGFjZXMgcHJvcGVydHlcbiAqICAgc2hvdWxkIGJlIHVzZWQgZm9yICpkaXNwbGF5IHB1cnBvc2VzIG9ubHkqLiBBbnkgb3RoZXIgdXNlIGlzIGFuXG4gKiAgIGFudGktcGF0dGVybi5cbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kIC0gdGhlIGtpbmQgb2YgYXNzZXQsIGVpdGhlclxuICogICBBc3NldEtpbmQuTkFUIChmdW5naWJsZSkgb3JcbiAqICAgQXNzZXRLaW5kLlNFVCBvciBBc3NldEtpbmQuQ09QWV9TRVQgKG5vbi1mdW5naWJsZSlcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcmFuZFxuICogVGhlIGJyYW5kIGlkZW50aWZpZXMgdGhlIGtpbmQgb2YgaXNzdWVyLCBhbmQgaGFzIGEgZnVuY3Rpb24gdG8gZ2V0IHRoZVxuICogYWxsZWdlZCBuYW1lIGZvciB0aGUga2luZCBvZiBhc3NldCBkZXNjcmliZWQuIFRoZSBhbGxlZ2VkIG5hbWUgKHN1Y2hcbiAqIGFzICdCVEMnIG9yICdtb29sYScpIGlzIHByb3ZpZGVkIGJ5IHRoZSBtYWtlciBvZiB0aGUgaXNzdWVyIGFuZCBzaG91bGRcbiAqIG5vdCBiZSB0cnVzdGVkIGFzIGFjY3VyYXRlLlxuICpcbiAqIEV2ZXJ5IGFtb3VudCBjcmVhdGVkIGJ5IGEgcGFydGljdWxhciBBbW91bnRNYXRoIHdpbGwgc2hhcmUgdGhlIHNhbWUgYnJhbmQsXG4gKiBidXQgcmVjaXBpZW50cyBjYW5ub3QgcmVseSBvbiB0aGUgYnJhbmQgdG8gdmVyaWZ5IHRoYXQgYSBwdXJwb3J0ZWQgYW1vdW50XG4gKiByZXByZXNlbnRzIHRoZSBpc3N1ZXIgdGhleSBpbnRlbmRlZCwgc2luY2UgdGhlIHNhbWUgYnJhbmQgY2FuIGJlIHJldXNlZCBieVxuICogYSBtaXNiZWhhdmluZyBpc3N1ZXIuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZElzc3VlcjogRVJlZjxJc3N1ZXI+KSA9PiBQcm9taXNlPGJvb2xlYW4+fSBpc015SXNzdWVyXG4gKiBTaG91bGQgYmUgdXNlZCB3aXRoIGBpc3N1ZXIuZ2V0QnJhbmRgIHRvIGVuc3VyZSBhbiBpc3N1ZXIgYW5kIGJyYW5kIG1hdGNoLlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldEFsbGVnZWROYW1lXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvPEs+fSBnZXREaXNwbGF5SW5mb1xuICogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHByb3BlcnR5IHsoKSA9PiBQYXR0ZXJufSBnZXRBbW91bnRTaGFwZVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJc3N1ZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVySXNMaXZlXG4gKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIHBheW1lbnQgY29udGludWVzIHRvIGV4aXN0LlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyR2V0QW1vdW50T2ZcbiAqXG4gKiBHZXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudC4gQmVjYXVzZSB0aGVcbiAqIHBheW1lbnQgaXMgbm90IHRydXN0ZWQsIHdlIGNhbm5vdCBjYWxsIGEgbWV0aG9kIG9uIGl0IGRpcmVjdGx5LCBhbmRcbiAqIG11c3QgdXNlIHRoZSBpc3N1ZXIgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlckJ1cm5cbiAqXG4gKiBCdXJuIGFsbCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiBwYXltZW50LiBgb3B0QW1vdW50YCBpcyBvcHRpb25hbC4gSWYgYG9wdEFtb3VudGAgaXMgcHJlc2VudCwgdGhlXG4gKiBjb2RlIHdpbGwgaW5zaXN0IHRoYXQgdGhlIGFtb3VudCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiBwYXltZW50IGlzIGVxdWFsIHRvIGBvcHRBbW91bnRgLCB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIHdyb25nXG4gKiBwYXltZW50IGFuZCBvdGhlciBjb25mdXNpb24uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJDbGFpbVxuICpcbiAqIFRyYW5zZmVyIGFsbCBkaWdpdGFsIGFzc2V0cyBmcm9tIHRoZSBwYXltZW50IHRvIGEgbmV3IHBheW1lbnQgYW5kXG4gKiBkZWxldGUgdGhlIG9yaWdpbmFsLiBgb3B0QW1vdW50YCBpcyBvcHRpb25hbC4gSWYgYG9wdEFtb3VudGAgaXNcbiAqIHByZXNlbnQsIHRoZSBjb2RlIHdpbGwgaW5zaXN0IHRoYXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpblxuICogdGhlIHBheW1lbnQgaXMgZXF1YWwgdG8gYG9wdEFtb3VudGAsIHRvIHByZXZlbnQgc2VuZGluZyB0aGUgd3JvbmdcbiAqIHBheW1lbnQgYW5kIG90aGVyIGNvbmZ1c2lvbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJDb21iaW5lXG4gKlxuICogQ29tYmluZSBtdWx0aXBsZSBwYXltZW50cyBpbnRvIG9uZSBwYXltZW50LlxuICpcbiAqIElmIGFueSBvZiB0aGUgcGF5bWVudHMgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZFxuICogdXBvbiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+PltdfSBwYXltZW50c0FycmF5XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gW29wdFRvdGFsQW1vdW50XVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlclNwbGl0XG4gKlxuICogU3BsaXQgYSBzaW5nbGUgcGF5bWVudCBpbnRvIHR3byBwYXltZW50cyxcbiAqIEEgYW5kIEIsIGFjY29yZGluZyB0byB0aGUgcGF5bWVudEFtb3VudEEgcGFzc2VkIGluLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBwYXltZW50QW1vdW50QVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPltdPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJTcGxpdE1hbnlcbiAqXG4gKiBTcGxpdCBhIHNpbmdsZSBwYXltZW50IGludG8gbWFueSBwYXltZW50cywgYWNjb3JkaW5nIHRvIHRoZSBhbW91bnRzXG4gKiBwYXNzZWQgaW4uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnRbXX0gYW1vdW50c1xuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudFtdPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJcbiAqXG4gKiBUaGUgaXNzdWVyIGNhbm5vdCBtaW50IGEgbmV3IGFtb3VudCwgYnV0IGl0IGNhbiBjcmVhdGUgZW1wdHkgcHVyc2VzXG4gKiBhbmQgcGF5bWVudHMuIFRoZSBpc3N1ZXIgY2FuIGFsc28gdHJhbnNmb3JtIHBheW1lbnRzIChzcGxpdHRpbmdcbiAqIHBheW1lbnRzLCBjb21iaW5pbmcgcGF5bWVudHMsIGJ1cm5pbmcgcGF5bWVudHMsIGFuZCBjbGFpbWluZ1xuICogcGF5bWVudHMgZXhjbHVzaXZlbHkpLiBUaGUgaXNzdWVyIHNob3VsZCBiZSBnb3R0ZW4gZnJvbSBhIHRydXN0ZWRcbiAqIHNvdXJjZSBhbmQgdGhlbiByZWxpZWQgdXBvbiBhcyB0aGUgZGVjaWRlciBvZiB3aGV0aGVyIGFuIHVudHJ1c3RlZFxuICogcGF5bWVudCBpcyB2YWxpZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRCcmFuZCBHZXQgdGhlIEJyYW5kIGZvciB0aGlzIElzc3Vlci4gVGhlXG4gKiBCcmFuZCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCBhbmQgaXMgc2hhcmVkIGJ5IHRoZVxuICogbWludCwgdGhlIGlzc3VlciwgYW5kIGFueSBwdXJzZXMgYW5kIHBheW1lbnRzIG9mIHRoaXMgcGFydGljdWxhclxuICoga2luZC4gVGhlIGJyYW5kIGlzIG5vdCBjbG9zZWx5IGhlbGQsIHNvIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZVxuICogdHJ1c3RlZCB0byBpZGVudGlmeSBhbiBpc3N1ZXIgYWxvbmUuIEZha2UgZGlnaXRhbCBhc3NldHMgYW5kIGFtb3VudFxuICogY2FuIHVzZSBhbm90aGVyIGlzc3VlcidzIGJyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRBbGxlZ2VkTmFtZSBHZXQgdGhlIGFsbGVnZWROYW1lIGZvclxuICogdGhpcyBtaW50L2lzc3VlclxuICogQHByb3BlcnR5IHsoKSA9PiBBc3NldEtpbmR9IGdldEFzc2V0S2luZCBHZXQgdGhlIGtpbmQgb2ZcbiAqIE1hdGhIZWxwZXJzIHVzZWQgYnkgdGhpcyBJc3N1ZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvPEs+fSBnZXREaXNwbGF5SW5mbyBHaXZlIGluZm9ybWF0aW9uIHRvIFVJXG4gKiAgb24gaG93IHRvIGRpc3BsYXkgYW1vdW50cyBmb3IgdGhpcyBpc3N1ZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IFB1cnNlPEs+fSBtYWtlRW1wdHlQdXJzZSBNYWtlIGFuIGVtcHR5IHB1cnNlIG9mIHRoaXNcbiAqIGJyYW5kLlxuICogQHByb3BlcnR5IHtJc3N1ZXJJc0xpdmV9IGlzTGl2ZVxuICogQHByb3BlcnR5IHtJc3N1ZXJHZXRBbW91bnRPZjxLPn0gZ2V0QW1vdW50T2ZcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyQnVybn0gYnVyblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW1lbnRMZWRnZXJcbiAqIEBwcm9wZXJ0eSB7TWludDxLPn0gbWludFxuICogQHByb3BlcnR5IHtQdXJzZTxLPn0gbWludFJlY292ZXJ5UHVyc2VcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyS2l0XG4gKiBAcHJvcGVydHkge01pbnQ8Sz59IG1pbnRcbiAqIEBwcm9wZXJ0eSB7UHVyc2U8Sz59IG1pbnRSZWNvdmVyeVB1cnNlXG4gKiBAcHJvcGVydHkge0lzc3VlcjxLPn0gaXNzdWVyXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZGl0aW9uYWxEaXNwbGF5SW5mb1xuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVjaW1hbFBsYWNlc10gVGVsbHMgdGhlIGRpc3BsYXkgc29mdHdhcmUgaG93XG4gKiAgIG1hbnkgZGVjaW1hbCBwbGFjZXMgdG8gbW92ZSB0aGUgZGVjaW1hbCBvdmVyIHRvIHRoZSBsZWZ0LCBvciBpblxuICogICBvdGhlciB3b3Jkcywgd2hpY2ggcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gd2hvbGUgbnVtYmVycy4gV2VcbiAqICAgcmVxdWlyZSBmdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB0byBiZSByZXByZXNlbnRlZCBpbiBpbnRlZ2VycywgaW5cbiAqICAgdGhlIHNtYWxsZXN0IHVuaXQgKGkuZS4gVVNEIG1pZ2h0IGJlIHJlcHJlc2VudGVkIGluIG1pbGwsIGFcbiAqICAgdGhvdXNhbmR0aCBvZiBhIGRvbGxhci4gSW4gdGhhdCBjYXNlLCBgZGVjaW1hbFBsYWNlc2Agd291bGQgYmVcbiAqICAgMy4pIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwsIGFuZCBmb3Igbm9uLWZ1bmdpYmxlIGRpZ2l0YWxcbiAqICAgYXNzZXRzLCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4gVGhlIGRlY2ltYWxQbGFjZXMgcHJvcGVydHlcbiAqICAgc2hvdWxkIGJlIHVzZWQgZm9yICpkaXNwbGF5IHB1cnBvc2VzIG9ubHkqLiBBbnkgb3RoZXIgdXNlIGlzIGFuXG4gKiAgIGFudGktcGF0dGVybi5cbiAqIEBwcm9wZXJ0eSB7QXNzZXRLaW5kfSBbYXNzZXRLaW5kXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuU2h1dGRvd25XaXRoRmFpbHVyZX0gU2h1dGRvd25XaXRoRmFpbHVyZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1pbnRcbiAqIEhvbGRpbmcgYSBNaW50IGNhcnJpZXMgdGhlIHJpZ2h0IHRvIGlzc3VlIG5ldyBkaWdpdGFsIGFzc2V0cy4gVGhlc2VcbiAqIGFzc2V0cyBhbGwgaGF2ZSB0aGUgc2FtZSBraW5kLCB3aGljaCBpcyBjYWxsZWQgYSBCcmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3VlcjxLPn0gZ2V0SXNzdWVyIEdldHMgdGhlIElzc3VlciBmb3IgdGhpcyBtaW50LlxuICogQHByb3BlcnR5IHsobmV3QW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnQ8Sz59IG1pbnRQYXltZW50XG4gKiBDcmVhdGVzIGEgbmV3IFBheW1lbnQgY29udGFpbmluZyBuZXdseSBtaW50ZWQgYW1vdW50LlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIERlcG9zaXRGYWNldFJlY2VpdmVcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVwb3NpdEZhY2V0XG4gKiBAcHJvcGVydHkge0RlcG9zaXRGYWNldFJlY2VpdmV9IHJlY2VpdmVcbiAqIERlcG9zaXQgYWxsIHRoZSBjb250ZW50cyBvZiBwYXltZW50IGludG8gdGhlIHB1cnNlIHRoYXQgbWFkZSB0aGlzIGZhY2V0LFxuICogcmV0dXJuaW5nIHRoZSBhbW91bnQuIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgb3B0QW1vdW50YCBkb2VzIG5vdCBlcXVhbCB0aGVcbiAqIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudCwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogSWYgcGF5bWVudCBpcyBhIHByb21pc2UsIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBQdXJzZURlcG9zaXRcbiAqIEBwYXJhbSB7UGF5bWVudDxLPn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1cnNlXG4gKiBQdXJzZXMgaG9sZCBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgb2YgdGhlIHNhbWUgYnJhbmQsIGJ1dCB1bmxpa2UgUGF5bWVudHMsXG4gKiB0aGV5IGFyZSBub3QgbWVhbnQgdG8gYmUgc2VudCB0byBvdGhlcnMuIFRvIHRyYW5zZmVyIGRpZ2l0YWwgYXNzZXRzLCBhXG4gKiBQYXltZW50IHNob3VsZCBiZSB3aXRoZHJhd24gZnJvbSBhIFB1cnNlLiBUaGUgYW1vdW50IG9mIGRpZ2l0YWxcbiAqIGFzc2V0cyBpbiBhIHB1cnNlIGNhbiBjaGFuZ2UgdGhyb3VnaCB0aGUgYWN0aW9uIG9mIGRlcG9zaXQoKSBhbmQgd2l0aGRyYXcoKS5cbiAqXG4gKiBUaGUgcHJpbWFyeSB1c2UgZm9yIFB1cnNlcyBhbmQgUGF5bWVudHMgaXMgZm9yIGN1cnJlbmN5LWxpa2UgYW5kIGdvb2RzLWxpa2VcbiAqIGRpZ2l0YWwgYXNzZXRzLCBidXQgdGhleSBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlcHJlc2VudCBvdGhlciBraW5kcyBvZiByaWdodHMsXG4gKiBzdWNoIGFzIHRoZSByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgY29udHJhY3QuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QWxsZWdlZEJyYW5kIEdldCB0aGUgYWxsZWdlZCBCcmFuZCBmb3IgdGhpcyBQdXJzZVxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSBnZXRDdXJyZW50QW1vdW50XG4gKiBHZXQgdGhlIGFtb3VudCBjb250YWluZWQgaW4gdGhpcyBwdXJzZS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IExhdGVzdFRvcGljPEFtb3VudDxLPj59IGdldEN1cnJlbnRBbW91bnROb3RpZmllclxuICogR2V0IGEgbG9zc3kgbm90aWZpZXIgZm9yIGNoYW5nZXMgdG8gdGhpcyBwdXJzZSdzIGJhbGFuY2UuXG4gKlxuICogQHByb3BlcnR5IHtQdXJzZURlcG9zaXQ8Sz59IGRlcG9zaXRcbiAqIERlcG9zaXQgYWxsIHRoZSBjb250ZW50cyBvZiBwYXltZW50IGludG8gdGhpcyBwdXJzZSwgcmV0dXJuaW5nIHRoZVxuICogYW1vdW50LiBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgYG9wdEFtb3VudGAgZG9lcyBub3QgZXF1YWwgdGhlXG4gKiBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIElmIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IERlcG9zaXRGYWNldH0gZ2V0RGVwb3NpdEZhY2V0XG4gKiBSZXR1cm4gYW4gb2JqZWN0IHdob3NlIGByZWNlaXZlYCBtZXRob2QgZGVwb3NpdHMgdG8gdGhlIGN1cnJlbnQgUHVyc2UuXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnQ8Sz59IHdpdGhkcmF3XG4gKiBXaXRoZHJhdyBhbW91bnQgZnJvbSB0aGlzIHB1cnNlIGludG8gYSBuZXcgUGF5bWVudC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IENvcHlTZXQ8UGF5bWVudDxLPj59IGdldFJlY292ZXJ5U2V0XG4gKiBUaGUgc2V0IG9mIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tIHRoaXMgcHVyc2UgdGhhdCBhcmUgc3RpbGwgbGl2ZS4gVGhlc2VcbiAqIGFyZSB0aGUgcGF5bWVudHMgdGhhdCBjYW4gc3RpbGwgYmUgcmVjb3ZlcmVkIGluIGVtZXJnZW5jaWVzIGJ5LCBmb3IgZXhhbXBsZSxcbiAqIGRlcG9zaXRpbmcgaW50byB0aGlzIHB1cnNlLiBTdWNoIGEgZGVwb3NpdCBhY3Rpb24gaXMgbGlrZSBjYW5jZWxpbmcgYW5cbiAqIG91dHN0YW5kaW5nIGNoZWNrIGJlY2F1c2UgeW91J3JlIHRpcmVkIG9mIHdhaXRpbmcgZm9yIGl0LiBPbmNlIHlvdXJcbiAqIGNhbmNlbGxhdGlvbiBpcyBhY2tub3dsZWRnZWQsIHlvdSBjYW4gc3BlbmQgdGhlIGFzc2V0cyBhdCBzdGFrZSBvbiBvdGhlclxuICogdGhpbmdzLiBBZnRlcndhcmRzLCBpZiB0aGUgcmVjaXBpZW50IG9mIHRoZSBvcmlnaW5hbCBjaGVjayBmaW5hbGx5IGdldHNcbiAqIGFyb3VuZCB0byBkZXBvc2l0aW5nIGl0LCB0aGVpciBkZXBvc2l0IGZhaWxzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSByZWNvdmVyQWxsXG4gKiBGb3IgdXNlIGluIGVtZXJnZW5jaWVzLCBzdWNoIGFzIGNvbWluZyBiYWNrIGZyb20gYSB0cmF1bWF0aWMgY3Jhc2ggYW5kXG4gKiB1cGdyYWRlLiBUaGlzIGRlcG9zaXRzIGFsbCB0aGUgcGF5bWVudHMgaW4gdGhpcyBwdXJzZSdzIHJlY292ZXJ5IHNldFxuICogaW50byB0aGUgcHVyc2UgaXRzZWxmLCByZXR1cm5pbmcgdGhlIHRvdGFsIGFtb3VudCBvZiBhc3NldHMgcmVjb3ZlcmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW1lbnRcbiAqIFBheW1lbnRzIGhvbGQgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIG9mIHRoZSBzYW1lIGJyYW5kIGluIHRyYW5zaXQuIFBheW1lbnRzXG4gKiBjYW4gYmUgZGVwb3NpdGVkIGluIHB1cnNlcywgc3BsaXQgaW50byBtdWx0aXBsZSBwYXltZW50cywgY29tYmluZWQsIGFuZFxuICogY2xhaW1lZCAoZ2V0dGluZyBhbiBleGNsdXNpdmUgcGF5bWVudCkuIFBheW1lbnRzIGFyZSBsaW5lYXIsIG1lYW5pbmdcbiAqIHRoYXQgZWl0aGVyIGEgcGF5bWVudCBoYXMgdGhlIHNhbWUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGl0XG4gKiBzdGFydGVkIHdpdGgsIG9yIGl0IGlzIHVzZWQgdXAgZW50aXJlbHkuIEl0IGlzIGltcG9zc2libGUgdG8gcGFydGlhbGx5IHVzZSBhXG4gKiBwYXltZW50LlxuICpcbiAqIFBheW1lbnRzIGFyZSBvZnRlbiByZWNlaXZlZCBmcm9tIG90aGVyIGFjdG9ycyBhbmQgdGhlcmVmb3JlIHNob3VsZFxuICogbm90IGJlIHRydXN0ZWQgdGhlbXNlbHZlcy4gVG8gZ2V0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gYSBwYXltZW50LFxuICogdXNlIHRoZSB0cnVzdGVkIGlzc3VlcjogaXNzdWVyLmdldEFtb3VudE9mKHBheW1lbnQpLFxuICpcbiAqIFBheW1lbnRzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gUHVyc2VzIGJ5IGdldHRpbmcgYSB0cnVzdGVkIGlzc3VlciBhbmRcbiAqIGNhbGxpbmcgYGlzc3Vlci5tYWtlRW1wdHlQdXJzZSgpYCB0byBjcmVhdGUgYSBwdXJzZSwgdGhlblxuICogYHB1cnNlLmRlcG9zaXQocGF5bWVudClgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8Sz59IGdldEFsbGVnZWRCcmFuZFxuICogR2V0IHRoZSBhbGxlZ2VkQnJhbmQsIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCB0aGlzXG4gKiBwYXltZW50IHB1cnBvcnRzIHRvIGJlLCBhbmQgd2hpY2ggaXNzdWVyIHRvIHVzZS4gQmVjYXVzZSBwYXltZW50c1xuICogYXJlIG5vdCB0cnVzdGVkLCBhbnkgbWV0aG9kIGNhbGxzIG9uIHBheW1lbnRzIHNob3VsZCBiZSB0cmVhdGVkXG4gKiB3aXRoIHN1c3BpY2lvbiBhbmQgdmVyaWZpZWQgZWxzZXdoZXJlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0aEhlbHBlcnNcbiAqIEFsbCBvZiB0aGUgZGlmZmVyZW5jZSBpbiBob3cgZGlnaXRhbCBhc3NldCBhbW91bnQgYXJlIG1hbmlwdWxhdGVkIGNhbiBiZVxuICogcmVkdWNlZCB0byB0aGUgYmVoYXZpb3Igb2YgdGhlIG1hdGggb24gdmFsdWVzLiBXZSBleHRyYWN0IHRoaXNcbiAqIGN1c3RvbSBsb2dpYyBpbnRvIG1hdGhIZWxwZXJzLiBNYXRoSGVscGVycyBhcmUgYWJvdXQgdmFsdWVcbiAqIGFyaXRobWV0aWMsIHdoZXJlYXMgQW1vdW50TWF0aCBpcyBhYm91dCBhbW91bnRzLCB3aGljaCBhcmUgdGhlXG4gKiB2YWx1ZXMgbGFiZWxlZCB3aXRoIGEgYnJhbmQuIEFtb3VudE1hdGggdXNlIG1hdGhIZWxwZXJzIHRvIGRvIHRoZWlyIHZhbHVlXG4gKiBhcml0aG1ldGljLCBhbmQgdGhlbiBicmFuZCB0aGUgcmVzdWx0cywgbWFraW5nIGEgbmV3IGFtb3VudC5cbiAqXG4gKiBUaGUgTWF0aEhlbHBlcnMgYXJlIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCBvbmx5IGZyb20gQW1vdW50TWF0aCwgYW5kIHNvXG4gKiBhbGwgbWV0aG9kcyBidXQgY29lcmNlIGNhbiBhc3N1bWUgdGhlaXIgaW5wdXRzIGFyZSB2YWxpZC4gVGhleSBvbmx5XG4gKiBuZWVkIHRvIGRvIG91dHB1dCB2YWxpZGF0aW9uLCBhbmQgb25seSB3aGVuIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgb2ZcbiAqIGludmFsaWQgb3V0cHV0LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRWYWx1ZTogVikgPT4gVn0gZG9Db2VyY2VcbiAqIENoZWNrIHRoZSBraW5kIG9mIHRoaXMgdmFsdWUgYW5kIHRocm93IGlmIGl0IGlzIG5vdCB0aGVcbiAqIGV4cGVjdGVkIGtpbmQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBWfSBkb01ha2VFbXB0eVxuICogR2V0IHRoZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGlkZW50aXR5IGVsZW1lbnQgKG9mdGVuIDAgb3IgYW5cbiAqIGVtcHR5IGFycmF5KVxuICpcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlOiBWKSA9PiBib29sZWFufSBkb0lzRW1wdHlcbiAqIElzIHRoZSB2YWx1ZSB0aGUgaWRlbnRpdHkgZWxlbWVudD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gYm9vbGVhbn0gZG9Jc0dURVxuICogSXMgdGhlIGxlZnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSByaWdodD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gYm9vbGVhbn0gZG9Jc0VxdWFsXG4gKiBEb2VzIGxlZnQgZXF1YWwgcmlnaHQ/XG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IFZ9IGRvQWRkXG4gKiBSZXR1cm4gdGhlIGxlZnQgY29tYmluZWQgd2l0aCB0aGUgcmlnaHQuXG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IFZ9IGRvU3VidHJhY3RcbiAqIFJldHVybiB3aGF0IHJlbWFpbnMgYWZ0ZXIgcmVtb3ZpbmcgdGhlIHJpZ2h0IGZyb20gdGhlIGxlZnQuIElmXG4gKiBzb21ldGhpbmcgaW4gdGhlIHJpZ2h0IHdhcyBub3QgaW4gdGhlIGxlZnQsIHdlIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2JpZ2ludH0gTmF0VmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcnJheTxLZXk+fSBTZXRWYWx1ZVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEWu2GpKLQAASi0AADQAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE1LjAvc3JjL2ZlZURpc3RyaWJ1dG9yLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvZXJ0cC9zcmMvbGVnYWN5LXBheW1lbnQtaGVscGVycy5qcyIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIiwiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiLCJAZW5kby9mYXIiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJjdXN0b21UZXJtc1NoYXBlIiwibWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yIiwibWFrZUZlZURpc3RyaWJ1dG9yIiwibWFrZVNoYXJlQ29uZmlnIiwic2hhcmVQYXltZW50Iiwic3RhcnQiLCJzdGFydERpc3RyaWJ1dGluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRNYXRoLHNwbGl0TWFueSxFLEZhcixOYXQsb2JzZXJ2ZU5vdGlmaWVyLG11c3RNYXRjaCxtYWtlU2NhbGFyU2V0U3RvcmUsTSxSZWxhdGl2ZVRpbWVTaGFwZSxLZXl3b3JkU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cC9zcmMvbGVnYWN5LXBheW1lbnQtaGVscGVycy5qc1wiLCBbW1wic3BsaXRNYW55XCIsIFskaOKAjV9hID0+IChzcGxpdE1hbnkgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjigI1fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJTZXRTdG9yZSA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlJlbGF0aXZlVGltZVNoYXBlXCIsIFskaOKAjV9hID0+IChSZWxhdGl2ZVRpbWVTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiS2V5d29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChLZXl3b3JkU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdCBLZXl3b3JkU2hhcmVzU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsTS5uYXQoKSk7XG5cbi8qKlxuICogQSBwYXR0ZXJuIGZvciBab2UgdG8gY2hlY2sgY3VzdG9tIHRlcm1zIGJlZm9yZSBgc3RhcnQoKWBpbmcgdGhlIGNvbnRyYWN0LlxuICovXG5jb25zdCAgICAgICAgY3VzdG9tVGVybXNTaGFwZT1oYXJkZW4oe1xua2V5d29yZFNoYXJlczpLZXl3b3JkU2hhcmVzU2hhcGUsXG50aW1lclNlcnZpY2U6TS5lcmVmKE0ucmVtb3RhYmxlKCdUaW1lclNlcnZpY2UnKSksXG5jb2xsZWN0aW9uSW50ZXJ2YWw6UmVsYXRpdmVUaW1lU2hhcGV9KTtcblxuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuUmVsYXRpdmVUaW1lfSBSZWxhdGl2ZVRpbWVcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlfSBUaW1lclNlcnZpY2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZlZUNvbGxlY3RvclxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxQYXltZW50PCduYXQnPj59IGNvbGxlY3RGZWVzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQZXJpb2RpY0ZlZUNvbGxlY3RvclxuICogQHByb3BlcnR5IHsoKSA9PiBGZWVDb2xsZWN0b3J9IGdldENvbGxlY3RvclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjb2xsZWN0QW5kRGlzdHJpYnV0ZU5vd1xuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBzdG9wXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb2xsZWN0aWJsZUNvbnRyYWN0RmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPHN0cmluZywgbmV2ZXI+Pn0gbWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogd3JhcHBlciB0byB0YWtlIHRoZSBhIGNyZWF0b3JGYWNldCAoZS5nLiB2YXVsdEZhY3RvcnkpIGFuZCBtYWtlIGEgY2FsbCB0aGF0XG4gKiB3aWxsIHJlcXVlc3QgYW4gaW52aXRhdGlvbiBhbmQgcmV0dXJuIGEgcHJvbWlzZSBmb3IgYSBwYXltZW50LlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge0VSZWY8Q29sbGVjdGlibGVDb250cmFjdEZhY2V0Pn0gY3JlYXRvckZhY2V0XG4gKi8kaOKAjV9vbmNlLmN1c3RvbVRlcm1zU2hhcGUoY3VzdG9tVGVybXNTaGFwZSk7XG5jb25zdCAgICAgICAgbWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yPSh6b2UsY3JlYXRvckZhY2V0KT0+e1xuLyoqIEB0eXBlIHtGZWVDb2xsZWN0b3J9ICovXG5yZXR1cm4gRmFyKCdmZWVDb2xsZWN0b3InLHtcbmNvbGxlY3RGZWVzOigpPT57XG5jb25zdCBpbnZpdGF0aW9uPUUoY3JlYXRvckZhY2V0KS5tYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uKCk7XG5jb25zdCBjb2xsZWN0RmVlc1NlYXQ9RSh6b2UpLm9mZmVyKGludml0YXRpb24sdW5kZWZpbmVkLHVuZGVmaW5lZCk7XG5yZXR1cm4gRShjb2xsZWN0RmVlc1NlYXQpLmdldFBheW91dCgnRmVlJyk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBBIGRpc3RyaWJ1dG9yIG9mIGZlZXMgZnJvbSBJbnRlciBQcm90b2NvbCBzb3VyY2VzIHRvIGRlcG9zaXQgZmFjZXRzLiBFYWNoXG4gKiB0aW1lIHRoZSBlcG9jaFRpbWVyIHNpZ25hbHMgdGhlIGVuZCBvZiBhbiBFcG9jaCwgaXQgd2lsbCBhc2sgdGhlIGNvbnRyYWN0c1xuICogZm9yIGZlZXMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIHRvIGRhdGUgYW5kIHNlbmQgdGhhdCBwYXltZW50IHRvIHRoZVxuICogZGVwb3NpdEZhY2V0LlxuICpcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx1bmtub3duPn0gc2NoZWR1bGVQYXltZW50cyAtIGRpc3RyaWJ1dGUgdG8gdGhlIGRlc3RpbmF0aW9uc1xuICogQHBhcmFtIHtFUmVmPFRpbWVyU2VydmljZT59IHRpbWVyU2VydmljZSAtIHRpbWVyIHRoYXQgaXMgdXNlZCB0byBzY2hlZHVsZSBjb2xsZWN0aW9uc1xuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWV9IFtjb2xsZWN0aW9uSW50ZXJ2YWxdIC0gaG93IG9mdGVuIHRvIGNvbGxlY3QgZmVlcyBpbiB0aGVcbiAqIGB0aW1lclNlcnZpY2VgIHVuaXRcbiAqLyRo4oCNX29uY2UubWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yKG1ha2VDb250cmFjdEZlZUNvbGxlY3Rvcik7XG5jb25zdCAgICAgICAgc3RhcnREaXN0cmlidXRpbmc9KFxuc2NoZWR1bGVQYXltZW50cyxcbnRpbWVyU2VydmljZSxcbmNvbGxlY3Rpb25JbnRlcnZhbD0xbik9Plxue1xuY29uc3QgdGltZU9ic2VydmVyPXtcbnVwZGF0ZVN0YXRlOihfKT0+XG5zY2hlZHVsZVBheW1lbnRzKCkuY2F0Y2goKGUpPT57XG5jb25zb2xlLmVycm9yKCdmYWlsZWQgd2l0aCcsZSk7XG50aHJvdyBlO1xuIH0pLFxuZmFpbDoocmVhc29uKT0+e1xudGhyb3cgRXJyb3IoIGBmZWUgZGlzdHJpYnV0b3IgdGltZXIgZmFpbGVkOiAke3JlYXNvbn1gKTtcbiB9LFxuZmluaXNoOihkb25lKT0+e1xudGhyb3cgRXJyb3IoIGBmZWUgZGlzdHJpYnV0b3IgdGltZXIgZGllZDogJHtkb25lfWApO1xuIH19O1xuXG5cbmNvbnN0IGNvbGxlY3Rpb25Ob3RpZmllcj1FKHRpbWVyU2VydmljZSkubWFrZU5vdGlmaWVyKFxuMG4sXG5jb2xsZWN0aW9uSW50ZXJ2YWwpO1xuXG5vYnNlcnZlTm90aWZpZXIoY29sbGVjdGlvbk5vdGlmaWVyLHRpbWVPYnNlcnZlcikuY2F0Y2goKGUpPT57XG5jb25zb2xlLmVycm9yKCdmZWUgZGlzdHJpYnV0b3IgZmFpbGVkIHdpdGgnLGUpO1xuIH0pO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge3sgcHVzaFBheW1lbnQ6IChwYXltZW50OiBQYXltZW50LCBpc3N1ZXI6IEVSZWY8SXNzdWVyPikgPT4gUHJvbWlzZTxBbW91bnQ+fX0gRmVlRGVzdGluYXRpb25cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxLZXl3b3JkLCBFUmVmPEZlZURlc3RpbmF0aW9uPj59IFtkZXN0aW5hdGlvbnNdXG4gKiBAcGFyYW0ge1JlY29yZDxLZXl3b3JkLCBOYXRWYWx1ZT59IFtrZXl3b3JkU2hhcmVzXVxuICovJGjigI1fb25jZS5zdGFydERpc3RyaWJ1dGluZyhzdGFydERpc3RyaWJ1dGluZyk7XG5jb25zdCAgICAgICAgbWFrZVNoYXJlQ29uZmlnPShkZXN0aW5hdGlvbnM9e30sa2V5d29yZFNoYXJlcz17fSk9PntcbmxldCB0b3RhbFNoYXJlcz0wbjtcbmNvbnN0IHNoYXJlcz1PYmplY3QuZW50cmllcyhkZXN0aW5hdGlvbnMpLlxuZmlsdGVyKChbXyxkc3RdKT0+ZHN0KS5cbm1hcCgoW2t3LGRlc3RpbmF0aW9uXSk9PntcbmNvbnN0IHNoYXJlPU5hdChrZXl3b3JkU2hhcmVzW2t3XSk7XG50b3RhbFNoYXJlcys9c2hhcmU7XG5yZXR1cm57XG5zaGFyZSxcbmRlc3RpbmF0aW9ufTtcblxuIH0pO1xucmV0dXJue3NoYXJlcyx0b3RhbFNoYXJlc307XG4gfTtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlU2hhcmVDb25maWc+fSBTaGFyZUNvbmZpZyAqL1xuXG4vKipcbiAqIFNwbGl0IGFuZCBkZXBvc2l0IGEgcGF5bWVudCBnaXZlbiBhIHNoYXJlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXltZW50PCduYXQnPn0gcGF5bWVudFxuICogQHBhcmFtIHtFUmVmPElzc3VlcjwnbmF0Jz4+fSBpc3N1ZXJcbiAqIEBwYXJhbSB7U2hhcmVDb25maWd9IHNoYXJlQ29uZmlnXG4gKi8kaOKAjV9vbmNlLm1ha2VTaGFyZUNvbmZpZyhtYWtlU2hhcmVDb25maWcpO1xuY29uc3QgICAgICAgIHNoYXJlUGF5bWVudD1hc3luYyhcbnBheW1lbnQsXG5pc3N1ZXIsXG57c2hhcmVzLHRvdGFsU2hhcmVzfSk9Plxue1xuLyogRGl2aWRlIHRoZSBwYXltZW50IGludG8gc2hhcmVzLiovXG5pZighc2hhcmVzLmxlbmd0aCl7XG5yZXR1cm47XG4gfVxuXG4vKiogQHR5cGUge0Ftb3VudDwnbmF0Jz59ICovXG5jb25zdCBwYXltZW50QW1vdW50PWF3YWl0IEUoaXNzdWVyKS5nZXRBbW91bnRPZihwYXltZW50KTtcbmlmKEFtb3VudE1hdGguaXNFbXB0eShwYXltZW50QW1vdW50KSl7XG5yZXR1cm47XG4gfVxuY29uc3R7dmFsdWU6dG90YWxWYWx1ZSxicmFuZH09cGF5bWVudEFtb3VudDtcblxubGV0IHJlbWFpbmRlcj10b3RhbFZhbHVlO1xuY29uc3QgZGVzdGluZWRBbW91bnRFbnRyaWVzPXNoYXJlcy5cbm1hcCgoe3NoYXJlLGRlc3RpbmF0aW9ufSxpKT0+e1xuY29uc3QgdmFsdWU9XG5pPT09c2hhcmVzLmxlbmd0aC0xP1xucmVtYWluZGVyOlxudG90YWxWYWx1ZSpzaGFyZS90b3RhbFNoYXJlcztcbnJlbWFpbmRlci09dmFsdWU7XG5yZXR1cm4gKC8qKiBAdHlwZSB7Y29uc3R9ICovW1xuZGVzdGluYXRpb24sXG5BbW91bnRNYXRoLm1ha2UoYnJhbmQsdmFsdWUpXSk7XG5cbiB9KS5cbmZpbHRlcigoW18sYW10XSk9PiFBbW91bnRNYXRoLmlzRW1wdHkoYW10KSk7XG5cbi8qKlxuICogSWYgdGhlIGBzaGFyZWRQYXltZW50W2ldYCBwYXltZW50cyB0aGF0IGFyZSBzZW50IHRvIHRoZSBmZWVcbiAqIGBkZXN0aW5hdGlvbmAgd2l0aCBgcHVzaFBheW1lbnRgIG5ldmVyIGFycml2ZSwgb3IgbmV2ZXIgZ2V0IGRlcG9zaXRlZFxuICogKG9yIG90aGVyd2lzZSB1c2VkIHVwKSwgdGhlbiB0aGV5IHJlbWFpbiBpbiB0aGUgcmVjb3Zlcnkgc2V0IG9mIHRoZVxuICogYHJlY292ZXJ5UHVyc2VgLiBUaGUgcHVycG9zZSBvZiB0aGlzLCBhbmQgb2YgcmVjb3Zlcnkgc2V0cyBpbiBnZW5lcmFsLFxuICogaXMgdG8gYmUgYWJsZSwgaW4gZW1lcmdlbmNpZXMsIHRvIHJlY292ZXIgdGhlIGFzc2V0cyBvZiBwYXltZW50cyBpbiBmbGlnaHRcbiAqIHRoYXQgc2VlbSB0byBiZSBzdHVjay4gVGhpcyBpcyBtdWNoIGxpa2UgY2FuY2VsbGluZyBhIGNoZWNrIHRoYXQgbWF5IHN0aWxsXG4gKiBiZSB1bmRlcG9zaXRlZC5cbiAqXG4gKiBUT0RPOiBIb3dldmVyLCBmb3IgdGhpcyB0byBiZSBwb3NzaWJsZSwgdGhlIGByZWNvdmVyeVB1cnNlYCBob2xkaW5nIHRoYXRcbiAqIHJlY292ZXJ5IHNldCBtdXN0IHJlbWFpbiBhY2Nlc3NpYmxlIHRvIHNvbWVvbmUgdGhhdCBzaG91bGQgbGVnaXRpbWF0ZWx5XG4gKiBiZSBhYmxlIHRvIHJlY292ZXIgdGhvc2UgcGF5bWVudHMuIEJ1dCB0aGlzIGByZWNvdmVyeVB1cnNlYCBpcyBjdXJyZW50bHlcbiAqIGRyb3BwZWQgb24gdGhlIGZsb29yIGluc3RlYWQuXG4gKi9cbmNvbnN0IHJlY292ZXJ5UHVyc2U9RShpc3N1ZXIpLm1ha2VFbXB0eVB1cnNlKCk7XG5cbi8qIFNwbGl0IHRoZSBwYXltZW50LCB3aGljaCBhc3NlcnRzIGNvbnNlcnZhdGlvbiBvZiB0aGUgdG90YWwuKi9cbmNvbnN0IHNoYXJlZFBheW1lbnQ9YXdhaXQgc3BsaXRNYW55KFxucmVjb3ZlcnlQdXJzZSxcbnBheW1lbnQsXG5kZXN0aW5lZEFtb3VudEVudHJpZXMubWFwKChbX2RzdCxhbXRdKT0+YW10KSk7XG5cblxuLyogU2VuZCBlYWNoIG5vbmVtcHR5IHBheW1lbnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGVzdGluYXRpb24uKi9cbmF3YWl0IFByb21pc2UuYWxsKFxuZGVzdGluZWRBbW91bnRFbnRyaWVzLm1hcCgoW2Rlc3RpbmF0aW9uXSxpKT0+XG5FKGRlc3RpbmF0aW9uKS5wdXNoUGF5bWVudChzaGFyZWRQYXltZW50W2ldLGlzc3VlcikpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0VSZWY8SXNzdWVyPCduYXQnPj59IGZlZUlzc3VlclxuICogQHBhcmFtIHt7IGtleXdvcmRTaGFyZXM6IFJlY29yZDxLZXl3b3JkLCBOYXRWYWx1ZT4sIHRpbWVyU2VydmljZTogRVJlZjxUaW1lclNlcnZpY2U+LCBjb2xsZWN0aW9uSW50ZXJ2YWw6IFJlbGF0aXZlVGltZX19IHRlcm1zXG4gKi8kaOKAjV9vbmNlLnNoYXJlUGF5bWVudChzaGFyZVBheW1lbnQpO1xuY29uc3QgICAgICAgIG1ha2VGZWVEaXN0cmlidXRvcj0oZmVlSXNzdWVyLHRlcm1zKT0+e1xuY29uc3R7dGltZXJTZXJ2aWNlLGNvbGxlY3Rpb25JbnRlcnZhbH09dGVybXM7XG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgRVJlZjxGZWVEZXN0aW5hdGlvbj4+fSAqL1xubGV0IGRlc3RpbmF0aW9ucz17fTtcbmxldHtrZXl3b3JkU2hhcmVzfT10ZXJtcztcbmxldCBzaGFyZUNvbmZpZz1tYWtlU2hhcmVDb25maWcoZGVzdGluYXRpb25zLGtleXdvcmRTaGFyZXMpO1xuXG4vKiogQHR5cGUge1NldFN0b3JlPEZlZUNvbGxlY3Rvcj59ICovXG5jb25zdCBjb2xsZWN0b3JzPW1ha2VTY2FsYXJTZXRTdG9yZSgpO1xuXG4vKiogQHBhcmFtIHtQYXltZW50PCduYXQnPn0gcGF5bWVudCAqL1xuY29uc3QgZGlzdHJpYnV0ZUZlZXM9KHBheW1lbnQpPT5cbnNoYXJlUGF5bWVudChwYXltZW50LGZlZUlzc3VlcixzaGFyZUNvbmZpZyk7XG5cbmNvbnN0IHNjaGVkdWxlUGF5bWVudHM9YXN5bmMoKT0+e1xuaWYoc2hhcmVDb25maWcudG90YWxTaGFyZXM8PTBuKXtcbnJldHVybjtcbiB9XG5hd2FpdCBQcm9taXNlLmFsbChcblsuLi5jb2xsZWN0b3JzLnZhbHVlcygpXS5tYXAoKGNvbGxlY3Rvcik9PlxuRShjb2xsZWN0b3IpLmNvbGxlY3RGZWVzKCkudGhlbihkaXN0cmlidXRlRmVlcykpKTtcblxuXG4gfTtcblxuY29uc3QgcHVibGljRmFjZXQ9RmFyKCdmZWVEaXN0cmlidXRvciBwdWJsaWNGYWNldCcse1xuZGlzdHJpYnV0ZUZlZXMsXG5nZXRLZXl3b3JkU2hhcmVzOigpPT5rZXl3b3JkU2hhcmVzfSk7XG5cblxuY29uc3QgY3JlYXRvckZhY2V0PUZhcignZmVlRGlzdHJpYnV0b3IgY3JlYXRvckZhY2V0Jyx7XG5tYWtlQ29udHJhY3RGZWVDb2xsZWN0b3IsXG4vKipcbiAqIFN0YXJ0IGRpc3RyaWJ1dGluZyBmZWVzIGZyb20gdGhpcyBjb2xsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlYnVnTmFtZVxuICogQHBhcmFtIHtFUmVmPEZlZUNvbGxlY3Rvcj59IGNvbGxlY3RvclBcbiAqL1xuc3RhcnRQZXJpb2RpY0NvbGxlY3Rpb246YXN5bmMoZGVidWdOYW1lLGNvbGxlY3RvclApPT57XG5jb25zdCBjb2xsZWN0b3I9YXdhaXQgY29sbGVjdG9yUDtcblxuLyoqIEB0eXBlIHtQZXJpb2RpY0ZlZUNvbGxlY3Rvcn0gKi9cbmNvbnN0IHBlcmlvZGljQ29sbGVjdG9yPUZhcignUGVyaW9kaWNGZWVDb2xsZWN0b3InLHtcbmdldERlYnVnTmFtZTooKT0+ZGVidWdOYW1lLFxuZ2V0Q29sbGVjdG9yOigpPT5jb2xsZWN0b3IsXG5jb2xsZWN0QW5kRGlzdHJpYnV0ZU5vdzphc3luYygpPT57XG5pZihzaGFyZUNvbmZpZy50b3RhbFNoYXJlczw9MG4pe1xucmV0dXJuO1xuIH1cbmNvbnN0IHBheW1lbnQ9YXdhaXQgRShjb2xsZWN0b3IpLmNvbGxlY3RGZWVzKCk7XG5hd2FpdCBkaXN0cmlidXRlRmVlcyhwYXltZW50KTtcbiB9LFxuc3RvcDooKT0+e1xuY29sbGVjdG9ycy5kZWxldGUoY29sbGVjdG9yKTtcbiB9fSk7XG5cblxuLyogUnVuIG9uY2UgaW1tZWRpYXRlbHkgZm9yIHRoaXMgY29sbGVjdG9yLCB0byB0ZXN0IHRoYXQgdGhlIHJlZ2lzdHJhdGlvbiovXG4vKiB3aWxsIHdvcmsuKi9cbmF3YWl0IEUocGVyaW9kaWNDb2xsZWN0b3IpLmNvbGxlY3RBbmREaXN0cmlidXRlTm93KCk7XG5cbmNvbGxlY3RvcnMuYWRkKGNvbGxlY3Rvcik7XG5yZXR1cm4gcGVyaW9kaWNDb2xsZWN0b3I7XG4gfSxcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVPbmx5PERlcG9zaXRGYWNldD59IGRlcG9zaXRGYWNldFxuICovXG5tYWtlRGVwb3NpdEZhY2V0RGVzdGluYXRpb246KGRlcG9zaXRGYWNldCk9PntcbnJldHVybiBGYXIoIGBEZXBvc2l0RmFjZXREZXN0aW5hdGlvbmAse1xucHVzaFBheW1lbnQ6YXN5bmMocGF5bWVudCxfaXNzdWVyKT0+e1xucmV0dXJuIEUoZGVwb3NpdEZhY2V0KS5yZWNlaXZlKHBheW1lbnQpO1xuIH19KTtcblxuIH0sXG4vKipcbiAqIENyZWF0ZSBhIGRlc3RpbmF0aW9uIHRoYXQgZ2VuZXJhdGVzIGludml0YXRpb25zIGFuZCBtYWtlcyBab2Ugb2ZmZXJzLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5d29yZFxuICogQHBhcmFtIHt1bmtub3dufSB0YXJnZXRcbiAqIEBwYXJhbSB7UHJvcGVydHlLZXl9IG1ha2VJbnZpdGF0aW9uTWV0aG9kXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gW2FyZ3NdXG4gKi9cbm1ha2VPZmZlckRlc3RpbmF0aW9uOihcbnpvZSxcbmtleXdvcmQsXG50YXJnZXQsXG5tYWtlSW52aXRhdGlvbk1ldGhvZCxcbmFyZ3M9W10pPT5cbntcbnJldHVybiBGYXIoIGAke1N0cmluZyhtYWtlSW52aXRhdGlvbk1ldGhvZCl9IE9mZmVyRGVzdGluYXRpb25gLHtcbnB1c2hQYXltZW50OmFzeW5jKHBheW1lbnQsaXNzdWVyKT0+e1xuY29uc3QgcGF5bWVudEFtb3VudD1hd2FpdCBFKGlzc3VlcikuZ2V0QW1vdW50T2YocGF5bWVudCk7XG5cbi8qIEdpdmUgdGhlIHBheW1lbnQgdG8gdGhlIGNvbnRyYWN0IHZpYSBpdHMgaW52aXRhdGlvbi4qL1xuY29uc3QgaW52aXRhdGlvbj1FKHRhcmdldClbbWFrZUludml0YXRpb25NZXRob2RdKC4uLmFyZ3MpO1xuY29uc3QgcmVzdWx0PUUoem9lKS5vZmZlcihcbmludml0YXRpb24sXG57XG5naXZlOntcbltrZXl3b3JkXTpwYXltZW50QW1vdW50fX0sXG5cblxue1xuW2tleXdvcmRdOnBheW1lbnR9KTtcblxuXG5cbi8qIEFzc2VydCB0aGF0IHRoZSBvZmZlciBjb21wbGV0ZWQuKi9cbmF3YWl0IEUocmVzdWx0KS5nZXRPZmZlclJlc3VsdCgpO1xuXG4vKiBXZSBkZWxpYmVyYXRlbHkgZHJvcCBvdXIgcGF5b3V0cyBvbiB0aGUgZmxvb3IsIHNpbmNlIHRoZSBFUlRQIHB1cnNlKi9cbi8qIHJlY292ZXJ5IG1lY2hhbmlzbSBjYW4gZ2V0IHRoZW0gYmFjayB0byB0aGUgZGlzdHJpYnV0b3IgY29udHJhY3QuKi9cbnJldHVybiBwYXltZW50QW1vdW50O1xuIH19KTtcblxuIH0sXG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8S2V5d29yZCwgRVJlZjxGZWVEZXN0aW5hdGlvbj4+fSBuZXdEZXN0aW5hdGlvbnNcbiAqL1xuc2V0RGVzdGluYXRpb25zOmFzeW5jKG5ld0Rlc3RpbmF0aW9ucyk9PntcbmRlc3RpbmF0aW9ucz1uZXdEZXN0aW5hdGlvbnM7XG5zaGFyZUNvbmZpZz1tYWtlU2hhcmVDb25maWcoZGVzdGluYXRpb25zLGtleXdvcmRTaGFyZXMpO1xuLyogUnVuIG9uY2UgaW1tZWRpYXRlbHkgZm9yIHRoZXNlIGRlc3RpbmF0aW9ucy4qL1xuYXdhaXQgc2NoZWR1bGVQYXltZW50cygpO1xuIH0sXG5cbi8qKiBAcGFyYW0ge1JlY29yZDxLZXl3b3JkLCBiaWdpbnQ+fSBuZXdTaGFyZXMgKi9cbnNldEtleXdvcmRTaGFyZXM6KG5ld1NoYXJlcyk9Pntcbm11c3RNYXRjaChuZXdTaGFyZXMsS2V5d29yZFNoYXJlc1NoYXBlKTtcbmtleXdvcmRTaGFyZXM9bmV3U2hhcmVzO1xuIH19KTtcblxuXG4vKiBTdGFydCBwcm9jZXNzaW5nIGNvbGxlY3Rpb25zLiovXG5zdGFydERpc3RyaWJ1dGluZyhzY2hlZHVsZVBheW1lbnRzLHRpbWVyU2VydmljZSxjb2xsZWN0aW9uSW50ZXJ2YWwpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmNyZWF0b3JGYWNldCxcbnB1YmxpY0ZhY2V0fSk7XG5cbiB9O1xuXG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VGZWVEaXN0cmlidXRvcj5bJ2NyZWF0b3JGYWNldCddfSBGZWVEaXN0cmlidXRvckNyZWF0b3JGYWNldCAqL1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlRmVlRGlzdHJpYnV0b3I+WydwdWJsaWNGYWNldCddfSBGZWVEaXN0cmlidXRvclB1YmxpY0ZhY2V0ICovXG5cbi8qKlxuICogQHBhcmFtIHtaQ0Y8UGFyYW1ldGVyczx0eXBlb2YgbWFrZUZlZURpc3RyaWJ1dG9yPlsxXT59IHpjZlxuICovJGjigI1fb25jZS5tYWtlRmVlRGlzdHJpYnV0b3IobWFrZUZlZURpc3RyaWJ1dG9yKTtcbmNvbnN0ICAgICAgICBzdGFydD1hc3luYyh6Y2YpPT57XG5jb25zdCBmZWVJc3N1ZXI9RSh6Y2YuZ2V0Wm9lU2VydmljZSgpKS5nZXRGZWVJc3N1ZXIoKTtcbnJldHVybiBtYWtlRmVlRGlzdHJpYnV0b3IoZmVlSXNzdWVyLHpjZi5nZXRUZXJtcygpKTtcbiB9OyRo4oCNX29uY2Uuc3RhcnQoc3RhcnQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImN1c3RvbVRlcm1zU2hhcGUiOlsiY3VzdG9tVGVybXNTaGFwZSJdLCJtYWtlQ29udHJhY3RGZWVDb2xsZWN0b3IiOlsibWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yIl0sInN0YXJ0RGlzdHJpYnV0aW5nIjpbInN0YXJ0RGlzdHJpYnV0aW5nIl0sIm1ha2VTaGFyZUNvbmZpZyI6WyJtYWtlU2hhcmVDb25maWciXSwic2hhcmVQYXltZW50IjpbInNoYXJlUGF5bWVudCJdLCJtYWtlRmVlRGlzdHJpYnV0b3IiOlsibWFrZUZlZURpc3RyaWJ1dG9yIl0sInN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG3bYQpeKAAAXigAACcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMS9zcmMvY2FsbGJhY2suanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImNhbGxFIiwiY2FsbFN5bmMiLCJpc0NhbGxiYWNrIiwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siLCJtYWtlTWV0aG9kQ2FsbGJhY2siLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siLCJtYWtlU3luY01ldGhvZENhbGxiYWNrIiwicHJlcGFyZUF0dGVudWF0b3IiLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxpc09iamVjdCxpc1Bhc3NhYmxlU3ltYm9sOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImlzUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGlzUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdHtmcm9tRW50cmllc309T2JqZWN0O1xuXG5jb25zdHtvd25LZXlzOnJhd093bktleXN9PVJlZmxlY3Q7XG5jb25zdCBvd25LZXlzPVxuLyoqIEB0eXBlIHs8VCBleHRlbmRzIFByb3BlcnR5S2V5PihvYmo6IHtbSyBpbiBUXT86IHVua25vd259KSA9PiBUW119ICovXG5yYXdPd25LZXlzO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogUGFyYW1ldGVyczxSZXR1cm5UeXBlPHByZXBhcmVBdHRlbnVhdG9yPj4pID0+IEZhcmFibGU8VD59IE1ha2VBdHRlbnVhdG9yXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYmFjazxJPn0gQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlN5bmNDYWxsYmFjazxJPn0gU3luY0NhbGxiYWNrXG4gKi9cblxuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+ICYgVH0gRmFyYWJsZSAqL1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0ga2V5XG4gKiBAcmV0dXJucyB7a2V5IGlzIFByb3BlcnR5S2V5fSBGSVhNRTogc2hvdWxkIGJlIGp1c3QgYFByb3BlcnR5S2V5YCBidXQgVFNcbiAqIGNvbXBsYWlucyBpdCBjYW4ndCBiZSB1c2VkIGFzIGFuIGluZGV4IHR5cGUuXG4gKi9cbmNvbnN0IGlzUHJvcGVydHlLZXk9KGtleSk9PntcbnN3aXRjaCh0eXBlb2Yga2V5KXtcbmNhc2Unc3RyaW5nJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2Unc3ltYm9sJzpcbnJldHVybiB0cnVlO1xuZGVmYXVsdDpcbnJldHVybiBmYWxzZTt9XG5cbiB9O1xuXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgY2FsbCBhIGNhbGxiYWNrLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAcGFyYW0ge1N5bmNDYWxsYmFjazxJPn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICogQHJldHVybnMge1JldHVyblR5cGU8ST59XG4gKi9cbmNvbnN0ICAgICAgICBjYWxsU3luYz0oY2FsbGJhY2ssLi4uYXJncyk9PntcbmNvbnN0e3RhcmdldCxtZXRob2ROYW1lLGJvdW5kfT1jYWxsYmFjaztcbmlmKG1ldGhvZE5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIHRhcmdldCguLi5ib3VuZCwuLi5hcmdzKTtcbiB9XG5yZXR1cm4gdGFyZ2V0W21ldGhvZE5hbWVdKC4uLmJvdW5kLC4uLmFyZ3MpO1xuIH07JGjigI1fb25jZS5jYWxsU3luYyhjYWxsU3luYyk7XG5oYXJkZW4oY2FsbFN5bmMpO1xuXG4vKipcbiAqIEV2ZW50dWFsIHNlbmQgdG8gYSBjYWxsYmFjay5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHBhcmFtIHtDYWxsYmFjazxJPn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPEk+Pj59XG4gKi9cbmNvbnN0ICAgICAgICBjYWxsRT0oY2FsbGJhY2ssLi4uYXJncyk9PntcbmNvbnN0e3RhcmdldCxtZXRob2ROYW1lLGJvdW5kfT1jYWxsYmFjaztcbmlmKG1ldGhvZE5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIEUodGFyZ2V0KSguLi5ib3VuZCwuLi5hcmdzKTtcbiB9XG5yZXR1cm4gRSh0YXJnZXQpW21ldGhvZE5hbWVdKC4uLmJvdW5kLC4uLmFyZ3MpO1xuIH07JGjigI1fb25jZS5jYWxsRShjYWxsRSk7XG5oYXJkZW4oY2FsbEUpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBuZWFyIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST59IFtUPUldXG4gKiBAdGVtcGxhdGUge3Vua25vd25bXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge1N5bmNDYWxsYmFjazxJPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjaz0odGFyZ2V0LC4uLmJvdW5kKT0+e1xudHlwZW9mIHRhcmdldD09PSdmdW5jdGlvbid8fFxuRmFpbCBgc3luYyBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uOiAke3RhcmdldH1gO1xuLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuY29uc3QgY2I9aGFyZGVuKHt0YXJnZXQsYm91bmQsaXNTeW5jOnRydWV9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtTeW5jQ2FsbGJhY2s8ST59ICovY2IpO1xuIH07JGjigI1fb25jZS5tYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2sobWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBwb3RlbnRpYWxseSBmYXIgZnVuY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxcbiAqICAgKC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPlxuICogPn0gW1Q9WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxJPl1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bltdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7Q2FsbGJhY2s8ST59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRnVuY3Rpb25DYWxsYmFjaz0odGFyZ2V0LC4uLmJvdW5kKT0+e1xuaXNPYmplY3QodGFyZ2V0KXx8XG5GYWlsIGBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uIHByZXNlbmNlOiAke3RhcmdldH1gO1xuLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuY29uc3QgY2I9aGFyZGVuKHt0YXJnZXQsYm91bmR9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtDYWxsYmFjazxJPn0gKi9jYik7XG4gfTskaOKAjV9vbmNlLm1ha2VGdW5jdGlvbkNhbGxiYWNrKG1ha2VGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgZnJvbSBhIG5lYXIgbWV0aG9kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBQXG4gKiBAdGVtcGxhdGUge3tcbiAqICAgW3ggaW4gUF06ICguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST5cbiAqIH19IFtUPXsgW3ggaW4gUF06IEkgfV1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bltdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1B9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtTeW5jQ2FsbGJhY2s8ST59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3luY01ldGhvZENhbGxiYWNrPSh0YXJnZXQsbWV0aG9kTmFtZSwuLi5ib3VuZCk9PntcbmlzT2JqZWN0KHRhcmdldCl8fFxuRmFpbCBgc3luYyBtZXRob2QgY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0OiAke3RhcmdldH1gO1xudHlwZW9mIG1ldGhvZE5hbWU9PT0nc3RyaW5nJ3x8XG5pc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpfHxcbkZhaWwgYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IGNiPWhhcmRlbih7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmQsaXNTeW5jOnRydWV9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtTeW5jQ2FsbGJhY2s8ST59ICovY2IpO1xuIH07JGjigI1fb25jZS5tYWtlU3luY01ldGhvZENhbGxiYWNrKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBwb3RlbnRpYWxseSBmYXIgbWV0aG9kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBQXG4gKiBAdGVtcGxhdGUge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8e1xuICogICBbeCBpbiBQXTogKC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPlxuICogfT59IFtUPVhpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8eyBbeCBpbiBQXTogSSB9Pl1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bltdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1B9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtDYWxsYmFjazxJPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNZXRob2RDYWxsYmFjaz0odGFyZ2V0LG1ldGhvZE5hbWUsLi4uYm91bmQpPT57XG5pc09iamVjdCh0YXJnZXQpfHxGYWlsIGBtZXRob2QgY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0OiAke3RhcmdldH1gO1xudHlwZW9mIG1ldGhvZE5hbWU9PT0nc3RyaW5nJ3x8XG5pc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpfHxcbkZhaWwgYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IGNiPWhhcmRlbih7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtDYWxsYmFjazxJPn0gKi9jYik7XG4gfTskaOKAjV9vbmNlLm1ha2VNZXRob2RDYWxsYmFjayhtYWtlTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VNZXRob2RDYWxsYmFjayk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Y2FsbGJhY2sgaXMgQ2FsbGJhY2s8YW55Pn1cbiAqL1xuY29uc3QgICAgICAgIGlzQ2FsbGJhY2s9KGNhbGxiYWNrKT0+e1xuaWYoIWlzT2JqZWN0KGNhbGxiYWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9PWNhbGxiYWNrO1xucmV0dXJuKFxuaXNPYmplY3QodGFyZ2V0KSYmKFxubWV0aG9kTmFtZT09PXVuZGVmaW5lZHx8XG50eXBlb2YgbWV0aG9kTmFtZT09PSdzdHJpbmcnfHxcbmlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkpJiZcbkFycmF5LmlzQXJyYXkoYm91bmQpKTtcblxuIH07JGjigI1fb25jZS5pc0NhbGxiYWNrKGlzQ2FsbGJhY2spO1xuaGFyZGVuKGlzQ2FsbGJhY2spO1xuXG4vKipcbiAqIFByZXBhcmUgYW4gYXR0ZW51YXRvciBjbGFzcyB3aG9zZSBtZXRob2RzIGNhbiBiZSByZWRpcmVjdGVkIHZpYSBjYWxsYmFja3MuXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gTVxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3pvbmUnKS5ab25lfSB6b25lIFRoZSB6b25lIGluIHdoaWNoIHRvIGFsbG9jYXRlIGF0dGVudWF0b3JzLlxuICogQHBhcmFtIHtNW119IG1ldGhvZE5hbWVzIE1ldGhvZHMgdG8gZm9yd2FyZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBbb3B0cy5pbnRlcmZhY2VHdWFyZF0gQW4gaW50ZXJmYWNlIGd1YXJkIGZvciB0aGVcbiAqIG5ldyBhdHRlbnVhdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLnRhZ10gQSB0YWcgZm9yIHRoZSBuZXcgYXR0ZW51YXRvciBleG9DbGFzcy5cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVBdHRlbnVhdG9yPShcbnpvbmUsXG5tZXRob2ROYW1lcyxcbntpbnRlcmZhY2VHdWFyZCx0YWc9J0F0dGVudWF0b3InfT17fSk9Plxue1xuLyoqXG4gKiBAdHlwZWRlZiB7KHRoaXM6IGFueSwgLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IE1ldGhvZFxuICogQHR5cGVkZWYge3sgW0sgaW4gTV0/OiBDYWxsYmFjazxhbnk+IHwgbnVsbH19IE92ZXJyaWRlc1xuICogQHR5cGVkZWYge3sgW0sgaW4gTV06ICh0aGlzOiBhbnksIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55IH19IE1ldGhvZHNcbiAqL1xuY29uc3QgbWV0aG9kcz0vKiogQHR5cGUge01ldGhvZHN9ICovXG5mcm9tRW50cmllcyhcbm1ldGhvZE5hbWVzLm1hcCgoa2V5KT0+e1xuLyogT25seSBhbGxvdyB0aGUgYFByb3BlcnR5S2V5YCB0eXBlIGZvciB0aGUgdGFyZ2V0IG1ldGhvZCBrZXkuKi9cbmlmKCFpc1Byb3BlcnR5S2V5KGtleSkpe1xudGhyb3cgRmFpbCBga2V5ICR7cShrZXkpfSBpcyBub3QgYSBQcm9wZXJ0eUtleWA7XG4gfVxuXG5jb25zdCBtPS8qKiBAdHlwZSB7TWV0aG9kc30gKi97XG4vKiBFeHBsaWNpdGx5IHVzZSBjb25jaXNlIG1ldGhvZCBzeW50YXggdG8gcHJlc2VydmUgYHRoaXNgIGJ1dCBwcmV2ZW50Ki9cbi8qIGNvbnN0cnVjdG9yIGJlaGF2aW9yLiovXG4vKiogQHR5cGUge01ldGhvZH0gKi9cbltrZXldKC4uLmFyZ3Mpe1xuLyogU3VwcG9ydCBib3RoIHN5bmNocm9ub3VzIGFuZCBhc3luYyBjYWxsYmFja3MuKi9cbmNvbnN0IGNiPXRoaXMuc3RhdGUuY2JzW2tleV07XG5pZighY2Ipe1xuY29uc3QgZXJyPWFzc2VydC5lcnJvcihcbiBgdW5pbXBsZW1lbnRlZCAke3EodGFnKX0gbWV0aG9kICR7cShrZXkpfWApO1xuXG5pZih0aGlzLnN0YXRlLmlzU3luYyl7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gfVxuaWYoY2IuaXNTeW5jKXtcbnJldHVybiBjYWxsU3luYyhjYiwuLi5hcmdzKTtcbiB9XG5yZXR1cm4gY2FsbEUoY2IsLi4uYXJncyk7XG4gfX1bXG5rZXldO1xucmV0dXJuICgvKiogQHR5cGUge2NvbnN0fSAqL1trZXksbV0pO1xuIH0pKTtcblxuXG5cbi8qKlxuICogQ3JlYXRlIGFuIGV4byBvYmplY3Qgd2hvc2UgYmVoYXZpb3IgaXMgY29tcG9zZWQgZnJvbSBhIGRlZmF1bHQgdGFyZ2V0XG4gKiBhbmQvb3IgaW5kaXZpZHVhbCBtZXRob2Qgb3ZlcnJpZGUgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge3Vua25vd259IFtvcHRzLnRhcmdldF0gVGhlIHRhcmdldCBmb3IgYW55IG1ldGhvZHMgdGhhdFxuICogd2VyZW4ndCBzcGVjaWZpZWQgaW4gYG9wdHMub3ZlcnJpZGVzYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaXNTeW5jPWZhbHNlXSBXaGV0aGVyIHRoZSB0YXJnZXQgc2hvdWxkIGJlIHRyZWF0ZWRcbiAqIGFzIHN5bmNocm9ub3VzbHkgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtPdmVycmlkZXN9IFtvcHRzLm92ZXJyaWRlc10gU2V0IGluZGl2aWR1YWxcbiAqIGNhbGxiYWNrcyBmb3IgbWV0aG9kcyAod2hvc2UgbmFtZXMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZVxuICogYHByZXBhcmVBdHRlbnVhdG9yYCBvciBgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yYCBjYWxsKS4gIE51bGxpc2ggb3ZlcnJpZGVzXG4gKiBtZWFuIHRvIHRocm93LlxuICovXG5jb25zdCBtYWtlQXR0ZW51YXRvcj16b25lLmV4b0NsYXNzKFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge2FueX0gW29wdHMudGFyZ2V0XVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pc1N5bmM9ZmFsc2VdXG4gKiBAcGFyYW0ge092ZXJyaWRlc30gW29wdHMub3ZlcnJpZGVzXVxuICovXG4oe1xudGFyZ2V0PW51bGwsXG5pc1N5bmM9ZmFsc2UsXG5vdmVycmlkZXM9LyoqIEB0eXBlIHtPdmVycmlkZXN9ICove319KT0+XG57XG5jb25zdCBjYnM9LyoqIEB0eXBlIHtPdmVycmlkZXN9ICove307XG5cbmNvbnN0IHJlbWFpbmluZz1uZXcgU2V0KG1ldGhvZE5hbWVzKTtcbmZvcihjb25zdCBrZXkgb2Ygb3duS2V5cyhvdmVycmlkZXMpKXtcbnJlbWFpbmluZy5oYXMoa2V5KXx8XG5GYWlsIGAke3EodGFnKX0gb3ZlcnJpZGVzWyR7cShrZXkpfV0gbm90IGFsbG93ZWQgYnkgbWV0aG9kTmFtZXNgO1xuXG5yZW1haW5pbmcuZGVsZXRlKGtleSk7XG5jb25zdCBjYj1vdmVycmlkZXNba2V5XTtcbmNiPT1udWxsfHxcbmlzQ2FsbGJhY2soY2IpfHxcbkZhaWwgYCR7cSh0YWcpfSBvdmVycmlkZXNbJHtxKGtleSl9XSBpcyBub3QgYSBjYWxsYmFjazsgZ290ICR7Y2J9YDtcbmNic1trZXldPWNiO1xuIH1cbmZvcihjb25zdCBrZXkgb2YgcmVtYWluaW5nKXtcbmlmKGlzU3luYyl7XG5jYnNba2V5XT1tYWtlU3luY01ldGhvZENhbGxiYWNrKHRhcmdldCxrZXkpO1xuIH1lbHNle1xuY2JzW2tleV09bWFrZU1ldGhvZENhbGxiYWNrKHRhcmdldCxrZXkpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtjYnMsaXNTeW5jfSk7XG4gfSxcbi8qKiBAdHlwZSB7TWV0aG9kc30gKi9tZXRob2RzKTtcblxucmV0dXJuIG1ha2VBdHRlbnVhdG9yO1xuIH07JGjigI1fb25jZS5wcmVwYXJlQXR0ZW51YXRvcihwcmVwYXJlQXR0ZW51YXRvcik7XG5oYXJkZW4ocHJlcGFyZUF0dGVudWF0b3IpO1xuXG4vKipcbiAqIFByZXBhcmUgYW4gYXR0ZW51YXRvciB3aG9zZSBtZXRob2ROYW1lcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpbnRlcmZhY2VHdWFyZC5cbiAqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvem9uZScpLlpvbmV9IHpvbmVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdHNdXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMudGFnXVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yPSh6b25lLGludGVyZmFjZUd1YXJkLG9wdHM9e30pPT57XG5jb25zdHttZXRob2RHdWFyZHN9PWludGVyZmFjZUd1YXJkO1xuY29uc3QgbWV0aG9kTmFtZXM9b3duS2V5cyhtZXRob2RHdWFyZHMpO1xuY29uc3QgbWFrZUF0dGVudWF0b3I9cHJlcGFyZUF0dGVudWF0b3Ioem9uZSxtZXRob2ROYW1lcyx7XG4uLi5vcHRzLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxucmV0dXJuICgvKiogQHR5cGUge01ha2VBdHRlbnVhdG9yPGFueT59ICovbWFrZUF0dGVudWF0b3IpO1xuIH07JGjigI1fb25jZS5wcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IocHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbGxTeW5jIjpbImNhbGxTeW5jIl0sImNhbGxFIjpbImNhbGxFIl0sIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayI6WyJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siXSwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siOlsibWFrZUZ1bmN0aW9uQ2FsbGJhY2siXSwibWFrZVN5bmNNZXRob2RDYWxsYmFjayI6WyJtYWtlU3luY01ldGhvZENhbGxiYWNrIl0sIm1ha2VNZXRob2RDYWxsYmFjayI6WyJtYWtlTWV0aG9kQ2FsbGJhY2siXSwiaXNDYWxsYmFjayI6WyJpc0NhbGxiYWNrIl0sInByZXBhcmVBdHRlbnVhdG9yIjpbInByZXBhcmVBdHRlbnVhdG9yIl0sInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciI6WyJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqo/dRiIGAAAiBgAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4xL3NyYy9jb25maWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiVkJhbmtBY2NvdW50IiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBAamVzc2llLWNoZWNrKi9cblxuLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNvbWUgb2YgdGhpcyBjb25maWcgaW5mbyBtYXkgbWFrZSBtb3JlIHNlbnNlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLiBIb3dldmVyXG4gKiBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwIGFuZCBvdXIgbGF4IHBhY2thZ2VcbiAqIGRlcGVuZGVuY3kgZ3JhcGgsIHNvbWV0aW1lcyByYXRpb25hbCBwbGFjZW1lbnRzIGNhdXNlIHR5cGUgcmVzb2x1dGlvbiBlcnJvcnMuXG4gKlxuICogU28gYXMgYSB3b3JrLWFyb3VuZCBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgYWNjZXNzIGZyb20gbW9yZSB0aGFuIG9uZSBwYWNrYWdlIGFyZSBwbGFjZWQgaGVyZS5cbiAqL1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZHMgdXNlZCBieSB0aGUgYnJpZGdlIGRldmljZS5cbiAqL1xuY29uc3QgICAgICAgIEJyaWRnZUlkPXtcbkJBTks6J2JhbmsnLFxuQ09SRTonY29yZScsXG5ESUJDOidkaWJjJyxcblNUT1JBR0U6J3N0b3JhZ2UnLFxuUFJPVklTSU9OOidwcm92aXNpb24nLFxuUFJPVklTSU9OX1NNQVJUX1dBTExFVDoncHJvdmlzaW9uV2FsbGV0JyxcbldBTExFVDond2FsbGV0J307JGjigI1fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5cbmhhcmRlbihCcmlkZ2VJZCk7XG5cbmNvbnN0ICAgICAgICBXYWxsZXROYW1lPXtcbmRlcG9zaXRGYWNldDonZGVwb3NpdEZhY2V0J307JGjigI1fb25jZS5XYWxsZXROYW1lKFdhbGxldE5hbWUpO1xuXG5oYXJkZW4oV2FsbGV0TmFtZSk7XG5cbi8qIGRlZmluZWQgaW4gZ29sYW5nL2Nvc21vcy94L3ZiYW5rKi9cbmNvbnN0ICAgICAgICBWQmFua0FjY291bnQ9e1xucmVzZXJ2ZTp7XG5tb2R1bGU6J3ZiYW5rL3Jlc2VydmUnLFxuYWRkcmVzczonYWdvcmljMWFlMGxtdHpsZ3JjbmxhOXhqa3BhYXJxNWQ1ZGZlejYzaDNudWNsJ30sXG5cbnByb3Zpc2lvbjp7XG5tb2R1bGU6J3ZiYW5rL3Byb3Zpc2lvbicsXG5hZGRyZXNzOidhZ29yaWMxbWVnenl0ZzY1Y3lyZ3pzNmZ2enhncmNxdnd3bDd1Z3B0NjIzNDYnfX07JGjigI1fb25jZS5WQmFua0FjY291bnQoVkJhbmtBY2NvdW50KTtcblxuXG5oYXJkZW4oVkJhbmtBY2NvdW50KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmlkZ2VJZCI6WyJCcmlkZ2VJZCJdLCJXYWxsZXROYW1lIjpbIldhbGxldE5hbWUiXSwiVkJhbmtBY2NvdW50IjpbIlZCYW5rQWNjb3VudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAXyTOAyAQAAMgEAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjEvc3JjL2RlYnVnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVHJhY2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbmxldCBkZWJ1Z0luc3RhbmNlPTE7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8ICd2ZXJib3NlJ30gZW5hYmxlXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlVHJhY2VyPShuYW1lLGVuYWJsZT10cnVlKT0+e1xuZGVidWdJbnN0YW5jZSs9MTtcbmxldCBkZWJ1Z0NvdW50PTE7XG5jb25zdCBrZXk9IGAtLS0tLSAke25hbWV9LiR7ZGVidWdJbnN0YW5jZX0gYDtcbi8qIHRoZSBjYXNlcyBiZWxvdyBkZWZpbmUgYSBuYW1lZCB2YXJpYWJsZSB0byBwcm92aWRlIGJldHRlciBkZWJ1ZyBpbmZvKi9cbnN3aXRjaChlbmFibGUpe1xuY2FzZSBmYWxzZTp7XG5jb25zdCBsb2dEaXNhYmxlZD0oLi4uX2FyZ3MpPT57IH07XG5yZXR1cm4gbG9nRGlzYWJsZWQ7XG4gfVxuY2FzZSd2ZXJib3NlJzp7XG5jb25zdCBpbmZvVGljaz0ob3B0TG9nLC4uLmFyZ3MpPT57XG5pZihvcHRMb2cubG9nKXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSwuLi5hcmdzKTtcbiB9ZWxzZXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSxvcHRMb2csLi4uYXJncyk7XG4gfVxuIH07XG5yZXR1cm4gaW5mb1RpY2s7XG4gfVxuZGVmYXVsdDp7XG5jb25zdCBkZWJ1Z1RpY2s9KG9wdExvZywuLi5hcmdzKT0+e1xuaWYob3B0TG9nLmxvZyl7XG5vcHRMb2cubG9nKGtleSxkZWJ1Z0NvdW50Kz0xLC4uLmFyZ3MpO1xuIH1lbHNle1xuY29uc29sZS5pbmZvKGtleSxkZWJ1Z0NvdW50Kz0xLG9wdExvZywuLi5hcmdzKTtcbiB9XG4gfTtcbnJldHVybiBkZWJ1Z1RpY2s7XG4gfX1cblxuIH07JGjigI1fb25jZS5tYWtlVHJhY2VyKG1ha2VUcmFjZXIpO1xuaGFyZGVuKG1ha2VUcmFjZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFjZXIiOlsibWFrZVRyYWNlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABuFZifQwIAAEMCAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjEvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi91dGlscy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi91dGlscy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vY29uZmlnLmpzXCIsIFtdXSxbXCIuL2RlYnVnLmpzXCIsIFtdXSxbXCIuL3V0aWxzLmpzXCIsIFtdXSxbXCIuL21ldGhvZC10b29scy5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABtyjjrCS4AAAkuAAAvAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjEvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanN7ImltcG9ydHMiOlsiLi9jYWxsYmFjay5qcyIsIkBhZ29yaWMvem9uZSIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbImFzc2VydENhcERhdGEiLCJhc3NlcnRQYXRoU2VnbWVudCIsImlzU3RyZWFtQ2VsbCIsIm1ha2VDaGFpblN0b3JhZ2VSb290IiwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSIsIm1ha2VTdG9yYWdlTm9kZUNoaWxkIiwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiLCJ1bm1hcnNoYWxGcm9tVnN0b3JhZ2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxNLGhlYXBab25lLGNiOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvbmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImhlYXBab25lXCIsIFskaOKAjV9hID0+IChoZWFwWm9uZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NhbGxiYWNrLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChjYiA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlQ2hhaW5TdG9yYWdlUm9vdCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZUNoYWluU3RvcmFnZVJvb3RcIn0pOyRo4oCNX29uY2UubWFrZUNoYWluU3RvcmFnZVJvb3QobWFrZUNoYWluU3RvcmFnZVJvb3QpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlU3RvcmFnZU5vZGVDaGlsZCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZVN0b3JhZ2VOb2RlQ2hpbGRcIn0pOyRo4oCNX29uY2UubWFrZVN0b3JhZ2VOb2RlQ2hpbGQobWFrZVN0b3JhZ2VOb2RlQ2hpbGQpOyAgIFxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykubWFrZU1hcnNoYWw+fSBNYXJzaGFsbGVyICovXG4vKiogQHR5cGVkZWYge1BpY2s8TWFyc2hhbGxlciwgJ2Zyb21DYXBEYXRhJz59IFVuc2VyaWFsaXplciAqL1xuXG4vKipcbiAqIERlZmluZWQgYnkgdnN0b3JhZ2VTdG9yZUtleSBpbiB2c3RvcmFnZS5nb1xuICpcbiAqIEB0eXBlZGVmIFZTdG9yYWdlS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVTdWJrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhUHJlZml4Qnl0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9EYXRhVmFsdWVdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEB0eXBlZGVmIFN0cmVhbUNlbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBibG9ja0hlaWdodCBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbmF0dXJhbCBudW1iZXJcbiAqIEBwcm9wZXJ0eSB7VFtdfSB2YWx1ZXNcbiAqL1xuXG4vKipcbiAqIFRoaXMgcmVwcmVzZW50cyBhIG5vZGUgaW4gYW4gSUFWTCB0cmVlLlxuICpcbiAqIFRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gaXMgeC92c3RvcmFnZSwgYW4gQWdvcmljIGV4dGVuc2lvbiBvZiB0aGUgQ29zbW9zIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuY29uc3QgQ2hhaW5TdG9yYWdlTm9kZUk9TS5pbnRlcmZhY2UoJ1N0b3JhZ2VOb2RlJyx7XG5zZXRWYWx1ZTpNLmNhbGxXaGVuKE0uc3RyaW5nKCkpLnJldHVybnMoKSxcbmdldFBhdGg6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldFN0b3JlS2V5Ok0uY2FsbFdoZW4oKS5yZXR1cm5zKE0ucmVjb3JkKCkpLFxubWFrZUNoaWxkTm9kZTpNLmNhbGwoTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnNwbGl0UmVjb3JkKHt9LHtzZXF1ZW5jZTpNLmJvb2xlYW4oKX0se30pKS5cbnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJykpfSk7XG5cblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGVyZmVjdCBoZXVyaXN0aWMgdG8gbmF2aWdhdGUgdGhlIG1pZ3JhdGlvbiBmcm9tIHZhbHVlIGNlbGxzIHRvXG4gKiBzdHJlYW0gY2VsbHMuXG4gKiBBdCB0aW1lIG9mIHdyaXRpbmcsIG5vIGxlZ2FjeSBjZWxscyBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIGEgc3RyZWFtIGNlbGwsXG4gKiBhbmQgd2UgZG8gbm90IGludGVuZCB0byBjcmVhdGUgYW55IG1vcmUgbGVnYWN5IHZhbHVlIGNlbGxzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBjZWxsXG4gKiBAcmV0dXJucyB7Y2VsbCBpcyBTdHJlYW1DZWxsfVxuICovXG5jb25zdCAgICAgICAgaXNTdHJlYW1DZWxsPShjZWxsKT0+XG5jZWxsJiZcbnR5cGVvZiBjZWxsPT09J29iamVjdCcmJlxuQXJyYXkuaXNBcnJheShjZWxsLnZhbHVlcykmJlxudHlwZW9mIGNlbGwuYmxvY2tIZWlnaHQ9PT0nc3RyaW5nJyYmXG4vXjAkfF5bMS05XVswLTldKiQvLnRlc3QoY2VsbC5ibG9ja0hlaWdodCk7JGjigI1fb25jZS5pc1N0cmVhbUNlbGwoaXNTdHJlYW1DZWxsKTtcbmhhcmRlbihpc1N0cmVhbUNlbGwpO1xuXG4vKiBUT0RPOiBDb25zb2xpZGF0ZSB3aXRoIGBpbnNpc3RDYXBEYXRhYCBmdW5jdGlvbnMgZnJvbSBzd2luZ3NldC1saXZlc2xvdHMsKi9cbi8qIHN3aW5nc2V0LXhzbmFwLXN1cGVydmlzb3IsIGV0Yy4qL1xuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGRhdGFcbiAqIEByZXR1cm5zIHthc3NlcnRzIGRhdGEgaXMgWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNhcERhdGE8c3RyaW5nPn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENhcERhdGE9KGRhdGEpPT57XG5hc3NlcnQudHlwZW9mKGRhdGEsJ29iamVjdCcpO1xuYXNzZXJ0KGRhdGEpO1xuYXNzZXJ0LnR5cGVvZihkYXRhLmJvZHksJ3N0cmluZycpO1xuYXNzZXJ0KEFycmF5LmlzQXJyYXkoZGF0YS5zbG90cykpO1xuLyogWFhYIGNoZWNrIHRoYXQgdGhlIC5zbG90cyBhcnJheSBlbGVtZW50cyBhcmUgYWN0dWFsbHkgc3RyaW5ncyovXG4gfTskaOKAjV9vbmNlLmFzc2VydENhcERhdGEoYXNzZXJ0Q2FwRGF0YSk7XG5oYXJkZW4oYXNzZXJ0Q2FwRGF0YSk7XG5cbi8qKlxuICogUmVhZCBhbmQgdW5tYXJzaGFsIGEgdmFsdWUgZnJvbSBhIG1hcCByZXByZXNlbnRhdGlvbiBvZiB2c3RvcmFnZSBkYXRhXG4gKlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSBkYXRhXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIFhpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5tYWtlTWFyc2hhbD5bJ2Zyb21DYXBEYXRhJ119IGZyb21DYXBEYXRhXG4gKiBAcGFyYW0ge251bWJlcn0gW2luZGV4PS0xXSBpbmRleCBvZiB0aGUgZGVzaXJlZCB2YWx1ZSBpbiBhIGRlc2VyaWFsaXplZCBzdHJlYW0gY2VsbFxuICovXG5jb25zdCAgICAgICAgdW5tYXJzaGFsRnJvbVZzdG9yYWdlPShkYXRhLGtleSxmcm9tQ2FwRGF0YSxpbmRleD0tMSk9PntcbmNvbnN0IHNlcmlhbGl6ZWQ9ZGF0YS5nZXQoa2V5KXx8RmFpbCBgbm8gZGF0YSBmb3IgJHtrZXl9YDtcbmFzc2VydC50eXBlb2Yoc2VyaWFsaXplZCwnc3RyaW5nJyk7XG5cbmNvbnN0IHN0cmVhbUNlbGw9SlNPTi5wYXJzZShzZXJpYWxpemVkKTtcbmlmKCFpc1N0cmVhbUNlbGwoc3RyZWFtQ2VsbCkpe1xudGhyb3cgRmFpbCBgbm90IGEgU3RyZWFtQ2VsbDogJHtzdHJlYW1DZWxsfWA7XG4gfVxuXG5jb25zdHt2YWx1ZXN9PXN0cmVhbUNlbGw7XG52YWx1ZXMubGVuZ3RoPjB8fEZhaWwgYG5vIFN0cmVhbUNlbGwgdmFsdWVzOiAke3N0cmVhbUNlbGx9YDtcblxuY29uc3QgbWFyc2hhbGxlZD12YWx1ZXMuYXQoaW5kZXgpO1xuYXNzZXJ0LnR5cGVvZihtYXJzaGFsbGVkLCdzdHJpbmcnKTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KFwiQGVuZG8vbWFyc2hhbFwiKS5DYXBEYXRhPHN0cmluZz59ICovXG5jb25zdCBjYXBEYXRhPWhhcmRlbihKU09OLnBhcnNlKG1hcnNoYWxsZWQpKTtcbmFzc2VydENhcERhdGEoY2FwRGF0YSk7XG5cbmNvbnN0IHVubWFyc2hhbGxlZD1mcm9tQ2FwRGF0YShjYXBEYXRhKTtcbnJldHVybiB1bm1hcnNoYWxsZWQ7XG4gfTskaOKAjV9vbmNlLnVubWFyc2hhbEZyb21Wc3RvcmFnZSh1bm1hcnNoYWxGcm9tVnN0b3JhZ2UpO1xuaGFyZGVuKHVubWFyc2hhbEZyb21Wc3RvcmFnZSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxzdHJpbmc+fSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkge1N0b3JhZ2VOb2RlWydnZXRTdG9yZUtleSddfSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGUgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKiBUT0RPOiBGb3JtYWxpemUgc2VnbWVudCBjb25zdHJhaW50cy4qL1xuLyogTXVzdCBiZSBub25lbXB0eSBhbmQgZGlzYWxsb3cgKHVuZXNjYXBlZCkgYC5gLCBhbmQgZm9yIHNpbXBsaWNpdHkqL1xuLyogKGFuZCBmdXR1cmUgcG9zc2liaWxpdHkgb2YgZS5nLiBlc2NhcGluZykgd2UgY3VycmVudGx5IGxpbWl0IHRvKi9cbi8qIEFTQ0lJIGFscGhhbnVtZXJpYyBwbHVzIHVuZGVyc2NvcmUgYW5kIGRhc2guKi9cbmNvbnN0IHBhdGhTZWdtZW50UGF0dGVybj0vXlthLXpBLVowLTlfLV17MSwxMDB9JC87XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZykgPT4gdm9pZH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQYXRoU2VnbWVudD0obmFtZSk9PntcbnBhdGhTZWdtZW50UGF0dGVybi50ZXN0KG5hbWUpfHxcbkZhaWwgYFBhdGggc2VnbWVudCBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgMSB0byAxMDAgY2hhcmFjdGVycyBsaW1pdGVkIHRvIEFTQ0lJIGFscGhhbnVtZXJpY3MsIHVuZGVyc2NvcmVzLCBhbmQvb3IgZGFzaGVzOiAke25hbWV9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGF0aFNlZ21lbnQoYXNzZXJ0UGF0aFNlZ21lbnQpO1xuaGFyZGVuKGFzc2VydFBhdGhTZWdtZW50KTtcblxuLyoqXG4gKiBNdXN0IG1hdGNoIHRoZSBzd2l0Y2ggaW4gdnN0b3JhZ2UuZ28gdXNpbmcgYHZzdG9yYWdlTWVzc2FnZWAgdHlwZVxuICpcbiAqIEB0eXBlZGVmIHsgJ2dldCcgfCAnZ2V0U3RvcmVLZXknIHwgJ2hhcycgfCAnY2hpbGRyZW4nIHwgJ2VudHJpZXMnIHwgJ3ZhbHVlcycgfCdzaXplJyB9IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kXG4gKiBAdHlwZWRlZiB7ICdzZXQnIHwgJ3NldFdpdGhvdXROb3RpZnknIHwgJ2FwcGVuZCcgfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2RcbiAqIEB0eXBlZGVmIHtTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZCB8IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZCB9IFN0b3JhZ2VNZXNzYWdlTWV0aG9kXG4gKiBAdHlwZWRlZiB7IFtwYXRoOiBzdHJpbmddIH0gU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VBcmdzXG4gKiBAdHlwZWRlZiB7IFtwYXRoOiBzdHJpbmcsIHZhbHVlPzogc3RyaW5nIHwgbnVsbF0gfSBTdG9yYWdlRW50cnlcbiAqIEB0eXBlZGVmIHsgU3RvcmFnZUVudHJ5W10gfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VBcmdzXG4gKiBAdHlwZWRlZiB7e1xuICogICBtZXRob2Q6IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kO1xuICogICBhcmdzOiBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZUFyZ3M7XG4gKiAgfSB8IHtcbiAqICAgbWV0aG9kOiBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2Q7XG4gKiAgIGFyZ3M6IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZUFyZ3M7XG4gKiB9fSBTdG9yYWdlTWVzc2FnZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3pvbmUnKS5ab25lfSB6b25lXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZT0oem9uZSk9Pntcbi8qKlxuICogQ3JlYXRlIGEgc3RvcmFnZSBub2RlIGZvciBhIGdpdmVuIGJhY2tpbmcgc3RvcmFnZSBpbnRlcmZhY2UgYW5kIHBhdGguXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2NhbGxiYWNrJykuQ2FsbGJhY2s8KG1lc3NhZ2U6IFN0b3JhZ2VNZXNzYWdlKSA9PiBhbnk+fSBtZXNzZW5nZXIgYSBjYWxsYmFja1xuICogZm9yIHNlbmRpbmcgYSBzdG9yYWdlTWVzc2FnZSBvYmplY3QgdG8gdGhlIHN0b3JhZ2UgaW1wbGVtZW50YXRpb25cbiAqIChjZi4gZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3ZzdG9yYWdlLmdvKVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VxdWVuY2VdIHNldCB2YWx1ZXMgd2l0aCBgYXBwZW5kYCBtZXNzYWdlcyByYXRoZXIgdGhhbiBgc2V0YCBtZXNzYWdlc1xuICogc28gdGhlIGJhY2tpbmcgaW1wbGVtZW50YXRpb24gZW1wbG95cyBhIHdyYXBwaW5nIHN0cnVjdHVyZSB0aGF0XG4gKiBwcmVzZXJ2ZXMgZWFjaCB2YWx1ZSBzZXQgd2l0aGluIGEgc2luZ2xlIGJsb2NrLlxuICogQ2hpbGQgbm9kZXMgZGVmYXVsdCB0byBpbmhlcml0aW5nIHRoaXMgb3B0aW9uIGZyb20gdGhlaXIgcGFyZW50LlxuICogQHJldHVybnMge1N0b3JhZ2VOb2RlfVxuICovXG5jb25zdCBtYWtlQ2hhaW5TdG9yYWdlTm9kZT16b25lLmV4b0NsYXNzKFxuJ0NoYWluU3RvcmFnZU5vZGUnLFxuQ2hhaW5TdG9yYWdlTm9kZUksXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9jYWxsYmFjaycpLkNhbGxiYWNrPChtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55Pn0gbWVzc2VuZ2VyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW5jZV1cbiAqL1xuKG1lc3NlbmdlcixwYXRoLHtzZXF1ZW5jZT1mYWxzZX09e30pPT57XG5hc3NlcnQudHlwZW9mKHBhdGgsJ3N0cmluZycpO1xuYXNzZXJ0LnR5cGVvZihzZXF1ZW5jZSwnYm9vbGVhbicpO1xucmV0dXJuIGhhcmRlbih7cGF0aCxtZXNzZW5nZXIsc2VxdWVuY2V9KTtcbiB9LFxue1xuZ2V0UGF0aCgpe1xucmV0dXJuIHRoaXMuc3RhdGUucGF0aDtcbiB9LFxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UGF0aFxuICogQHR5cGUgeygpID0+IFByb21pc2U8VlN0b3JhZ2VLZXk+fVxuICovXG4gICAgICBhc3luYyBnZXRTdG9yZUtleSgpe1xuY29uc3R7cGF0aCxtZXNzZW5nZXJ9PXRoaXMuc3RhdGU7XG5yZXR1cm4gY2IuY2FsbEUobWVzc2VuZ2VyLHtcbm1ldGhvZDonZ2V0U3RvcmVLZXknLFxuYXJnczpbcGF0aF19KTtcblxuIH0sXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIGNoaWxkTm9kZU9wdGlvbnM/OiB7c2VxdWVuY2U/OiBib29sZWFufSkgPT4gU3RvcmFnZU5vZGV9ICovXG5tYWtlQ2hpbGROb2RlKG5hbWUsY2hpbGROb2RlT3B0aW9ucz17fSl7XG5jb25zdHtzZXF1ZW5jZSxwYXRoLG1lc3Nlbmdlcn09dGhpcy5zdGF0ZTtcbmFzc2VydFBhdGhTZWdtZW50KG5hbWUpO1xuY29uc3QgbWVyZ2VkT3B0aW9ucz17c2VxdWVuY2UsLi4uY2hpbGROb2RlT3B0aW9uc307XG5yZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGUoXG5tZXNzZW5nZXIsXG4gYCR7cGF0aH0uJHtuYW1lfWAsXG5tZXJnZWRPcHRpb25zKTtcblxuIH0sXG4vKiogQHR5cGUgeyh2YWx1ZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSAqL1xuICAgICAgYXN5bmMgc2V0VmFsdWUodmFsdWUpe1xuY29uc3R7c2VxdWVuY2UscGF0aCxtZXNzZW5nZXJ9PXRoaXMuc3RhdGU7XG5hc3NlcnQudHlwZW9mKHZhbHVlLCdzdHJpbmcnKTtcbi8qKiBAdHlwZSB7U3RvcmFnZUVudHJ5fSAqL1xubGV0IGVudHJ5O1xuaWYoIXNlcXVlbmNlJiYhdmFsdWUpe1xuZW50cnk9W3BhdGhdO1xuIH1lbHNle1xuZW50cnk9W3BhdGgsdmFsdWVdO1xuIH1cbmF3YWl0IGNiLmNhbGxFKG1lc3Nlbmdlcix7XG5tZXRob2Q6c2VxdWVuY2U/J2FwcGVuZCc6J3NldCcsXG5hcmdzOltlbnRyeV19KTtcblxuIH1cbi8qIFBvc3NpYmxlIGV4dGVuc2lvbnM6Ki9cbi8qICogZ2V0VmFsdWUoKSovXG4vKiAqIGdldENoaWxkTmFtZXMoKSBhbmQvb3IgbWFrZUNoaWxkTm9kZXMoKSovXG4vKiAqIGdldE5hbWUoKSovXG4vKiAqIHJlY3Vyc2l2ZSBkZWxldGUqL1xuLyogKiBiYXRjaCBvcGVyYXRpb25zKi9cbi8qICogbG9jYWwgYnVmZmVyaW5nICh3aXRoIGVuZC1vZi1ibG9jayBjb21taXQpKi99KTtcblxuXG5yZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGU7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKTtcblxuY29uc3QgbWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlPXByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKGhlYXBab25lKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBoZWFwLWJhc2VkIHJvb3Qgc3RvcmFnZSBub2RlIGZvciBhIGdpdmVuIGJhY2tpbmcgZnVuY3Rpb24gYW5kIHJvb3QgcGF0aC5cbiAqXG4gKiBAcGFyYW0geyhtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55fSBoYW5kbGVTdG9yYWdlTWVzc2FnZSBhIGZ1bmN0aW9uIGZvclxuICogc2VuZGluZyBhIHN0b3JhZ2VNZXNzYWdlIG9iamVjdCB0byB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvblxuICogKGNmLiBnb2xhbmcvY29zbW9zL3gvdnN0b3JhZ2UvdnN0b3JhZ2UuZ28pXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9vdFBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcm9vdE9wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyb290T3B0aW9ucy5zZXF1ZW5jZV0gZW1wbG95IGEgd3JhcHBpbmcgc3RydWN0dXJlIHRoYXRcbiAqIHByZXNlcnZlcyBlYWNoIHZhbHVlIHNldCB3aXRoaW4gYSBzaW5nbGUgYmxvY2ssIGFuZCBkZWZhdWx0IGNoaWxkIG5vZGVzXG4gKiB0byBkbyB0aGUgc2FtZVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZUNoYWluU3RvcmFnZVJvb3QoXG5oYW5kbGVTdG9yYWdlTWVzc2FnZSxcbnJvb3RQYXRoLFxucm9vdE9wdGlvbnM9e30pXG57XG5jb25zdCBtZXNzZW5nZXI9Y2IubWFrZUZ1bmN0aW9uQ2FsbGJhY2soaGFuZGxlU3RvcmFnZU1lc3NhZ2UpO1xuXG4vKiBVc2UgdGhlIGhlYXBab25lIGRpcmVjdGx5LiovXG5jb25zdCByb290Tm9kZT1tYWtlSGVhcENoYWluU3RvcmFnZU5vZGUobWVzc2VuZ2VyLHJvb3RQYXRoLHJvb3RPcHRpb25zKTtcbnJldHVybiByb290Tm9kZTtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge1N0b3JhZ2VOb2RlfSBhbiBvYmplY3QgdGhhdCBjb25maXJtcyB0byBTdG9yYWdlTm9kZSBBUEkgYnV0IGRvZXMgbm90IHN0b3JlIGFueXdoZXJlLlxuICovXG5jb25zdCBtYWtlTnVsbFN0b3JhZ2VOb2RlPSgpPT57XG4vKiBYWFggcmUtdXNlIFwiQ2hhaW5TdG9yYWdlXCIgbWV0aG9kcyBhYm92ZSB3aGljaCBkb24ndCBhY3R1YWxseSBkZXBlbmQgb24gY2hhaW5zKi9cbnJldHVybiBtYWtlQ2hhaW5TdG9yYWdlUm9vdCgoKT0+bnVsbCwnbnVsbCcpO1xuIH07XG5cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHJldHVybmluZyBhIHN0b3JhZ2Ugbm9kZSBhdCBvciB1bmRlciBpdHMgaW5wdXQsXG4gKiBmYWxsaW5nIGJhY2sgdG8gYW4gaW5lcnQgb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QgaW50ZXJmYWNlIChidXQgaW5jb21wbGV0ZVxuICogYmVoYXZpb3IpIHdoZW4gdGhhdCBpcyB1bmF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8U3RvcmFnZU5vZGU/Pn0gc3RvcmFnZU5vZGVSZWZcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGlsZE5hbWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFN0b3JhZ2VOb2RlPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gICAgICAgIG1ha2VTdG9yYWdlTm9kZUNoaWxkKHN0b3JhZ2VOb2RlUmVmLGNoaWxkTmFtZSl7XG5jb25zdCBleGlzdGluZ1N0b3JhZ2VOb2RlPWF3YWl0IHN0b3JhZ2VOb2RlUmVmO1xuY29uc3Qgc3RvcmFnZU5vZGU9ZXhpc3RpbmdTdG9yYWdlTm9kZXx8bWFrZU51bGxTdG9yYWdlTm9kZSgpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoY2hpbGROYW1lKTtcbiB9XG5oYXJkZW4obWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG4vKiBUT0RPIGZpbmQgYSBiZXR0ZXIgbW9kdWxlIGZvciB0aGlzKi9cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMgeyh2YWx1ZTogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXJpYWxpemVUb1N0b3JhZ2U9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5yZXR1cm4gYXN5bmModmFsdWUpPT57XG5jb25zdCBtYXJzaGFsbGVkPWF3YWl0IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbHVlKTtcbmNvbnN0IHNlcmlhbGl6ZWQ9SlNPTi5zdHJpbmdpZnkobWFyc2hhbGxlZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShtYWtlU2VyaWFsaXplVG9TdG9yYWdlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1N0cmVhbUNlbGwiOlsiaXNTdHJlYW1DZWxsIl0sImFzc2VydENhcERhdGEiOlsiYXNzZXJ0Q2FwRGF0YSJdLCJ1bm1hcnNoYWxGcm9tVnN0b3JhZ2UiOlsidW5tYXJzaGFsRnJvbVZzdG9yYWdlIl0sImFzc2VydFBhdGhTZWdtZW50IjpbImFzc2VydFBhdGhTZWdtZW50Il0sInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIjpbInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sIm1ha2VDaGFpblN0b3JhZ2VSb290IjpbIm1ha2VDaGFpblN0b3JhZ2VSb290Il0sIm1ha2VTdG9yYWdlTm9kZUNoaWxkIjpbIm1ha2VTdG9yYWdlTm9kZUNoaWxkIl0sIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiOlsibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABp8sRAJw8AACcPAAArAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjEvc3JjL21ldGhvZC10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYmluZEFsbE1ldGhvZHMiLCJnZXRNZXRob2ROYW1lcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc09iamVjdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKipcbiAqIEBmaWxlIG1ldGhvZC10b29scyB1c2UgZHluYW1pYyBwcm9wZXJ0eSBsb29rdXAsIHdoaWNoIGlzIG5vdCBKZXNzaWUtY29tcGF0aWJsZVxuICovXG5cbmNvbnN0e2dldFByb3RvdHlwZU9mLGNyZWF0ZSxmcm9tRW50cmllcyxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcbmNvbnN0e293bktleXMsYXBwbHl9PVJlZmxlY3Q7XG5cbi8qKlxuICogUHJpb3JpdGl6ZSBzeW1ib2xzIGFzIGVhcmxpZXIgdGhhbiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYVxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkPShhLGIpPT57XG5pZih0eXBlb2YgYT09PXR5cGVvZiBiKXtcbmNvbnN0IGxlZnQ9U3RyaW5nKGEpO1xuY29uc3QgcmlnaHQ9U3RyaW5nKGIpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbnJldHVybiBsZWZ0PHJpZ2h0Py0xOmxlZnQ+cmlnaHQ/MTowO1xuIH1cbmlmKHR5cGVvZiBhPT09J3N5bWJvbCcpe1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N0cmluZycpO1xucmV0dXJuLTE7XG4gfVxuYXNzZXJ0KHR5cGVvZiBhPT09J3N0cmluZycpO1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N5bWJvbCcpO1xucmV0dXJuIDE7XG4gfTtcblxuLyoqXG4gKiBUT0RPIENvbnNvbGlkYXRlIHdpdGggdGhlIGBnZXRNZXRob2ROYW1lc2AgaW4gYEBlbmRvL2V2ZW50dWFsLXNlbmRgXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gS1xuICogQHBhcmFtIHtSZWNvcmQ8SywgYW55Pn0gdmFsXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0TWV0aG9kTmFtZXM9KHZhbCk9PntcbmxldCBsYXllcj12YWw7XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7LyogU2V0IHRvIGRlZHVwbGljYXRlKi9cbndoaWxlKGxheWVyIT09bnVsbCYmbGF5ZXIhPT1PYmplY3QucHJvdG90eXBlKXtcbi8qIGJlIHRvbGVyYW50IG9mIG5vbi1vYmplY3RzKi9cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuY29uc3Qgb3duTmFtZXM9LyoqIEB0eXBlIHtLW119ICovb3duS2V5cyhkZXNjcyk7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25OYW1lcyl7XG4vKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4vKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuaWYodHlwZW9mIHZhbFtuYW1lXT09PSdmdW5jdGlvbicpe1xubmFtZXMuYWRkKG5hbWUpO1xuIH1cbiB9XG5pZighaXNPYmplY3QodmFsKSl7XG5icmVhaztcbiB9XG5sYXllcj1nZXRQcm90b3R5cGVPZihsYXllcik7XG4gfVxucmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG4gfTskaOKAjV9vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qKlxuICogVE9ETyBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGVhc2UgdGhlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81OTcwIHRyYW5zaXRpb24sIGZyb20gYWxsIG1ldGhvZHNcbiAqIGJlaW5nIG93biBwcm9wZXJ0aWVzIHRvIG1ldGhvZHMgYmVpbmcgaW5oZXJpdGVkIGZyb20gYSBjb21tb24gcHJvdG90eXBlLlxuICogVGhpcyB0cmFuc2l0aW9uIGJyZWFrcyB0d28gcGF0dGVybnMgdXNlZCBpbiBwcmlvciBjb2RlOiBhdXRvYmluZGluZyxcbiAqIGFuZCBlbnVtZXJhdGluZyBtZXRob2RzIGJ5IGVudW1lcmF0aW5nIG93biBwcm9wZXJ0aWVzLiBGb3IgYm90aCwgdGhlXG4gKiBwcmVmZXJyZWQgcmVwYWlycyBhcmVcbiAqICAgICogYXV0b2JpbmRpbmc6IFJlcGxhY2UsIGZvciBleGFtcGxlLFxuICogICAgICBgZm9vKG9iai5tZXRob2QpYCB3aXRoIGBmb28oYXJnID0+IGBvYmoubWV0aG9kKGFyZykpYC4gSU9XLCBzdG9wIHJlbHlpbmdcbiAqICAgICAgb24gZXhwcmVzc2lvbnMgbGlrZSBgb2JqLm1ldGhvZGAgdG8gZXh0cmFjdCBhIG1ldGhvZCBzdGlsbCBib3VuZCB0byB0aGVcbiAqICAgICAgc3RhdGUgb2YgYG9iamAgYmVjYXVzZSwgZm9yIHZpcnR1YWwgYW5kIGR1cmFibGUgb2JqZWN0cyxcbiAqICAgICAgdGhleSBubyBsb25nZXIgd2lsbCBhZnRlciAjNTk3MC5cbiAqICAgICogbWV0aG9kIGVudW1lcmF0aW9uOiBSZXBsYWNlLCBmb3IgZXhhbXBsZVxuICogICAgICBgUmVmbGVjdC5vd25LZXlzKG9iailgIHdpdGggYGdldE1ldGhvZE5hbWVzKG9iailgLlxuICpcbiAqIE9uY2UgYWxsIHByb2JsZW1hdGljIGNhc2VzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW4gdGhpcyBtYW5uZXIsIHRoaXNcbiAqIGBiaW5kQWxsTWV0aG9kc2AgaGFjayBjYW4gYW5kIFRPRE8gc2hvdWxkIGJlIGRlbGV0ZWQuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICogaGF2ZSBubyByZWxpYWJsZSBzdGF0aWMgd2F5IHRvIHRyYWNrIGRvd24gYW5kIGZpeCBhbGwgYXV0b2JpbmRpbmcgc2l0ZXMuXG4gKiBGb3IgdGhvc2Ugb2JqZWN0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZ1bGx5IHJlcGFpcmVkIGJ5IHRoZSBhYm92ZSB0d29cbiAqIHRlY2huaXF1ZXMsIGBiaW5kQWxsTWV0aG9kc2AgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBhY3RzIG11Y2ggbGlrZSB0aGVcbiAqIHByZS0jNTk3MCBvYmplY3RzLCB3aXRoIGFsbCB0aGVpciBtZXRob2RzIGFzIGluc3RhbmNlLWJvdW5kIG93biBwcm9wZXJ0aWVzLlxuICogSXQgZG9lcyB0aGlzIGJ5IG1ha2luZyBhIG5ldyBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGBvYmpgIHdoZXJlIHRoZSBuZXdcbiAqIG9iamVjdCBoYXMgYm91bmQgb3duIG1ldGhvZHMgb3ZlcnJpZGRpbmcgYWxsIHRoZSBtZXRob2RzIGl0IHdvdWxkIGhhdmVcbiAqIGluaGVyaXRlZCBmcm9tIGBvYmpgLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBhbnk+fSBUXG4gKiBAcGFyYW0ge1R9IG9ialxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICBiaW5kQWxsTWV0aG9kcz0ob2JqKT0+XG5oYXJkZW4oXG5jcmVhdGUoXG5vYmosXG5mcm9tRW50cmllcyhcbmdldE1ldGhvZE5hbWVzKG9iaikubWFwKChuYW1lKT0+W1xubmFtZSxcbntcbnZhbHVlOigvKiogQHR5cGUge3Vua25vd25bXX0gKi8uLi5hcmdzKT0+XG5hcHBseShvYmpbbmFtZV0sb2JqLGFyZ3MpLFxuZW51bWVyYWJsZTp0cnVlfV0pKSkpOyRo4oCNX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuXG5cblxuXG5cbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwiYmluZEFsbE1ldGhvZHMiOlsiYmluZEFsbE1ldGhvZHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVDn6ES0CAAAtAgAAKQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4xL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiU3RvcmFnZU5vZGVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdCAgICAgICAgU3RvcmFnZU5vZGVTaGFwZT1NLnJlbW90YWJsZSgnU3RvcmFnZU5vZGUnKTskaOKAjV9vbmNlLlN0b3JhZ2VOb2RlU2hhcGUoU3RvcmFnZU5vZGVTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiU3RvcmFnZU5vZGVTaGFwZSI6WyJTdG9yYWdlTm9kZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN7GoowrBwAAKwcAACoAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMS9zcmMvdXBncmFkZS1hcGkuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iLCJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNPYmplY3Q7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIEB0eXBlZGVmIHt7IG5hbWU6IHN0cmluZywgdXBncmFkZU1lc3NhZ2U6IHN0cmluZywgaW5jYXJuYXRpb25OdW1iZXI6IG51bWJlciB9fSBEaXNjb25uZWN0aW9uT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBNYWtlcyBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgdXNlIGFzIHRoZSByZWplY3Rpb24gdmFsdWUgb2YgcHJvbWlzZXNcbiAqIGFiYW5kb25lZCBieSB1cGdyYWRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cGdyYWRlTWVzc2FnZVxuICogQHBhcmFtIHtudW1iZXJ9IHRvSW5jYXJuYXRpb25OdW1iZXJcbiAqIEByZXR1cm5zIHtEaXNjb25uZWN0aW9uT2JqZWN0fVxuICovXG5jb25zdCAgICAgICAgbWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uPSh1cGdyYWRlTWVzc2FnZSx0b0luY2FybmF0aW9uTnVtYmVyKT0+XG5oYXJkZW4oe1xubmFtZTondmF0VXBncmFkZWQnLFxudXBncmFkZU1lc3NhZ2UsXG5pbmNhcm5hdGlvbk51bWJlcjp0b0luY2FybmF0aW9uTnVtYmVyfSk7JGjigI1fb25jZS5tYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuaGFyZGVuKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbi8qIFRPRE86IFNpbXBsaWZ5IG9uY2Ugd2UgaGF2ZSBAZW5kby9wYXR0ZXJucyAob3IganVzdCBleHBvcnQgdGhlIHNoYXBlKS4qL1xuLyogY29uc3QgdXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSA9IGhhcmRlbih7Ki9cbi8qIG5hbWU6ICd2YXRVcGdyYWRlZCcsKi9cbi8qIHVwZ3JhZGVNZXNzYWdlOiBNLnN0cmluZygpLCovXG4vKiBpbmNhcm5hdGlvbk51bWJlcjogTS5udW1iZXIoKSwqL1xuLyogfSk7Ki9cbi8qIGNvbnN0IGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSBlcnIgPT4gbWF0Y2hlcyhlcnIsIHVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpOyovXG4vKipcbiAqIEBwYXJhbSB7YW55fSBlcnJcbiAqIEByZXR1cm5zIHtlcnIgaXMgRGlzY29ubmVjdGlvbk9iamVjdH1cbiAqL1xuY29uc3QgICAgICAgIGlzVXBncmFkZURpc2Nvbm5lY3Rpb249KGVycik9PlxuaXNPYmplY3QoZXJyKSYmXG5lcnIubmFtZT09PSd2YXRVcGdyYWRlZCcmJlxudHlwZW9mIGVyci51cGdyYWRlTWVzc2FnZT09PSdzdHJpbmcnJiZcbnR5cGVvZiBlcnIuaW5jYXJuYXRpb25OdW1iZXI9PT0nbnVtYmVyJzskaOKAjV9vbmNlLmlzVXBncmFkZURpc2Nvbm5lY3Rpb24oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5oYXJkZW4oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIjpbIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIjpbImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoumxkuM8AADjPAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4xL3NyYy91dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9zdHJlYW0iLCJqZXNzaWUuanMiXSwiZXhwb3J0cyI6WyJCQVNJU19QT0lOVFMiLCJQcm9taXNlQWxsT3JFcnJvcnMiLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IiwiYWxsVmFsdWVzIiwiYXBwbHlMYWJlbGluZ0Vycm9yIiwiYXNzZXJ0QWxsRGVmaW5lZCIsImRlZXBseUZ1bGZpbGxlZE9iamVjdCIsImZvcmV2ZXIiLCJmcm9tVW5pcXVlRW50cmllcyIsImxpc3REaWZmZXJlbmNlIiwibWFrZUFnZ3JlZ2F0ZUVycm9yIiwibWFrZU1lYXN1cmVTZWNvbmRzIiwib2JqZWN0TWFwIiwic3luY2hyb25pemVkVGVlIiwidGhyb3dMYWJlbGVkIiwidW50aWxUcnVlIiwid2hpbGVUcnVlIiwiemlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsZGVlcGx5RnVsZmlsbGVkLGlzT2JqZWN0LGlzUHJvbWlzZSxtYWtlUHJvbWlzZUtpdCxtYWtlUXVldWUsYXN5bmNHZW5lcmF0ZSxtYWtlU2V0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIiwgWyRo4oCNX2EgPT4gKGRlZXBseUZ1bGZpbGxlZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV0sW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3N0cmVhbVwiLCBbW1wibWFrZVF1ZXVlXCIsIFskaOKAjV9hID0+IChtYWtlUXVldWUgPSAkaOKAjV9hKV1dXV0sW1wiamVzc2llLmpzXCIsIFtbXCJhc3luY0dlbmVyYXRlXCIsIFskaOKAjV9hID0+IChhc3luY0dlbmVyYXRlID0gJGjigI1fYSldXSxbXCJtYWtlU2V0XCIsIFskaOKAjV9hID0+IChtYWtlU2V0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZW50cmllcyxmcm9tRW50cmllcyxrZXlzLHZhbHVlc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgQkFTSVNfUE9JTlRTPTEwXzAwMG47XG5cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWY8VD4gKi9cblxuLyoqXG4gKiBUaHJvd3MgaWYgbXVsdGlwbGUgZW50cmllcyB1c2UgdGhlIHNhbWUgcHJvcGVydHkgbmFtZS4gT3RoZXJ3aXNlIGFjdHNcbiAqIGxpa2UgYE9iamVjdC5mcm9tRW50cmllc2AgYnV0IGhhcmRlbnMgdGhlIHJlc3VsdC5cbiAqIFVzZSBpdCB0byBwcm90ZWN0IGZyb20gcHJvcGVydHkgbmFtZXMgY29tcHV0ZWQgZnJvbSB1c2VyLXByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxWXT59IGFsbEVudHJpZXNcbiAqIEByZXR1cm5zIHt7W2s6IEtdOiBWfX1cbiAqLyRo4oCNX29uY2UuQkFTSVNfUE9JTlRTKEJBU0lTX1BPSU5UUyk7XG5jb25zdCAgICAgICAgZnJvbVVuaXF1ZUVudHJpZXM9KGFsbEVudHJpZXMpPT57XG5jb25zdCBlbnRyaWVzQXJyYXk9Wy4uLmFsbEVudHJpZXNdO1xuY29uc3QgcmVzdWx0PWhhcmRlbihmcm9tRW50cmllcyhlbnRyaWVzQXJyYXkpKTtcbmlmKG93bktleXMocmVzdWx0KS5sZW5ndGg9PT1lbnRyaWVzQXJyYXkubGVuZ3RoKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuY29uc3QgbmFtZXM9bWFrZVNldCgpO1xuZm9yKGNvbnN0W25hbWUsX11vZiBlbnRyaWVzQXJyYXkpe1xuaWYobmFtZXMuaGFzKG5hbWUpKXtcbkZhaWwgYGNvbGxpc2lvbiBvbiBwcm9wZXJ0eSBuYW1lICR7cShuYW1lKX06ICR7ZW50cmllc0FycmF5fWA7XG4gfVxubmFtZXMuYWRkKG5hbWUpO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCBmcm9tIHVuaXF1ZSBlbnRyaWVzYDtcbiB9OyRo4oCNX29uY2UuZnJvbVVuaXF1ZUVudHJpZXMoZnJvbVVuaXF1ZUVudHJpZXMpO1xuaGFyZGVuKGZyb21VbmlxdWVFbnRyaWVzKTtcblxuLyoqXG4gKiBCeSBhbmFsb2d5IHdpdGggaG93IGBBcnJheS5wcm90b3R5cGUubWFwYCB3aWxsIG1hcCB0aGUgZWxlbWVudHMgb2ZcbiAqIGFuIGFycmF5IHRvIHRyYW5zZm9ybWVkIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNoYXBlLFxuICogYG9iamVjdE1hcGAgd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIHN0cmluZy1uYW1lZCBvd24gZW51bWVyYWJsZVxuICogcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVHlwaWNhbCB1c2FnZSBhcHBsaWVzIGBvYmplY3RNYXBgIHRvIGEgQ29weVJlY29yZCwgaS5lLixcbiAqIGFuIG9iamVjdCBmb3Igd2hpY2ggYHBhc3NTdHlsZU9mKG9yaWdpbmFsKSA9PT0gJ2NvcHlSZWNvcmQnYC4gRm9yIHRoZXNlLFxuICogbm9uZSBvZiB0aGUgZm9sbG93aW5nIGVkZ2UgY2FzZXMgYXJpc2UuIFRoZSByZXN1bHQgd2lsbCBiZSBhIENvcHlSZWNvcmRcbiAqIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lcywgd2hvc2UgdmFsdWVzIGFyZSB0aGUgbWFwcGVkIGZvcm0gb2ZcbiAqIHRoZSBvcmlnaW5hbCdzIHZhbHVlcy5cbiAqXG4gKiBXaGVuIHRoZSBvcmlnaW5hbCBpcyBub3QgYSBDb3B5UmVjb3JkLCBzb21lIGVkZ2UgY2FzZXMgdG8gYmUgYXdhcmUgb2ZcbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIE9ubHkgdGhlIHN0cmluZy1uYW1lZCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbFxuICogICAgICBhcmUgbWFwcGVkLiBBbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgaWdub3JlZC5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCBgT2JqZWN0LmVudHJpZXNgXG4gKiAgICAgIHdpbGwgY2F1c2UgaXRzIGBnZXR0ZXJgIHRvIGJlIGNhbGxlZCBhbmQgd2lsbCB1c2UgdGhlIHJlc3VsdGluZ1xuICogICAgICB2YWx1ZS5cbiAqICAgICogTm8gbWF0dGVyIHdoZXRoZXIgdGhlIG9yaWdpbmFsIHByb3BlcnR5IHdhcyBhbiBhY2Nlc3Nvciwgd3JpdGFibGUsXG4gKiAgICAgIG9yIGNvbmZpZ3VyYWJsZSwgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogICAgICBub24td3JpdGFibGUsIG5vbi1jb25maWd1cmFibGUsIGRhdGEgcHJvcGVydGllcy5cbiAqICAgICogTm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCBtYXkgaGF2ZSBpbmhlcml0ZWQgZnJvbSwgYW5kXG4gKiAgICAgIG5vIG1hdHRlciB3aGV0aGVyIGl0IHdhcyBhIHNwZWNpYWwga2luZCBvZiBvYmplY3Qgc3VjaCBhcyBhbiBhcnJheSxcbiAqICAgICAgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCBpbmhlcml0aW5nIGRpcmVjdGx5XG4gKiAgICAgIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFuZCB3aG9zZSBzdGF0ZSBpcyBvbmx5IHRoZXNlIG5ldyBtYXBwZWRcbiAqICAgICAgb3duIHByb3BlcnRpZXMuXG4gKlxuICogV2l0aCB0aGVzZSBkaWZmZXJlbmNlcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyBub3QgYSBDb3B5UmVjb3JkLFxuICogaWYgYWxsIHRoZSBtYXBwZWQgdmFsdWVzIGFyZSBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqIGEgQ29weVJlY29yZC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IE9cbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEB0ZW1wbGF0ZSBSIG1hcCByZXN1bHRcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW2tleW9mIE9dLCBrZXk6IGtleW9mIE8pID0+IFJ9IG1hcEZuXG4gKiBAcmV0dXJucyB7eyBbUCBpbiBrZXlvZiBPXTogUn19XG4gKi9cbmNvbnN0ICAgICAgICBvYmplY3RNYXA9KG9yaWdpbmFsLG1hcEZuKT0+e1xuY29uc3QgZW50cz1lbnRyaWVzKG9yaWdpbmFsKTtcbmNvbnN0IG1hcEVudHM9ZW50cy5tYXAoKFtrLHZdKT0+W2ssbWFwRm4odixrKV0pO1xucmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSk7XG4gfTskaOKAjV9vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSBsZWZ0TmFtZXNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gcmlnaHROYW1lc1xuICovXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnROYW1lcyxyaWdodE5hbWVzKT0+e1xuY29uc3QgcmlnaHRTZXQ9bWFrZVNldChyaWdodE5hbWVzKTtcbnJldHVybiBsZWZ0TmFtZXMuZmlsdGVyKChuYW1lKT0+IXJpZ2h0U2V0LmhhcyhuYW1lKSk7XG4gfTskaOKAjV9vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdXG4gKiBAcmV0dXJucyB7bmV2ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB0aHJvd0xhYmVsZWQ9KGlubmVyRXJyLGxhYmVsLEVycm9yQ29uc3RydWN0b3I9dW5kZWZpbmVkKT0+e1xuaWYodHlwZW9mIGxhYmVsPT09J251bWJlcicpe1xubGFiZWw9IGBbJHtsYWJlbH1dYDtcbiB9XG5jb25zdCBvdXRlckVycj1hc3NlcnQuZXJyb3IoXG4gYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YCxcbkVycm9yQ29uc3RydWN0b3IpO1xuXG5hc3NlcnQubm90ZShvdXRlckVycixYIGBDYXVzZWQgYnkgJHtpbm5lckVycn1gKTtcbnRocm93IG91dGVyRXJyO1xuIH07JGjigI1fb25jZS50aHJvd0xhYmVsZWQodGhyb3dMYWJlbGVkKTtcbmhhcmRlbih0aHJvd0xhYmVsZWQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBBLFJcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gUn0gZnVuY1xuICogQHBhcmFtIHtBW119IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge1J9XG4gKi9cbmNvbnN0ICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3I9KGZ1bmMsYXJncyxsYWJlbD11bmRlZmluZWQpPT57XG5pZihsYWJlbD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYyguLi5hcmdzKTtcbiB9XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG50aHJvd0xhYmVsZWQoZXJyLGxhYmVsKTtcbiB9XG5pZihpc1Byb21pc2UocmVzdWx0KSl7XG4vKiBJZiByZXN1bHQgaXMgYSByZWplY3RlZCBwcm9taXNlLCB0aGlzIHdpbGwgcmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEqL1xuLyogZGlmZmVyZW50IHJlamVjdGlvbiByZWFzb24uIEJ1dCB0aGlzIGNvbmZ1c2VzIFR5cGVTY3JpcHQgYmVjYXVzZSBpdCB0eXBlcyovXG4vKiB0aGF0IGNhc2UgYXMgYFByb21pc2U8bmV2ZXI+YCB3aGljaCBpcyBjb29sIGZvciBhIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyKi9cbi8qIGZ1bGZpbGwuICBCdXQgVHlwZVNjcmlwdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGlzIHdpbGwgb25seSBoYXBwZW4qL1xuLyogd2hlbiBgcmVzdWx0YCB3YXMgYSByZWplY3RlZCBwcm9taXNlLiBJbiBvbmx5IHRoaXMgY2FzZSBgUmAgc2hvdWxkKi9cbi8qIGFscmVhZHkgYWxsb3cgYFByb21pc2U8bmV2ZXI+YCBhcyBhIHN1YnR5cGUuKi9cbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IHJlbGFiZWxlZD1FLndoZW4ocmVzdWx0LHVuZGVmaW5lZCwocmVhc29uKT0+XG50aHJvd0xhYmVsZWQocmVhc29uLGxhYmVsKSk7XG5cbnJldHVybiAoLyoqIEB0eXBlIHtSfSAqL3JlbGFiZWxlZCk7XG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tbS2V5VHlwZSBpbiBrZXlvZiBUXTogVFtLZXlUeXBlXX0gJiB7fX0gU2ltcGxpZnlcbiAqIGZsYXR0ZW4gdGhlIHR5cGUgb3V0cHV0IHRvIGltcHJvdmUgdHlwZSBoaW50cyBzaG93biBpbiBlZGl0b3JzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3NpbXBsaWZ5LmQudHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0eXBlZGVmIHt7IFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ2FsbGFibGUgPyBUW0tdIDogRGVlcGx5QXdhaXRlZDxUW0tdPiB9fSBEZWVwbHlBd2FpdGVkT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyBQcm9taXNlTGlrZTxhbnk+ID8gQXdhaXRlZDxUPiA6IFQgZXh0ZW5kcyB7fSA/IFNpbXBsaWZ5PERlZXBseUF3YWl0ZWRPYmplY3Q8VD4+IDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogQSBtb3JlIGNvbnN0cmFpbmVkIHZlcnNpb24gb2Yge2RlZXBseUZ1bGZpbGxlZH0gZm9yIHR5cGUgc2FmZXR5IHVudGlsXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzEyNTdcbiAqIFVzZWZ1bCBpbiBzdGFydGluZyBjb250cmFjdHMgdGhhdCBuZWVkIGFsbCB0ZXJtcyB0byBiZSBmdWxmaWxsZWRcbiAqIGluIG9yZGVyIHRvIGJlIGR1cmFibGUuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMge30+KHVuZnVsZmlsbGVkVGVybXM6IFQpID0+IFByb21pc2U8RGVlcGx5QXdhaXRlZDxUPj59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWRPYmplY3Q9YXN5bmMob2JqKT0+e1xuaXNPYmplY3Qob2JqKXx8RmFpbCBgcGFyYW0gbXVzdCBiZSBhbiBvYmplY3RgO1xucmV0dXJuIGRlZXBseUZ1bGZpbGxlZChvYmopO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdXNlcyBhIG1pbGxpc2Vjb25kLWJhc2VkIHRpbWUtc2luY2UtZXBvY2ggY2FwYWJpbGl0eVxuICogKHN1Y2ggYXMgYHBlcmZvcm1hbmNlLm5vd2ApIHRvIG1lYXN1cmUgZXhlY3V0aW9uIHRpbWUgb2YgYW4gYXN5bmMgZnVuY3Rpb25cbiAqIGFuZCByZXBvcnQgdGhlIHJlc3VsdCBpbiBzZWNvbmRzIHRvIG1hdGNoIG91ciB0ZWxlbWV0cnkgc3RhbmRhcmQuXG4gKlxuICogQHBhcmFtIHt0eXBlb2YgWGltcG9ydCgncGVyZl9ob29rcycpLnBlcmZvcm1hbmNlLm5vd30gY3VycmVudFRpbWVNaWxsaXNlY1xuICogQHJldHVybnMgezxUPihmbjogKCkgPT4gUHJvbWlzZTxUPikgPT4gUHJvbWlzZTx7IHJlc3VsdDogVCwgZHVyYXRpb246IG51bWJlciB9Pn1cbiAqLyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkT2JqZWN0KGRlZXBseUZ1bGZpbGxlZE9iamVjdCk7XG5jb25zdCAgICAgICAgbWFrZU1lYXN1cmVTZWNvbmRzPShjdXJyZW50VGltZU1pbGxpc2VjKT0+e1xuLyoqIEBwYXJhbSB7KCkgPT4gYW55fSBmbiAqL1xuY29uc3QgbWVhc3VyZVNlY29uZHM9YXN5bmMoZm4pPT57XG5jb25zdCB0MD1jdXJyZW50VGltZU1pbGxpc2VjKCk7XG5jb25zdCByZXN1bHQ9YXdhaXQgZm4oKTtcbmNvbnN0IGR1cmF0aW9uTWlsbGlzZWM9Y3VycmVudFRpbWVNaWxsaXNlYygpLXQwO1xucmV0dXJue3Jlc3VsdCxkdXJhdGlvbjpkdXJhdGlvbk1pbGxpc2VjLzEwMDB9O1xuIH07XG5yZXR1cm4gbWVhc3VyZVNlY29uZHM7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yW119IGVycm9yc1xuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXVxuICovJGjigI1fb25jZS5tYWtlTWVhc3VyZVNlY29uZHMobWFrZU1lYXN1cmVTZWNvbmRzKTtcbmNvbnN0ICAgICAgICBtYWtlQWdncmVnYXRlRXJyb3I9KGVycm9ycyxtZXNzYWdlKT0+e1xuY29uc3QgZXJyPUVycm9yKG1lc3NhZ2UpO1xuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZXJyLHtcbm5hbWU6e1xudmFsdWU6J0FnZ3JlZ2F0ZUVycm9yJ30sXG5cbmVycm9yczp7XG52YWx1ZTplcnJvcnN9fSk7XG5cblxucmV0dXJuIGVycjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3JlYWRvbmx5IChUIHwgUHJvbWlzZUxpa2U8VD4pW119IGl0ZW1zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUW10+fVxuICovJGjigI1fb25jZS5tYWtlQWdncmVnYXRlRXJyb3IobWFrZUFnZ3JlZ2F0ZUVycm9yKTtcbmNvbnN0ICAgICAgICBQcm9taXNlQWxsT3JFcnJvcnM9YXN5bmMoaXRlbXMpPT57XG5yZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGl0ZW1zKS50aGVuKChyZXN1bHRzKT0+e1xuY29uc3QgZXJyb3JzPS8qKiBAdHlwZSB7UHJvbWlzZVJlamVjdGVkUmVzdWx0W119ICovXG5yZXN1bHRzLmZpbHRlcigoe3N0YXR1c30pPT5zdGF0dXM9PT0ncmVqZWN0ZWQnKS5cbm1hcCgocmVzdWx0KT0+cmVzdWx0LnJlYXNvbik7XG5pZighZXJyb3JzLmxlbmd0aCl7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxUPltdfSAqL3Jlc3VsdHMubWFwKFxuKHJlc3VsdCk9PnJlc3VsdC52YWx1ZSkpO1xuXG4gfWVsc2UgaWYoZXJyb3JzLmxlbmd0aD09PTEpe1xudGhyb3cgZXJyb3JzWzBdO1xuIH1lbHNle1xudGhyb3cgbWFrZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gfVxuIH0pO1xuIH07XG5cbi8qKlxuICogQHR5cGUgezxUPihcbiAqICAgdHJpZXI6ICgpID0+IFByb21pc2U8VD4sXG4gKiAgZmluYWxpemVyOiAoZXJyb3I/OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+LFxuICogKSA9PiBQcm9taXNlPFQ+fVxuICovJGjigI1fb25jZS5Qcm9taXNlQWxsT3JFcnJvcnMoUHJvbWlzZUFsbE9yRXJyb3JzKTtjb25zdCBhZ2dyZWdhdGVUcnlGaW5hbGx5PWFzeW5jKHRyaWVyLGZpbmFsaXplcik9PlxudHJpZXIoKS50aGVuKFxuYXN5bmMocmVzdWx0KT0+ZmluYWxpemVyKCkudGhlbigoKT0+cmVzdWx0KSxcbmFzeW5jKHRyeUVycm9yKT0+XG5maW5hbGl6ZXIodHJ5RXJyb3IpLlxudGhlbihcbigpPT50cnlFcnJvcixcbihmaW5hbGl6ZUVycm9yKT0+bWFrZUFnZ3JlZ2F0ZUVycm9yKFt0cnlFcnJvcixmaW5hbGl6ZUVycm9yXSkpLlxuXG50aGVuKChlcnJvcik9PlByb21pc2UucmVqZWN0KGVycm9yKSkpO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gVFxuICogQHR5cGVkZWYge3tbUCBpbiBrZXlvZiBUXTogRXhjbHVkZTxUW1BdLCB1bmRlZmluZWQ+O319IEFsbERlZmluZWRcbiAqL1xuXG4vKipcbiAqIENvbmNpc2Ugd2F5IHRvIGNoZWNrIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGZyb20gb2JqZWN0IGxpdGVyYWwgc2hvcnRoYW5kLlxuICogVGhyb3dzIGVycm9yIG1lc3NhZ2UgdG8gc3BlY2lmeSB0aGUgbWlzc2luZyB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gVFxuICogQHBhcmFtIHtUfSBvYmpcbiAqIEB0aHJvd3MgaWYgYW55IHZhbHVlIGluIHRoZSBvYmplY3QgZW50cmllcyBpcyBub3QgZGVmaW5lZFxuICogQHJldHVybnMge2Fzc2VydHMgb2JqIGlzIEFsbERlZmluZWQ8VD59XG4gKi8kaOKAjV9vbmNlLmFnZ3JlZ2F0ZVRyeUZpbmFsbHkoYWdncmVnYXRlVHJ5RmluYWxseSk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRBbGxEZWZpbmVkPShvYmopPT57XG5jb25zdCBtaXNzaW5nPVtdO1xuZm9yKGNvbnN0W2tleSx2YWxdb2YgT2JqZWN0LmVudHJpZXMob2JqKSl7XG5pZih2YWw9PT11bmRlZmluZWQpe1xubWlzc2luZy5wdXNoKGtleSk7XG4gfVxuIH1cbmlmKG1pc3NpbmcubGVuZ3RoPjApe1xuRmFpbCBgbWlzc2luZyAke3EobWlzc2luZyl9YDtcbiB9XG4gfTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDx1bmRlZmluZWQsIG5ldmVyPn0gKi8kaOKAjV9vbmNlLmFzc2VydEFsbERlZmluZWQoYXNzZXJ0QWxsRGVmaW5lZCk7XG5jb25zdCBub3REb25lPWhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTp1bmRlZmluZWR9KTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxuZXZlciwgdm9pZD59ICovXG5jb25zdCBhbHdheXNEb25lPWhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuXG5jb25zdCAgICAgICAgZm9yZXZlcj1hc3luY0dlbmVyYXRlKCgpPT5ub3REb25lKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUfSBwcm9kdWNlXG4gKiBUaGUgdmFsdWUgb2YgYGF3YWl0IHByb2R1Y2UoKWAgaXMgdXNlZCBmb3IgaXRzIHRydXRoaW5lc3MgdnMgZmFsc2luZXNzLlxuICogSU9XLCBpdCBpcyBjb2VyY2VkIHRvIGEgYm9vbGVhbiBzbyB0aGUgY2FsbGVyIG5lZWQgbm90IGJvdGhlciBkb2luZyB0aGlzXG4gKiB0aGVtc2VsdmVzLlxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8QXdhaXRlZDxUPj59XG4gKi8kaOKAjV9vbmNlLmZvcmV2ZXIoZm9yZXZlcik7XG5jb25zdCAgICAgICAgd2hpbGVUcnVlPShwcm9kdWNlKT0+XG5hc3luY0dlbmVyYXRlKGFzeW5jKCk9PntcbmNvbnN0IHZhbHVlPWF3YWl0IHByb2R1Y2UoKTtcbmlmKCF2YWx1ZSl7XG5yZXR1cm4gYWx3YXlzRG9uZTtcbiB9XG5yZXR1cm4gaGFyZGVuKHtcbmRvbmU6ZmFsc2UsXG52YWx1ZX0pO1xuXG4gfSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVH0gcHJvZHVjZVxuICogVGhlIHZhbHVlIG9mIGBhd2FpdCBwcm9kdWNlKClgIGlzIHVzZWQgZm9yIGl0cyB0cnV0aGluZXNzIHZzIGZhbHNpbmVzcy5cbiAqIElPVywgaXQgaXMgY29lcmNlZCB0byBhIGJvb2xlYW4gc28gdGhlIGNhbGxlciBuZWVkIG5vdCBib3RoZXIgZG9pbmcgdGhpc1xuICogdGhlbXNlbHZlcy5cbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPEF3YWl0ZWQ8VD4+fVxuICovJGjigI1fb25jZS53aGlsZVRydWUod2hpbGVUcnVlKTtcbmNvbnN0ICAgICAgICB1bnRpbFRydWU9KHByb2R1Y2UpPT5cbmFzeW5jR2VuZXJhdGUoYXN5bmMoKT0+e1xuY29uc3QgdmFsdWU9YXdhaXQgcHJvZHVjZSgpO1xuaWYodmFsdWUpe1xucmV0dXJuIGhhcmRlbih7XG5kb25lOnRydWUsXG52YWx1ZX0pO1xuXG4gfVxucmV0dXJuIGhhcmRlbih7XG5kb25lOmZhbHNlLFxudmFsdWV9KTtcblxuIH0pO1xuXG4vKiogQHR5cGUgeyA8WCwgWT4oeHM6IFhbXSwgeXM6IFlbXSkgPT4gW1gsIFldW119ICovJGjigI1fb25jZS51bnRpbFRydWUodW50aWxUcnVlKTtcbmNvbnN0ICAgICAgICB6aXA9KHhzLHlzKT0+aGFyZGVuKHhzLm1hcCgoeCxpKT0+W3gseXNbK2ldXSkpO1xuXG4vKiogQHR5cGUgeyA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEVSZWY8YW55Pj4+KG9iajogVCkgPT4gUHJvbWlzZTx7IFtLIGluIGtleW9mIFRdOiBBd2FpdGVkPFRbS10+fT4gfSAqLyRo4oCNX29uY2UuemlwKHppcCk7XG5jb25zdCAgICAgICAgYWxsVmFsdWVzPWFzeW5jKG9iaik9PntcbmNvbnN0IHJlc29sdmVkPWF3YWl0IFByb21pc2UuYWxsKHZhbHVlcyhvYmopKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKHppcChrZXlzKG9iaikscmVzb2x2ZWQpKSk7XG4gfTtcblxuLyoqXG4gKiBBIHRlZSBpbXBsZW1lbnRhdGlvbiB3aGVyZSBhbGwgcmVhZGVycyBhcmUgc3luY2hyb25pemVkIHdpdGggZWFjaCBvdGhlci5cbiAqIFRoZXkgYWxsIGNvbnN1bWUgdGhlIHNvdXJjZSBzdHJlYW0gaW4gbG9ja3N0ZXAsIGFuZCBhbnkgb25lIHJldHVybmluZyBvclxuICogdGhyb3dpbmcgZWFybHkgd2lsbCBhZmZlY3QgdGhlIG90aGVycy5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7QXN5bmNJdGVyYXRvcjxULCB2b2lkLCB2b2lkPn0gc291cmNlU3RyZWFtXG4gKiBAcGFyYW0ge251bWJlcn0gcmVhZGVyQ291bnRcbiAqLyRo4oCNX29uY2UuYWxsVmFsdWVzKGFsbFZhbHVlcyk7XG5jb25zdCAgICAgICAgc3luY2hyb25pemVkVGVlPShzb3VyY2VTdHJlYW0scmVhZGVyQ291bnQpPT57XG4vKiogQHR5cGUge0l0ZXJhdG9yUmV0dXJuUmVzdWx0PHZvaWQ+IHwgdW5kZWZpbmVkfSAqL1xubGV0IGRvbmVSZXN1bHQ7XG5cbi8qKiBAdHlwZWRlZiB7SXRlcmF0b3JSZXN1bHQ8KHZhbHVlOiBQcm9taXNlTGlrZTxJdGVyYXRvclJlc3VsdDxUPj4pID0+IHZvaWQ+fSBRdWV1ZVBheWxvYWQgKi9cbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vc3RyZWFtJykuQXN5bmNRdWV1ZTxRdWV1ZVBheWxvYWQ+W119ICovXG5jb25zdCBxdWV1ZXM9W107XG5cbi8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbmNvbnN0IHB1bGxOZXh0PWFzeW5jKCk9PntcbmNvbnN0IHJlcXVlc3RzPWF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChxdWV1ZXMubWFwKChxdWV1ZSk9PnF1ZXVlLmdldCgpKSk7XG5jb25zdCByZWplY3Rpb25zPVtdO1xuLyoqIEB0eXBlIHtBcnJheTwodmFsdWU6IFByb21pc2VMaWtlPEl0ZXJhdG9yUmVzdWx0PFQ+PikgPT4gdm9pZD59ICovXG5jb25zdCByZXNvbHZlcnM9W107XG5sZXQgZG9uZT1mYWxzZTtcbmZvcihjb25zdCBzZXR0bGVkUmVzdWx0IG9mIHJlcXVlc3RzKXtcbmlmKHNldHRsZWRSZXN1bHQuc3RhdHVzPT09J3JlamVjdGVkJyl7XG5yZWplY3Rpb25zLnB1c2goc2V0dGxlZFJlc3VsdC5yZWFzb24pO1xuIH1lbHNle1xuZG9uZXx8PSEhc2V0dGxlZFJlc3VsdC52YWx1ZS5kb25lO1xucmVzb2x2ZXJzLnB1c2goc2V0dGxlZFJlc3VsdC52YWx1ZS52YWx1ZSk7XG4gfVxuIH1cbi8qKiBAdHlwZSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj59ICovXG5sZXQgcmVzdWx0O1xuaWYoZG9uZVJlc3VsdCl7XG5yZXN1bHQ9UHJvbWlzZS5yZXNvbHZlKGRvbmVSZXN1bHQpO1xuIH1lbHNlIGlmKHJlamVjdGlvbnMubGVuZ3RoKXtcbmNvbnN0IGVycm9yPWFzc2VydC5lcnJvcihhc3NlcnQuZGV0YWlscyBgVGVlZCBzdHJlYW0gdGhyZXdgKTtcbmFzc2VydC5ub3RlKGVycm9yLGFzc2VydC5kZXRhaWxzIGBUZWVkIHJlamVjdGlvbnM6ICR7cmVqZWN0aW9uc31gKTtcbnJlc3VsdD1cbnNvdXJjZVN0cmVhbS50aHJvdz8uKGVycm9yKXx8XG5Qcm9taXNlLnJlc29sdmUoc291cmNlU3RyZWFtLnJldHVybj8uKCkpLnRoZW4oKCk9PlxuUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcblxuIH1lbHNlIGlmKGRvbmUpe1xucmVzdWx0PVxuc291cmNlU3RyZWFtLnJldHVybj8uKCl8fFxuUHJvbWlzZS5yZXNvbHZlKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfWVsc2V7XG5yZXN1bHQ9c291cmNlU3RyZWFtLm5leHQoKTtcbiB9XG5yZXN1bHQudGhlbihcbihyKT0+e1xuaWYoci5kb25lKXtcbmRvbmVSZXN1bHQ9cjtcbiB9XG4gfSxcbigpPT57XG5kb25lUmVzdWx0PXtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfTtcbiB9KTtcblxucmVzb2x2ZXJzLmZvckVhY2goKHJlc29sdmUpPT5yZXNvbHZlKHJlc3VsdCkpO1xucmV0dXJuIHB1bGxOZXh0KCk7XG4gfTtcblxuY29uc3QgcmVhZGVycz1BcnJheS5mcm9tKHtsZW5ndGg6cmVhZGVyQ291bnR9KS5tYXAoKCk9Pntcbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vc3RyZWFtJykuQXN5bmNRdWV1ZTxRdWV1ZVBheWxvYWQ+fSAqL1xuY29uc3QgcXVldWU9bWFrZVF1ZXVlKCk7XG5xdWV1ZXMucHVzaChxdWV1ZSk7XG5cbi8qKiBAdHlwZSB7QXN5bmNHZW5lcmF0b3I8VCwgdm9pZCwgdm9pZD59ICovXG5jb25zdCByZWFkZXI9aGFyZGVuKHtcbiAgICAgIGFzeW5jIG5leHQoKXtcbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlS2l0PEl0ZXJhdG9yUmVzdWx0PFQ+Pn0gKi9cbmNvbnN0e3Byb21pc2UscmVzb2x2ZX09bWFrZVByb21pc2VLaXQoKTtcbnF1ZXVlLnB1dCh7dmFsdWU6cmVzb2x2ZSxkb25lOmZhbHNlfSk7XG5yZXR1cm4gcHJvbWlzZTtcbiB9LFxuICAgICAgYXN5bmMgcmV0dXJuKCl7XG4vKiogQHR5cGUge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZUtpdDxJdGVyYXRvclJlc3VsdDxUPj59ICovXG5jb25zdHtwcm9taXNlLHJlc29sdmV9PW1ha2VQcm9taXNlS2l0KCk7XG5xdWV1ZS5wdXQoe3ZhbHVlOnJlc29sdmUsZG9uZTp0cnVlfSk7XG5yZXR1cm4gcHJvbWlzZTtcbiB9LFxuICAgICAgYXN5bmMgdGhyb3cocmVhc29uKXtcbmNvbnN0IHJlamVjdGlvbj1Qcm9taXNlLnJlamVjdChyZWFzb24pO1xucXVldWUucHV0KHJlamVjdGlvbik7XG5yZXR1cm4gcmVqZWN0aW9uO1xuIH0sXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtcbnJldHVybiByZWFkZXI7XG4gfX0pO1xuXG5yZXR1cm4gcmVhZGVyO1xuIH0pO1xuXG52b2lkIHB1bGxOZXh0KCk7XG5yZXR1cm4gcmVhZGVycztcbiB9OyRo4oCNX29uY2Uuc3luY2hyb25pemVkVGVlKHN5bmNocm9uaXplZFRlZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQkFTSVNfUE9JTlRTIjpbIkJBU0lTX1BPSU5UUyJdLCJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl0sImxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl0sInRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXSwiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sIm1ha2VNZWFzdXJlU2Vjb25kcyI6WyJtYWtlTWVhc3VyZVNlY29uZHMiXSwibWFrZUFnZ3JlZ2F0ZUVycm9yIjpbIm1ha2VBZ2dyZWdhdGVFcnJvciJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJhc3NlcnRBbGxEZWZpbmVkIjpbImFzc2VydEFsbERlZmluZWQiXSwiZm9yZXZlciI6WyJmb3JldmVyIl0sIndoaWxlVHJ1ZSI6WyJ3aGlsZVRydWUiXSwidW50aWxUcnVlIjpbInVudGlsVHJ1ZSJdLCJ6aXAiOlsiemlwIl0sImFsbFZhbHVlcyI6WyJhbGxWYWx1ZXMiXSwic3luY2hyb25pemVkVGVlIjpbInN5bmNocm9uaXplZFRlZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABn0MWK1RIAANUSAAAzAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjEvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzeyJpbXBvcnRzIjpbIi4vc3Vic2NyaWJlLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZU5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsc3Vic2NyaWJlTGF0ZXN0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYHN1YnNjcmliZUxhdGVzdGAgZnJvbSBgQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanNgIGluc3RlYWQuXG4gKlxuICogQWRhcHRvciBmcm9tIGEgbm90aWZpZXJQIHRvIGFuIGFzeW5jIGl0ZXJhYmxlLlxuICogVGhlIG5vdGlmaWVyUCBjYW4gYmUgYW55IG9iamVjdCB0aGF0IGhhcyBhbiBldmVudHVhbGx5IGludm9jYWJsZVxuICogYGdldFVwZGF0ZVNpbmNlYCBtZXRob2QgdGhhdCBiZWhhdmVzIGFjY29yZGluZyB0byB0aGUgbm90aWZpZXJcbiAqIHNwZWMuIFRoaXMgY2FuIGJlIGEgbm90aWZpZXIsIGEgcHJvbWlzZSBmb3IgYSBsb2NhbCBvciByZW1vdGVcbiAqIG5vdGlmaWVyLCBvciBhIHByZXNlbmNlIG9mIGEgcmVtb3RlIG5vdGlmaWVyLlxuICpcbiAqIEl0IGlzIGFsc28gdXNlZCBpbnRlcm5hbGx5IGJ5IG5vdGlmaWVyLmpzIHNvIHRoYXQgYSBub3RpZmllciBpdHNlbGYgaXMgYW5cbiAqIGFzeW5jIGl0ZXJhYmxlLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhYmxlIGlzIGFuIG9iamVjdCB3aXRoIGEgYFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKWAgbWV0aG9kXG4gKiB0aGF0IHJldHVybnMgYW4gYXN5bmMgaXRlcmF0b3IuIFRoZSBhc3luYyBpdGVyYXRvciB3ZSByZXR1cm4gaGVyZSBoYXMgb25seVxuICogYSBgbmV4dCgpYCBtZXRob2QsIHdpdGhvdXQgdGhlIG9wdGlvbmFsIGByZXR1cm5gIGFuZCBgdGhyb3dgIG1ldGhvZHMuIFRoZVxuICogb21pdHRlZCBtZXRob2RzLCBpZiBwcmVzZW50LCB3b3VsZCBiZSB1c2VkIGJ5IHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB0b1xuICogaW5mb3JtIHRoZSBpdGVyYXRvciBvZiBlYXJseSB0ZXJtaW5hdGlvbi4gQnV0IHRoaXMgYWRhcHRvciB3b3VsZCBub3QgZG9cbiAqIGFueXRoaW5nIHVzZWZ1bCBpbiByZWFjdGlvbiB0byB0aGlzIG5vdGlmaWNhdGlvbi5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYXRvcidzIGBuZXh0KClgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gaXRlcmF0aW9uXG4gKiByZXN1bHQuIEFuIGl0ZXJhdGlvbiByZXN1bHQgaXMgYSByZWNvcmQgd2l0aCBgdmFsdWVgIGFuZCBgZG9uZWAgcHJvcGVydGllcy5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiBidWlsZGluZyBvbiB0aGUgbm90aWZpZXIgcHJvdG9jb2wgaXMgdG8gaGF2ZSBhIGxvc3N5XG4gKiBhZGFwdG9yLCB3aGVyZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBjYW4gYmUgbWlzc2VkIGluIGZhdm9yIG9mIG1vcmUgcmVjZW50XG4gKiByZXN1bHRzIHdoaWNoIGFyZSB0aGVyZWZvcmUgbGVzcyBzdGFsZS4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2RvY3VtZW50YXRpb24vYmxvYi9IRUFEL21haW4vZ3VpZGVzL2pzLXByb2dyYW1taW5nL25vdGlmaWVycy5tZFxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QmFzZU5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXI9c3Vic2NyaWJlTGF0ZXN0O1xuXG4vKipcbiAqIFRoaXMgYWR2YW5jZXMgYGFzeW5jSXRlcmF0b3JQYCB1cGRhdGluZyBgaXRlcmF0aW9uT2JzZXJ2ZXJgIHdpdGggZWFjaFxuICogc3VjY2Vzc2l2ZSB2YWx1ZS4gVGhlIGBpdGVyYXRpb25PYnNlcnZlcmAgbWF5IG9ubHkgYmUgaW50ZXJlc3RlZCBpbiBjZXJ0YWluXG4gKiBvY2N1cnJlbmNlcyAoYHVwZGF0ZVN0YXRlYCwgYGZpbmlzaGAsIGBmYWlsYCksIHNvIGZvciBjb252ZW5pZW5jZSxcbiAqIGBvYnNlcnZlSXRlcmF0b3JgIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmF0b3I8VD4+fSBhc3luY0l0ZXJhdG9yUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKTtcbmNvbnN0ICAgICAgICBvYnNlcnZlSXRlcmF0b3I9KGFzeW5jSXRlcmF0b3JQLGl0ZXJhdGlvbk9ic2VydmVyKT0+e1xucmV0dXJuIG5ldyBQcm9taXNlKChhY2ssb2JzZXJ2ZXJFcnJvcik9PntcbmNvbnN0IHJlY3VyPSgpPT57XG5FLndoZW4oXG5FKGFzeW5jSXRlcmF0b3JQKS5uZXh0KCksXG4oe3ZhbHVlLGRvbmV9KT0+e1xuaWYoZG9uZSl7XG5pdGVyYXRpb25PYnNlcnZlci5maW5pc2gmJml0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCh2YWx1ZSk7XG5hY2sodW5kZWZpbmVkKTtcbiB9ZWxzZXtcbml0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlJiZcbml0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbnJlY3VyKCk7XG4gfVxuIH0sXG4ocmVhc29uKT0+e1xuaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbCYmaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbChyZWFzb24pO1xuYWNrKHVuZGVmaW5lZCk7XG4gfSkuXG5jYXRjaChvYnNlcnZlckVycm9yKTtcbiB9O1xucmVjdXIoKTtcbiB9KTtcbiB9O1xuXG4vKipcbiAqIFRoaXMgcmVhZHMgZnJvbSBgYXN5bmNJdGVyYWJsZVBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRpb25gIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm9ic2VydmVJdGVyYXRvcihvYnNlcnZlSXRlcmF0b3IpO1xuY29uc3QgICAgICAgIG9ic2VydmVJdGVyYXRpb249KGFzeW5jSXRlcmFibGVQLGl0ZXJhdGlvbk9ic2VydmVyKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xucmV0dXJuIG9ic2VydmVJdGVyYXRvcihpdGVyYXRvclAsaXRlcmF0aW9uT2JzZXJ2ZXIpO1xuIH07XG5cbi8qKlxuICogQXMgdXBkYXRlcyBjb21lIGluIGZyb20gdGhlIHBvc3NpYmx5IHJlbW90ZSBgbm90aWZpZXJQYCwgdXBkYXRlXG4gKiB0aGUgbG9jYWwgYHVwZGF0ZXJgLiBTaW5jZSB0aGUgdXBkYXRlcyBjb21lIGZyb20gYSBub3RpZmllciwgdGhleVxuICogYXJlIGxvc3N5LCBpLmUuLCBvbmNlIGEgbW9yZSByZWNlbnQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkLCBsZXNzIHJlY2VudFxuICogc3RhdGVzIGFyZSBhc3N1bWVkIGlycmVsZXZhbnQgYW5kIGRyb3BwZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IG5vdGlmaWVyUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm9ic2VydmVJdGVyYXRpb24ob2JzZXJ2ZUl0ZXJhdGlvbik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZU5vdGlmaWVyPShub3RpZmllclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT5cbm9ic2VydmVJdGVyYXRpb24oc3Vic2NyaWJlTGF0ZXN0KG5vdGlmaWVyUCksaXRlcmF0aW9uT2JzZXJ2ZXIpOyRo4oCNX29uY2Uub2JzZXJ2ZU5vdGlmaWVyKG9ic2VydmVOb3RpZmllcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciJdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iXSwib2JzZXJ2ZU5vdGlmaWVyIjpbIm9ic2VydmVOb3RpZmllciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACwvi9PHAcAABwHAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjEvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi9zdG9yZXN1Yi5qcyIsIi4vc3Vic2NyaWJlLmpzIiwiLi9zdWJzY3JpYmVyLmpzIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi9zdG9yZXN1Yi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vcHVibGlzaC1raXQuanNcIiwgW11dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtdXSxbXCIuL25vdGlmaWVyLmpzXCIsIFtdXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW11dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW11dLFtcIi4vc3RvcmVzdWIuanNcIiwgW11dLFtcIi4vc3RvcmVkLW5vdGlmaWVyLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vcHVibGlzaC1raXQuanMiOltbIm1ha2VQdWJsaXNoS2l0IiwibWFrZVB1Ymxpc2hLaXQiXSxbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLFsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSIsIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSxbIkl0ZXJhYmxlRWFjaFRvcGljSSIsIkl0ZXJhYmxlRWFjaFRvcGljSSJdLFsiSXRlcmFibGVMYXRlc3RUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLFsiU3Vic2NyaWJlclNoYXBlIiwiU3Vic2NyaWJlclNoYXBlIl1dLCIuL3N1YnNjcmliZS5qcyI6W1sic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUVhY2giXSxbInN1YnNjcmliZUxhdGVzdCIsInN1YnNjcmliZUxhdGVzdCJdXSwiLi9ub3RpZmllci5qcyI6W1sibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyIl0sWyJtYWtlTm90aWZpZXJLaXQiLCJtYWtlTm90aWZpZXJLaXQiXSxbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXSxbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXV0sIi4vc3Vic2NyaWJlci5qcyI6W1sibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb24iXSxbIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il1dLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjpbWyJvYnNlcnZlTm90aWZpZXIiLCJvYnNlcnZlTm90aWZpZXIiXSxbIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVJdGVyYXRvciJdLFsib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRpb24iXSxbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPKwCGVaGAAAWhgAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMS9zcmMvbm90aWZpZXIuanN7ImltcG9ydHMiOlsiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxFLEZhcixtYWtlUHVibGlzaEtpdCxzdWJzY3JpYmVMYXRlc3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gc2hhcmFibGVJbnRlcm5hbHNQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXI9KHNoYXJhYmxlSW50ZXJuYWxzUCk9Pntcbi8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5zdWJzY3JpYmVMYXRlc3Qoc2hhcmFibGVJbnRlcm5hbHNQKSxcbmdldFVwZGF0ZVNpbmNlOmFzeW5jKHVwZGF0ZUNvdW50KT0+XG5FKHNoYXJhYmxlSW50ZXJuYWxzUCkuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBOb3RpZmllciBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgTm90aWZpZXIgdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZU5vdGlmaWVyYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIE5vdGlmaWVyIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczphc3luYygpPT5zaGFyYWJsZUludGVybmFsc1AsXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBVc2VkIG9ubHkgYnkgYG1ha2VDYXN0aW5nU3BlY0Zyb21SZWZgLiAgSW5zdGVhZCB0aGF0IGZ1bmN0aW9uIHNob3VsZCB1c2VcbiAqIHRoZSBgU3RvcmVkRmFjZXRgIEFQSS5cbiAqL1xuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7bm90aWZpZXJ9KX0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VOb3RpZmllcihtYWtlTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyPShzdWJzY3JpYmVyKT0+e1xuLyoqXG4gKiBAdHlwZSB7TGF0ZXN0VG9waWM8VD59XG4gKi9cbmNvbnN0IGJhc2VOb3RpZmllcj1oYXJkZW4oe1xuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50PXVuZGVmaW5lZCk9PlxuRShzdWJzY3JpYmVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCl9KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXJ9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuXG4vKipcbiAqIFByb2R1Y2VzIGEgcGFpciBvZiBvYmplY3RzLCB3aGljaCBhbGxvdyBhIHNlcnZpY2UgdG8gcHJvZHVjZSBhIHN0cmVhbSBvZlxuICogdXBkYXRlIHByb21pc2VzLlxuICpcbiAqIFRoZSBpbml0aWFsIHN0YXRlIGFyZ3VtZW50IGhhcyB0byBiZSB0cnVseSBvcHRpb25hbCBldmVuIHRob3VnaCBpdCBjYW5cbiAqIGJlIGFueSBmaXJzdCBjbGFzcyB2YWx1ZSBpbmNsdWRpbmcgYHVuZGVmaW5lZGAuIFdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gKiBwcmVzZW5jZSB2cyB0aGUgYWJzZW5jZSBvZiBpdCwgd2hpY2ggd2UgY2Fubm90IGRvIHdpdGggdGhlIG9wdGlvbmFsIGFyZ3VtZW50XG4gKiBzeW50YXguIFJhdGhlciB3ZSB1c2UgdGhlIGFyaXR5IG9mIHRoZSBgaW5pdGlhbFN0YXRlQXJyYCBhcnJheS5cbiAqXG4gKiBJZiBubyBpbml0aWFsIHN0YXRlIGlzIHByb3ZpZGVkIHRvIGBtYWtlTm90aWZpZXJLaXRgLCB0aGVuIGl0IHN0YXJ0cyB3aXRob3V0XG4gKiBhbiBpbml0aWFsIHN0YXRlLiBJdHMgaW5pdGlhbCBzdGF0ZSB3aWxsIGluc3RlYWQgYmUgdGhlIHN0YXRlIG9mIHRoZSBmaXJzdFxuICogdXBkYXRlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tdIHwgW1RdfSBpbml0aWFsU3RhdGVBcnIgdGhlIGZpcnN0IHN0YXRlIHRvIGJlIHJldHVybmVkICh0eXBlZCBhcyByZXN0IGFycmF5IHRvIHBlcm1pdCBgdW5kZWZpbmVkYClcbiAqIEByZXR1cm5zIHtOb3RpZmllclJlY29yZDxUPn0gdGhlIG5vdGlmaWVyIGFuZCB1cGRhdGVyXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJLaXQ9KC4uLmluaXRpYWxTdGF0ZUFycik9Pntcbi8qKiBAdHlwZSB7UHVibGlzaEtpdDxUPn0gKi9cbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5jb25zdCBub3RpZmllcj1tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihzdWJzY3JpYmVyKTtcblxuY29uc3QgdXBkYXRlcj1GYXIoJ3VwZGF0ZXInLHtcbnVwZGF0ZVN0YXRlOihzdGF0ZSk9PnB1Ymxpc2hlci5wdWJsaXNoKHN0YXRlKSxcbmZpbmlzaDooY29tcGxldGlvbik9PnB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG5mYWlsOihyZWFzb24pPT5wdWJsaXNoZXIuZmFpbChyZWFzb24pfSk7XG5cblxuYXNzZXJ0KGluaXRpYWxTdGF0ZUFyci5sZW5ndGg8PTEsJ3RvbyBtYW55IGFyZ3VtZW50cycpO1xuaWYoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aD09PTEpe1xudXBkYXRlci51cGRhdGVTdGF0ZShpbml0aWFsU3RhdGVBcnJbMF0pO1xuIH1cblxuLyogbm90aWZpZXIgZmFjZXQgaXMgc2VwYXJhdGUgc28gaXQgY2FuIGJlIGhhbmRlZCBvdXQgd2hpbGUgdXBkYXRlciovXG4vKiBpcyB0aWdodGx5IGhlbGQqL1xucmV0dXJuIGhhcmRlbih7bm90aWZpZXIsdXBkYXRlcn0pO1xuIH07XG5cbi8qKlxuICogQWRhcHRvciBmcm9tIGFzeW5jIGl0ZXJhYmxlIHRvIG5vdGlmaWVyLlxuICpcbiAqIEBkZXByZWNhdGVkIFRoZSByZXN1bHRpbmcgbm90aWZpZXIgaXMgbG9zc2xlc3MsIHdoaWNoIGlzIG5vdCBkZXNpcmFibGUuXG4gKiBQcmVmZXIgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIsIGFuZCByZWZlciB0b1xuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy81NDEzIGFuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTY5NSBmb3IgY29udGV4dC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovJGjigI1fb25jZS5tYWtlTm90aWZpZXJLaXQobWFrZU5vdGlmaWVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZT0oYXN5bmNJdGVyYWJsZVApPT57XG5jb25zdCBpdGVyYXRvclA9RShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbi8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBvcHROZXh0UHJvbWlzZTtcbmxldCBjdXJyZW50VXBkYXRlQ291bnQ9MG47XG4vKiogQHR5cGUge0VSZWY8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG5sZXQgY3VycmVudFJlc3BvbnNlO1xubGV0IGZpbmFsPWZhbHNlO1xuXG4vKipcbiAqIEB0eXBlIHtMYXRlc3RUb3BpYzxUPn1cbiAqL1xuY29uc3QgYmFzZU5vdGlmaWVyPUZhcignYmFzZU5vdGlmaWVyJyx7XG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudD0tMW4pe1xuaWYodXBkYXRlQ291bnQ8Y3VycmVudFVwZGF0ZUNvdW50KXtcbmlmKGN1cnJlbnRSZXNwb25zZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuIH1lbHNlIGlmKHVwZGF0ZUNvdW50IT09Y3VycmVudFVwZGF0ZUNvdW50KXtcbnRocm93IEVycm9yKFxuJ2dldFVwZGF0ZVNpbmNlIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCB1cGRhdGVDb3VudC4nKTtcblxuIH1cblxuLyogUmV0dXJuIGEgZmluYWwgcmVzcG9uc2UgaWYgd2UgaGF2ZSBvbmUsIG90aGVyd2lzZSBhIHByb21pc2UgZm9yIHRoZSBuZXh0IHN0YXRlLiovXG5pZihmaW5hbCl7XG5hc3NlcnQoY3VycmVudFJlc3BvbnNlIT09dW5kZWZpbmVkKTtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG5pZighb3B0TmV4dFByb21pc2Upe1xuY29uc3QgbmV4dEl0ZXJSZXN1bHRQPUUoaXRlcmF0b3JQKS5uZXh0KCk7XG5vcHROZXh0UHJvbWlzZT1FLndoZW4oXG5uZXh0SXRlclJlc3VsdFAsXG4oe2RvbmUsdmFsdWV9KT0+e1xuYXNzZXJ0KCFmaW5hbCk7XG5pZihkb25lKXtcbmZpbmFsPXRydWU7XG4gfVxuY3VycmVudFVwZGF0ZUNvdW50Kz0xbjtcbmN1cnJlbnRSZXNwb25zZT1oYXJkZW4oe1xudmFsdWUsXG51cGRhdGVDb3VudDpkb25lP3VuZGVmaW5lZDpjdXJyZW50VXBkYXRlQ291bnR9KTtcblxub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9LFxuKF9yZWFzb24pPT57XG5maW5hbD10cnVlO1xuY3VycmVudFJlc3BvbnNlPVxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59ICovXG5uZXh0SXRlclJlc3VsdFA7XG5vcHROZXh0UHJvbWlzZT11bmRlZmluZWQ7XG5yZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuIH0pO1xuXG4gfVxucmV0dXJuIG9wdE5leHRQcm9taXNlO1xuIH19KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLyogRG9uJ3QgbGVhayB0aGUgb3JpZ2luYWwgYXN5bmNJdGVyYWJsZVAgc2luY2UgaXQgbWF5IGJlIHJlbW90ZSBhbmQgd2UgYWxzbyovXG4vKiB3YW50IHRoZSBzYW1lIHNlbWFudGljcyBmb3IgdGhpcyBleHBvc2VkIGl0ZXJhYmxlIGFuZCB0aGUgYmFzZU5vdGlmaWVyLiovXG4uLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcn0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU5vdGlmaWVyIjpbIm1ha2VOb3RpZmllciJdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdLCJtYWtlTm90aWZpZXJLaXQiOlsibWFrZU5vdGlmaWVyS2l0Il0sIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIjpbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFZ/h0h+OAAAfjgAACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMS9zcmMvcHVibGlzaC1raXQuanN7ImltcG9ydHMiOlsiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9mYXIiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSIsIlB1Ymxpc2hlckkiLCJTdWJzY3JpYmVySSIsIlN1YnNjcmliZXJTaGFwZSIsIlVwZGF0ZUNvdW50U2hhcGUiLCJtYWtlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInB1Ymxpc2hLaXRJS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VQcm9taXNlS2l0LEUsRmFyLE0sY2FuQmVEdXJhYmxlLHByZXBhcmVFeG9DbGFzc0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIiwgWyRo4oCNX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBzaW5rPSgpPT57IH07XG5jb25zdCBtYWtlUXVpZXRSZWplY3Rpb249KHJlYXNvbik9PntcbmNvbnN0IHJlamVjdGlvbj1oYXJkZW4oUHJvbWlzZS5yZWplY3QocmVhc29uKSk7XG52b2lkIEUud2hlbihyZWplY3Rpb24sc2luayxzaW5rKTtcbnJldHVybiByZWplY3Rpb247XG4gfTtcbmNvbnN0IHRvb0ZhclJlamVjdGlvbj1tYWtlUXVpZXRSZWplY3Rpb24oXG5oYXJkZW4obmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwYXN0IGVuZCBvZiBpdGVyYXRpb24uJykpKTtcblxuXG5jb25zdCAgICAgICAgUHVibGlzaGVyST1NLmludGVyZmFjZSgnUHVibGlzaGVyJyx7XG5wdWJsaXNoOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5maW5pc2g6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWw6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKX0pO1xuXG5cbi8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIE5vdGlmaWVyIGBnZXRVcGRhdGVTaW5jZWAuKi8kaOKAjV9vbmNlLlB1Ymxpc2hlckkoUHVibGlzaGVySSk7XG5jb25zdCAgICAgICAgVXBkYXRlQ291bnRTaGFwZT1NLm9yKE0uYmlnaW50KCksTS5udW1iZXIoKSk7JGjigI1fb25jZS5VcGRhdGVDb3VudFNoYXBlKFVwZGF0ZUNvdW50U2hhcGUpO1xuY29uc3QgICAgICAgIFN1YnNjcmliZXJJPU0uaW50ZXJmYWNlKCdTdWJzY3JpYmVyJyx7XG5zdWJzY3JpYmVBZnRlcjpNLmNhbGwoKS5vcHRpb25hbChNLmJpZ2ludCgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldFVwZGF0ZVNpbmNlOk0uY2FsbCgpLm9wdGlvbmFsKFVwZGF0ZUNvdW50U2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7JGjigI1fb25jZS5TdWJzY3JpYmVySShTdWJzY3JpYmVySSk7XG5cbmNvbnN0ICAgICAgICBwdWJsaXNoS2l0SUtpdD1oYXJkZW4oe1xucHVibGlzaGVyOlB1Ymxpc2hlckksXG5zdWJzY3JpYmVyOlN1YnNjcmliZXJJfSk7JGjigI1fb25jZS5wdWJsaXNoS2l0SUtpdChwdWJsaXNoS2l0SUtpdCk7XG5cblxuY29uc3QgICAgICAgIEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGU9TS5pbnRlcmZhY2UoXG4nRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InLFxue1xuZm9yazpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLC8qIG9vcHM6IHJlY3Vyc2l2ZSB0eXBlKi9cbm5leHQ6TS5jYWxsV2hlbigpLnJldHVybnMoTS5hbnkoKSl9KTskaOKAjV9vbmNlLkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUoRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSk7XG5cblxuXG5jb25zdCAgICAgICAgSXRlcmFibGVFYWNoVG9waWNJPU0uaW50ZXJmYWNlKCdJdGVyYWJsZUVhY2hUb3BpYycse1xuc3Vic2NyaWJlQWZ0ZXI6U3Vic2NyaWJlckkubWV0aG9kR3VhcmRzLnN1YnNjcmliZUFmdGVyLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJykpfSk7JGjigI1fb25jZS5JdGVyYWJsZUVhY2hUb3BpY0koSXRlcmFibGVFYWNoVG9waWNJKTtcblxuXG5cbmNvbnN0ICAgICAgICBJdGVyYWJsZUxhdGVzdFRvcGljST1NLmludGVyZmFjZSgnSXRlcmFibGVMYXRlc3RUb3BpYycse1xuZ2V0VXBkYXRlU2luY2U6U3Vic2NyaWJlckkubWV0aG9kR3VhcmRzLmdldFVwZGF0ZVNpbmNlLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJykpfSk7XG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBBcmdcbiAqIEB0ZW1wbGF0ZSBSZXRcbiAqIEBwYXJhbSB7KGFyZzogQXJnKSA9PiBSZXR9IGZuXG4gKiBAcmV0dXJucyB7KGFyZzogQXJnKSA9PiBSZXR9XG4gKi8kaOKAjV9vbmNlLkl0ZXJhYmxlTGF0ZXN0VG9waWNJKEl0ZXJhYmxlTGF0ZXN0VG9waWNJKTtcbmNvbnN0IHdlYWtNZW1vaXplVW5hcnk9KGZuKT0+e1xuY29uc3QgY2FjaGU9bmV3IFdlYWtNYXAoKTtcbnJldHVybihhcmcpPT57XG4vKiogQHR5cGUge29iamVjdH0gKi9cbmNvbnN0IG9hcmc9YXJnO1xuaWYoY2FjaGUuaGFzKG9hcmcpKXtcbnJldHVybiBjYWNoZS5nZXQob2FyZyk7XG4gfVxuY29uc3QgcmVzdWx0PWZuKGFyZyk7XG5jYWNoZS5zZXQob2FyZyxyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UHVibGljYXRpb25SZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge1VwZGF0ZVJlY29yZDxUPn1cbiAqL1xuY29uc3QgbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZD0ocmVjb3JkKT0+e1xuY29uc3R7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudH09XG5yZWNvcmQ7XG5pZihkb25lKXtcbi8qIEZpbmFsIHJlc3VsdHMgaGF2ZSB1bmRlZmluZWQgdXBkYXRlQ291bnQuKi9cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OnVuZGVmaW5lZH0pO1xuIH1cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OnB1Ymxpc2hDb3VudH0pO1xuIH07XG5cbi8qKlxuICogTWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQdWJsaXNoS2l0PFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVB1Ymxpc2hLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7UHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59ICovXG5sZXQgdGFpbFA7XG4vKiogQHR5cGUge3VuZGVmaW5lZCB8ICgodmFsdWU6IEVSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+KSA9PiB2b2lkKX0gKi9cbmxldCB0YWlsUjtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcblxubGV0IGN1cnJlbnRQdWJsaXNoQ291bnQ9MG47XG5sZXQgY3VycmVudFA9dGFpbFA7XG5jb25zdCBhZHZhbmNlQ3VycmVudD0oZG9uZSx2YWx1ZSxyZWplY3Rpb24pPT57XG5pZih0YWlsUj09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbmN1cnJlbnRQdWJsaXNoQ291bnQrPTFuO1xuY3VycmVudFA9dGFpbFA7XG5jb25zdCByZXNvbHZlQ3VycmVudD10YWlsUjtcblxuaWYoZG9uZSl7XG50YWlsUD10b29GYXJSZWplY3Rpb247XG50YWlsUj11bmRlZmluZWQ7XG4gfWVsc2V7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG4gfVxuXG5pZihyZWplY3Rpb24pe1xucmVzb2x2ZUN1cnJlbnQocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbnJlc29sdmVDdXJyZW50KFxuaGFyZGVuKHtcbmhlYWQ6e3ZhbHVlLGRvbmV9LFxucHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG4gfTtcblxuY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkPXdlYWtNZW1vaXplVW5hcnkoXG5tYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkKTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7U3Vic2NyaWJlcjxUPn1cbiAqL1xuY29uc3Qgc3Vic2NyaWJlcj1GYXIoJ1N1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQ9LTFuKT0+e1xuYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsJ2JpZ2ludCcpO1xuaWYocHVibGlzaENvdW50PT09Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gdGFpbFA7XG4gfWVsc2UgaWYocHVibGlzaENvdW50PGN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1lbHNle1xudGhyb3cgRXJyb3IoXG4nc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nKTtcblxuIH1cbiB9LFxuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+e1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gfVxudXBkYXRlQ291bnQ9QmlnSW50KHVwZGF0ZUNvdW50KTtcbnJldHVybihcbnN1YnNjcmliZXJcbi8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4vKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuLyogc2FtZSBjcmFuay4uLiovLlxuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4vKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbi8qIGZ1cnRoZXIgb25lcy4qLy5cbnRoZW4oKCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSkpO1xuXG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7UHVibGlzaGVyPFQ+fSAqL1xuY29uc3QgcHVibGlzaGVyPUZhcignUHVibGlzaGVyJyx7XG5wdWJsaXNoOih2YWx1ZSk9PntcbmFkdmFuY2VDdXJyZW50KGZhbHNlLHZhbHVlKTtcbiB9LFxuZmluaXNoOihmaW5hbFZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSxmaW5hbFZhbHVlKTtcbiB9LFxuZmFpbDoocmVhc29uKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSx1bmRlZmluZWQsbWFrZVF1aWV0UmVqZWN0aW9uKHJlYXNvbikpO1xuIH19KTtcblxucmV0dXJuIGhhcmRlbih7cHVibGlzaGVyLHN1YnNjcmliZXJ9KTtcbiB9OyRo4oCNX29uY2UubWFrZVB1Ymxpc2hLaXQobWFrZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VQdWJsaXNoS2l0KTtcblxuY29uc3QgRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlPWhhcmRlbih7XG52YWx1ZUR1cmFiaWxpdHk6TS5hbnkoKSxcbnB1Ymxpc2hDb3VudDpNLmFueSgpLFxuc3RhdHVzOk0uYW55KCksXG5oYXNWYWx1ZTpNLmFueSgpLFxudmFsdWU6TS5hbnkoKX0pO1xuXG5cbi8qIFRPRE86IE1vdmUgZHVyYWJsZSBwdWJsaXNoIGtpdCB0byBhIG5ldyBmaWxlPyovXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eSAmICdtYW5kYXRvcnknfSBbb3B0aW9ucy52YWx1ZUR1cmFiaWxpdHk9J21hbmRhdG9yeSddXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX1cbiAqL1xuY29uc3QgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGU9KG9wdGlvbnM9e30pPT57XG5jb25zdHt2YWx1ZUR1cmFiaWxpdHk9J21hbmRhdG9yeSd9PW9wdGlvbnM7XG5hc3NlcnQuZXF1YWwodmFsdWVEdXJhYmlsaXR5LCdtYW5kYXRvcnknKTtcbnJldHVybntcbi8qIGNvbmZpZ3VyYXRpb24qL1xudmFsdWVEdXJhYmlsaXR5LFxuXG4vKiBsaWZlY3ljbGUgcHJvZ3Jlc3MqL1xucHVibGlzaENvdW50OjBuLFxuc3RhdHVzOidsaXZlJywvKiB8ICdmaW5pc2hlZCcgfCAnZmFpbGVkJyovXG5cbi8qIHBlcnNpc3RlZCByZXN1bHQgZGF0YSovXG4vKiBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gbm9uLXRlcm1pbmFsIHZhbHVlcyBmcm9tIGBwdWJsaXNoYCwqL1xuLyogdmFsdWUgYWxzbyBob2xkcyB0aGUgdGVybWluYWwgdmFsdWUgZnJvbSBgZmluaXNoYCBvciBgZmFpbGAuKi9cbmhhc1ZhbHVlOmZhbHNlLFxudmFsdWU6dW5kZWZpbmVkfTtcblxuIH07XG5cbi8qIFdlIG5lZWQgdGhlIFdlYWtNYXAga2V5IGZvciBhIGtpdCB0byBiZSBhIHZyZWYtYmVhcmluZyBvYmplY3QqL1xuLyogaW4gaXRzIGNvaG9ydCwgYW5kIGhhdmUgYXJiaXRyYXJpbHkgY2hvc2VuIHRoZSBwdWJsaXNoZXIgZmFjZXQuKi9cbi8qKiBAdHlwZWRlZiB7UHVibGlzaGVyPCo+fSBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleSAqL1xuLyoqXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5fVxuICovXG5jb25zdCBnZXRFcGhlbWVyYWxLZXk9KGZhY2V0cyk9PmZhY2V0cy5wdWJsaXNoZXI7XG5cbi8qKlxuICogQHR5cGVkZWYgRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhXG4gKiBAcHJvcGVydHkge1Byb21pc2U8Kj4gfCB1bmRlZmluZWR9IGN1cnJlbnRQIFRoZSBjdXJyZW50LXJlc3VsdCBwcm9taXNlXG4gKiAgICh1bmRlZmluZWQgdW5sZXNzIHJlc29sdmVkIHdpdGggdW5yZWNvdmVyYWJsZSBlcGhlbWVyYWwgZGF0YSlcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTwqPn0gdGFpbFAgVGhlIG5leHQtcmVzdWx0IHByb21pc2VcbiAqIEBwcm9wZXJ0eSB7KCh2YWx1ZTogYW55KSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gdGFpbFIgVGhlIG5leHQtcmVzdWx0IHJlc29sdmVyXG4gKiAgICh1bmRlZmluZWQgd2hlbiB0aGUgcHVibGlzaCBraXQgaGFzIHRlcm1pbmF0ZWQpXG4gKi9cblxuLyoqIEB0eXBlIHtXZWFrTWFwPER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5LCBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE+fSAqL1xuY29uc3QgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudC1yZXN1bHQgcHJvbWlzZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBkdXJhYmxlXG4gKiBwdWJsaXNoIGtpdCwgcmVjcmVhdGVkIHVubGVzcyB3ZSBhbHJlYWR5IGhhdmUgb25lIHdpdGggcmV0YWluZWRcbiAqIGVwaGVtZXJhbCBkYXRhLlxuICpcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcGFyYW0ge1Byb21pc2U8Kj59IHRhaWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICovXG5jb25zdCBwcm92aWRlQ3VycmVudFA9KHN0YXRlLGZhY2V0cyx0YWlsKT0+e1xuY29uc3QgZXBoZW1lcmFsS2V5PWdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuY29uc3QgZm91bmREYXRhPWR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbmNvbnN0IGN1cnJlbnRQPWZvdW5kRGF0YSYmZm91bmREYXRhLmN1cnJlbnRQO1xuaWYoY3VycmVudFApe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1cblxuY29uc3R7cHVibGlzaENvdW50LHN0YXR1cyxoYXNWYWx1ZSx2YWx1ZX09c3RhdGU7XG5pZighaGFzVmFsdWUpe1xuYXNzZXJ0KHN0YXR1cz09PSdsaXZlJyk7XG5yZXR1cm4gdGFpbDtcbiB9XG5pZihzdGF0dXM9PT0nbGl2ZSd8fHN0YXR1cz09PSdmaW5pc2hlZCcpe1xuY29uc3QgY2VsbD1oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZTpzdGF0dXMhPT0nbGl2ZSd9LFxucHVibGlzaENvdW50LFxudGFpbH0pO1xuXG5yZXR1cm4gRS5yZXNvbHZlKGNlbGwpO1xuIH1lbHNlIGlmKHN0YXR1cz09PSdmYWlsZWQnKXtcbnJldHVybiBtYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xuIH1lbHNle1xudGhyb3cgRmFpbCBgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiB9XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuZXh0LXJlc3VsdCBwcm9taXNlIGFuZCByZXNvbHZlciBhc3NvY2lhdGVkIHdpdGggYSBnaXZlblxuICogZHVyYWJsZSBwdWJsaXNoIGtpdC5cbiAqIFRoZXNlIGFyZSBsb3N0IG9uIHVwZ3JhZGUgYnV0IHJlY3JlYXRlZCBvbi1kZW1hbmQsIHByZXNlcnZpbmcgdGhlXG4gKiB2YWx1ZSBpbiAoYnV0IG5vdCB0aGUgaWRlbnRpdHkgb2YpIHRoZSBjdXJyZW50IHsgdmFsdWUsIGRvbmUgfSByZXN1bHRcbiAqIHdoZW4gcG9zc2libGUsIHdoaWNoIGlzIGFsd2F5cyB0aGUgY2FzZSB3aGVuIHRoYXQgdmFsdWUgaXMgdGVybWluYWxcbiAqIChpLmUuLCBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYCkgb3Igd2hlbiB0aGUgZHVyYWJsZSBwdWJsaXNoIGtpdCBpc1xuICogY29uZmlndXJlZCB3aXRoIGB2YWx1ZUR1cmFiaWxpdHk6ICdtYW5kYXRvcnknYC5cbiAqXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9IHN0YXRlXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YX1cbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YT0oc3RhdGUsZmFjZXRzKT0+e1xuY29uc3QgZXBoZW1lcmFsS2V5PWdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuY29uc3QgZm91bmREYXRhPWR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbmlmKGZvdW5kRGF0YSl7XG5yZXR1cm4gZm91bmREYXRhO1xuIH1cblxuY29uc3R7c3RhdHVzfT1zdGF0ZTtcbmxldCB0YWlsUDtcbmxldCB0YWlsUjtcbmlmKHN0YXR1cz09PSdsaXZlJyl7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG52b2lkIEUud2hlbih0YWlsUCxzaW5rLHNpbmspO1xuIH1lbHNlIGlmKHN0YXR1cz09PSdmaW5pc2hlZCd8fHN0YXR1cz09PSdmYWlsZWQnKXtcbnRhaWxQPXRvb0ZhclJlamVjdGlvbjtcbiB9ZWxzZXtcbnRocm93IEZhaWwgYEludmFsaWQgZHVyYWJsZSBwcm9taXNlIGtpdCBzdGF0dXM6ICR7cShzdGF0dXMpfWA7XG4gfVxuLyogY3VycmVudFAgaXMgbm90IGVwaGVtZXJhbCB3aGVuIHJlc3RvcmluZyBmcm9tIHBlcnNpc3RlZCBzdGF0ZS4qL1xuY29uc3Qgb2JqPWhhcmRlbih7Y3VycmVudFA6dW5kZWZpbmVkLHRhaWxQLHRhaWxSfSk7XG5kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KGVwaGVtZXJhbEtleSxvYmopO1xucmV0dXJuIG9iajtcbiB9O1xuXG4vKipcbiAqIEV4dGVuZHMgdGhlIHNlcXVlbmNlIG9mIHJlc3VsdHMuXG4gKlxuICogQHBhcmFtIHt7c3RhdGU6IER1cmFibGVQdWJsaXNoS2l0U3RhdGUsIGZhY2V0czogUHVibGlzaEtpdDwqPn19IGNvbnRleHRcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlWydzdGF0dXMnXX0gW3RhcmdldFN0YXR1c11cbiAqL1xuY29uc3QgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0PShjb250ZXh0LHZhbHVlLHRhcmdldFN0YXR1cz0nbGl2ZScpPT57XG5jb25zdHtzdGF0ZSxmYWNldHN9PWNvbnRleHQ7XG5jb25zdHt2YWx1ZUR1cmFiaWxpdHksc3RhdHVzfT1zdGF0ZTtcbmlmKHN0YXR1cyE9PSdsaXZlJyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5jb25zdCBkb25lPXRhcmdldFN0YXR1cyE9PSdsaXZlJztcbmlmKGRvbmV8fHZhbHVlRHVyYWJpbGl0eT09PSdtYW5kYXRvcnknKXtcbmNhbkJlRHVyYWJsZSh2YWx1ZSl8fEZhaWwgYENhbm5vdCBhY2NlcHQgbm9uLWR1cmFibGUgdmFsdWU6ICR7dmFsdWV9YDtcbiB9XG5jb25zdHt0YWlsUDpvbGRUYWlsUCx0YWlsUjpyZXNvbHZlT2xkVGFpbH09XG5wcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKHN0YXRlLGZhY2V0cyk7XG5hc3NlcnQudHlwZW9mKHJlc29sdmVPbGRUYWlsLCdmdW5jdGlvbicpO1xuXG5jb25zdCBwdWJsaXNoQ291bnQ9c3RhdGUucHVibGlzaENvdW50KzFuO1xuc3RhdGUucHVibGlzaENvdW50PXB1Ymxpc2hDb3VudDtcblxubGV0IHRhaWxQO1xubGV0IHRhaWxSO1xuaWYoZG9uZSl7XG5zdGF0ZS5zdGF0dXM9dGFyZ2V0U3RhdHVzO1xudGFpbFA9dG9vRmFyUmVqZWN0aW9uO1xudGFpbFI9dW5kZWZpbmVkO1xuIH1lbHNle1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xudm9pZCBFLndoZW4odGFpbFAsc2luayxzaW5rKTtcbiB9XG5cbmxldCBjdXJyZW50UDtcbmlmKHRhcmdldFN0YXR1cz09PSdmYWlsZWQnKXtcbnN0YXRlLmhhc1ZhbHVlPXRydWU7XG5zdGF0ZS52YWx1ZT12YWx1ZTtcbmNvbnN0IHJlamVjdGlvbj1tYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xucmVzb2x2ZU9sZFRhaWwocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbi8qIFBlcnNpc3QgYSB0ZXJtaW5hbCB2YWx1ZSwgb3IgYSBub24tdGVybWluYWwgdmFsdWUqL1xuLyogaWYgY29uZmlndXJlZCBhcyAnbWFuZGF0b3J5JyBvciAnb3Bwb3J0dW5pc3RpYycuKi9cbmlmKGRvbmV8fHZhbHVlRHVyYWJpbGl0eSE9PSdpZ25vcmVkJyYmY2FuQmVEdXJhYmxlKHZhbHVlKSl7XG5zdGF0ZS5oYXNWYWx1ZT10cnVlO1xuc3RhdGUudmFsdWU9dmFsdWU7XG4gfWVsc2V7XG5zdGF0ZS5oYXNWYWx1ZT1mYWxzZTtcbnN0YXRlLnZhbHVlPXVuZGVmaW5lZDtcbi8qIFJldGFpbiBhbnkgcHJvbWlzZSB3aXRoIG5vbi1kdXJhYmxlIHJlc29sdXRpb24uKi9cbmN1cnJlbnRQPW9sZFRhaWxQO1xuIH1cblxucmVzb2x2ZU9sZFRhaWwoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG5cbmR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoXG5nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKSxcbmhhcmRlbih7Y3VycmVudFAsdGFpbFAsdGFpbFJ9KSk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi4vLi4vdmF0LWRhdGEvc3JjL3R5cGVzLmpzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQ9KGJhZ2dhZ2Usa2luZE5hbWUpPT57XG4vKiBUT0RPOiBPbmNlIHdlIHVuaWZ5IHdpdGggbWFrZVB1Ymxpc2hLaXQsIHdlIHdpbGwgdXNlIGEgWm9uZS1jb21wYXRpYmxlIHdlYWsqL1xuLyogbWFwIGZvciBtZW1vaXphdGlvbi4qL1xuY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkPW1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQ7XG5cbi8qKlxuICogQHJldHVybnMgeygpID0+IFB1Ymxpc2hLaXQ8Kj59XG4gKi9cbnJldHVybiBwcmVwYXJlRXhvQ2xhc3NLaXQoXG5iYWdnYWdlLFxua2luZE5hbWUsXG5wdWJsaXNoS2l0SUtpdCxcbmluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlLFxue1xuLyogVGhlIHB1Ymxpc2hlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuLyogYWNjZXB0cyBuZXcgdmFsdWVzLiovXG5wdWJsaXNoZXI6e1xucHVibGlzaCh2YWx1ZSl7XG5hZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcyx2YWx1ZSk7XG4gfSxcbmZpbmlzaChmaW5hbFZhbHVlKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLGZpbmFsVmFsdWUsJ2ZpbmlzaGVkJyk7XG4gfSxcbmZhaWwocmVhc29uKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLHJlYXNvbiwnZmFpbGVkJyk7XG4gfX0sXG5cblxuLyogVGhlIHN1YnNjcmliZXIgZmFjZXQgb2YgYSBkdXJhYmxlIHB1Ymxpc2gga2l0Ki9cbi8qIHByb3BhZ2F0ZXMgdmFsdWVzLiovXG5zdWJzY3JpYmVyOntcbnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudD0tMW4pe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xuY29uc3R7cHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnR9PXN0YXRlO1xuY29uc3R7Y3VycmVudFAsdGFpbFB9PXByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoXG5zdGF0ZSxcbmZhY2V0cyk7XG5cbmlmKHB1Ymxpc2hDb3VudD09PWN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIHRhaWxQO1xuIH1lbHNlIGlmKHB1Ymxpc2hDb3VudDxjdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiBjdXJyZW50UHx8cHJvdmlkZUN1cnJlbnRQKHN0YXRlLGZhY2V0cyx0YWlsUCk7XG4gfWVsc2V7XG50aHJvdyBFcnJvcihcbidzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicpO1xuXG4gfVxuIH0sXG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCl7XG5jb25zdHtcbmZhY2V0czp7c3Vic2NyaWJlcn19PVxudGhpcztcbmlmKHVwZGF0ZUNvdW50PT09dW5kZWZpbmVkKXtcbnJldHVybiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCkudGhlbihtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQpO1xuIH1cbnVwZGF0ZUNvdW50PUJpZ0ludCh1cGRhdGVDb3VudCk7XG5yZXR1cm4oXG5zdWJzY3JpYmVyXG4vKiBgc3Vic2NyaWJlQWZ0ZXJgIG1heSByZXNvbHZlIHdpdGggdGhlIHVwZGF0ZSByZWNvcmQgbnVtYmVyZWQqL1xuLyogYHVwZGF0ZUNvdW50ICsgMWAsIGV2ZW4gaWYgc2V2ZXJhbCB1cGRhdGVzIGFyZSBwdWJsaXNoZWQgaW4gdGhlKi9cbi8qIHNhbWUgY3JhbmsuLi4qLy5cbnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuLyogLi4uIHNvIHdlIHBvbGwgdGhlIGxhdGVzdCBwdWJsaXNoZWQgdXBkYXRlLCB3aXRob3V0IHdhaXRpbmcgZm9yIGFueSovXG4vKiBmdXJ0aGVyIG9uZXMuKi8uXG50aGVuKCgpPT5zdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKCkpKTtcblxuIH19fSxcblxuXG57XG5zdGF0ZVNoYXBlOkR1cmFibGVQdWJsaXNoS2l0U3RhdGVTaGFwZX0pO1xuXG5cbiB9OyRo4oCNX29uY2UucHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5oYXJkZW4ocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcblxuY29uc3QgICAgICAgIFN1YnNjcmliZXJTaGFwZT1NLnJlbW90YWJsZSgnU3Vic2NyaWJlcicpOyRo4oCNX29uY2UuU3Vic2NyaWJlclNoYXBlKFN1YnNjcmliZXJTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHVibGlzaGVySSI6WyJQdWJsaXNoZXJJIl0sIlVwZGF0ZUNvdW50U2hhcGUiOlsiVXBkYXRlQ291bnRTaGFwZSJdLCJTdWJzY3JpYmVySSI6WyJTdWJzY3JpYmVySSJdLCJwdWJsaXNoS2l0SUtpdCI6WyJwdWJsaXNoS2l0SUtpdCJdLCJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSwiSXRlcmFibGVFYWNoVG9waWNJIjpbIkl0ZXJhYmxlRWFjaFRvcGljSSJdLCJJdGVyYWJsZUxhdGVzdFRvcGljSSI6WyJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLCJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCJdLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiOlsicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Il0sIlN1YnNjcmliZXJTaGFwZSI6WyJTdWJzY3JpYmVyU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvgEwJIMKAACDCgAALgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4xL3NyYy9zdG9yZWQtbm90aWZpZXIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxFLEZhcixvYnNlcnZlTm90aWZpZXI7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsIFskaOKAjV9hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZU5vdGlmaWVyXCIsIFskaOKAjV9hID0+IChvYnNlcnZlTm90aWZpZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD4gJiBPbWl0PFN0b3JlZEZhY2V0LCAnZ2V0U3RvcmVLZXknPn0gU3RvcmVkTm90aWZpZXJcbiAqL1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkTm90aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8VD4+fSBub3RpZmllclxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZE5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZE5vdGlmaWVyPShub3RpZmllcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuYXNzZXJ0QWxsRGVmaW5lZCh7bm90aWZpZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcn0pO1xuXG5jb25zdCBtYXJzaGFsbFRvU3RvcmFnZT1tYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpO1xuXG5vYnNlcnZlTm90aWZpZXIobm90aWZpZXIse1xudXBkYXRlU3RhdGUodmFsdWUpe1xubWFyc2hhbGxUb1N0b3JhZ2UodmFsdWUpLmNhdGNoKChyZWFzb24pPT5cbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byB1cGRhdGVTdGF0ZScscmVhc29uKSk7XG5cbiB9LFxuZmFpbChyZWFzb24pe1xuY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLHJlYXNvbik7XG4gfX0pLlxuY2F0Y2goKHJlYXNvbik9PntcbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGhhbHRlZCBpdGVyYXRpb24nLHJlYXNvbik7XG4gfSk7XG5cbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG5mcm9tQ2FwRGF0YTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSl9KTtcblxuXG4vKiogQHR5cGUge1N0b3JlZE5vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgc3RvcmVkTm90aWZpZXI9RmFyKCdTdG9yZWROb3RpZmllcicse1xuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+RShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuZ2V0UGF0aDooKT0+RShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXJ9KTtcblxucmV0dXJuIHN0b3JlZE5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkTm90aWZpZXIobWFrZVN0b3JlZE5vdGlmaWVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RvcmVkTm90aWZpZXIiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOs+VGqwIgAAsCIAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMS9zcmMvc3RvcmVzdWIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCIsIm1ha2VTdG9yZWRQdWJsaXNoS2l0IiwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCIsIm1ha2VTdG9yZWRTdWJzY3JpYmVyIiwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixtYWtlTWFyc2hhbCxhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Usb2JzZXJ2ZUl0ZXJhdGlvbixtYWtlUHVibGlzaEtpdCxtYWtlU3Vic2NyaXB0aW9uS2l0LHN1YnNjcmliZUVhY2g7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsIFskaOKAjV9hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjigI1fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVJdGVyYXRpb25cIiwgWyRo4oCNX2EgPT4gKG9ic2VydmVJdGVyYXRpb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVN1YnNjcmlwdGlvbktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogTkI6IGRvZXMgbm90IHlldCBzdXJ2aXZlIHVwZ3JhZGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82ODkzXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHsodjogVCkgPT4gdm9pZH0gY29uc3VtZVZhbHVlXG4gKi9cbmNvbnN0ICAgICAgICBmb3JFYWNoUHVibGljYXRpb25SZWNvcmQ9YXN5bmMoc3Vic2NyaWJlcixjb25zdW1lVmFsdWUpPT57XG4vKiBXZSBvcGVuLWNvZGUgdGhlIGZvci1hd2FpdC1vZiBpbXBsZW1lbnRhdGlvbiByYXRoZXIgdGhhbiB1c2luZyB0aGF0IHN5bnRheCovXG4vKiBkaXJlY3RseSBiZWNhdXNlIHdlIHdhbnQgdG8gcnVuIHRoZSBjb25zdW1lciBvbiB0aGUgZG9uZSB2YWx1ZSBhcyB3ZWxsLiovXG5jb25zdCBpdGVyYXRvcj1zdWJzY3JpYmVFYWNoKHN1YnNjcmliZXIpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG5sZXQgZmluaXNoZWQ9ZmFsc2U7XG53aGlsZSghZmluaXNoZWQpe1xuLyogQWxsb3cgbmVzdGVkIGF3YWl0cyAoaW4gbG9vcCkgYmVjYXVzZSBpdCdzIHNhZmUgZm9yIGVhY2ggdG8gcnVuIGluIGEgdHVybiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcCwgQGplc3NpZS5qcy9uby1uZXN0ZWQtYXdhaXQqL1xuY29uc3R7dmFsdWUsZG9uZX09YXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AsIEBqZXNzaWUuanMvbm8tbmVzdGVkLWF3YWl0Ki9cbmF3YWl0IGNvbnN1bWVWYWx1ZSh2YWx1ZSk7XG5maW5pc2hlZD0hIWRvbmU7XG4gfVxuIH07XG5cbi8qKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIG5vIGZ1cnRoZXIgd3JpdGVzIHRvIGl0IHdpbGxcbiAqIGJlIGF0dGVtcHRlZCAoYnV0IHJlc3VsdHMgd2lsbCByZW1haW4gYXZhaWxhYmxlIGZyb20gdGhlIHN1YnNjcmliZXIpLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpYmVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPFJldHVyblR5cGU8dHlwZW9mIG1ha2VNYXJzaGFsPj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fVxuICovJGjigI1fb25jZS5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkU3Vic2NyaWJlcj0oc3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuYXNzZXJ0QWxsRGVmaW5lZCh7c3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyfSk7XG5cbmNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlPW1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik7XG5cbi8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xuZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKHN1YnNjcmliZXIsbWFyc2hhbGxUb1N0b3JhZ2UpLmNhdGNoKChlcnIpPT57XG4vKiBUT0RPOiBIb3cgc2hvdWxkIHdlIGhhbmRsZSBhbmQvb3Igc3VyZmFjZSB0aGlzIGZhaWx1cmU/Ki9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU3NjYjZGlzY3Vzc2lvbl9yOTIyNDk4MDg4Ki9cbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZFN1YnNjcmliZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLGVycik7XG4gfSk7XG5cbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG5mcm9tQ2FwRGF0YTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSl9KTtcblxuXG4vKiogQHR5cGUge1N0b3JlZFN1YnNjcmliZXI8VD59ICovXG5jb25zdCBzdG9yZXN1Yj1GYXIoJ1N0b3JlZFN1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQpPT5zdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG5nZXRVcGRhdGVTaW5jZToodXBkYXRlQ291bnQpPT5zdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbmdldFBhdGg6KCk9PkUoc3RvcmFnZU5vZGUpLmdldFBhdGgoKSxcbmdldFN0b3JlS2V5OigpPT5FKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpLFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXJ9KTtcblxucmV0dXJuIHN0b3Jlc3ViO1xuIH07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIG1ha2VTdG9yZWRTdWJzY3JpYmVyXG4gKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIHRoZSBpdGVyYXRpb24gd2lsbCBiZSB0ZXJtaW5hdGVkLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaXB0aW9uXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZWY8UmV0dXJuVHlwZTx0eXBlb2YgbWFrZU1hcnNoYWw+Pn0gW21hcnNoYWxsZXJdXG4gKiBAcmV0dXJucyB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fVxuICovJGjigI1fb25jZS5tYWtlU3RvcmVkU3Vic2NyaWJlcihtYWtlU3RvcmVkU3Vic2NyaWJlcik7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFN1YnNjcmlwdGlvbj0oXG5zdWJzY3JpcHRpb24sXG5zdG9yYWdlTm9kZSxcbm1hcnNoYWxsZXI9bWFrZU1hcnNoYWwodW5kZWZpbmVkLHVuZGVmaW5lZCx7XG5tYXJzaGFsU2F2ZUVycm9yOigpPT57IH0sXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidzbWFsbGNhcHMnfSkpPT5cblxue1xuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbmZyb21DYXBEYXRhOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKX0pO1xuXG5cbi8qIEFib3J0IHRoZSBpdGVyYXRpb24gb24gdGhlIG5leHQgb2JzZXJ2YXRpb24gaWYgdGhlIHB1Ymxpc2hlciBldmVyIGZhaWxzLiovXG5sZXQgcHVibGlzaEZhaWxlZD1mYWxzZTtcbmxldCBwdWJsaXNoRXhjZXB0aW9uO1xuXG5jb25zdCBmYWlsPShlcnIpPT57XG5wdWJsaXNoRmFpbGVkPXRydWU7XG5wdWJsaXNoRXhjZXB0aW9uPWVycjtcbiB9O1xuXG4vKiBNdXN0ICpub3QqIGJlIGFuIGFzeW5jIGZ1bmN0aW9uLCBiZWNhdXNlIGl0IHNvbWV0aW1lcyBtdXN0IHRocm93IHRvIGFib3J0Ki9cbi8qIHRoZSBpdGVyYXRpb24uKi9cbmNvbnN0IHB1Ymxpc2hWYWx1ZT0ob2JqKT0+e1xuYXNzZXJ0KHN0b3JhZ2VOb2RlKTtcbmlmKHB1Ymxpc2hGYWlsZWQpe1xuLyogVG8gcHJvcGVybHkgYWJvcnQgdGhlIGl0ZXJhdGlvbiwgdGhpcyBtdXN0IGJlIGEgc3luY2hyb25vdXMgZXhjZXB0aW9uLiovXG50aHJvdyBwdWJsaXNoRXhjZXB0aW9uO1xuIH1cblxuLyogUHVibGlzaCB0aGUgdmFsdWUsIGNhcHR1cmluZyBhbnkgZXJyb3IuKi9cbkUobWFyc2hhbGxlcikuXG50b0NhcERhdGEob2JqKS5cbnRoZW4oKHNlcmlhbGl6ZWQpPT57XG5jb25zdCBlbmNvZGVkPUpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuIH0pLlxuY2F0Y2goZmFpbCk7XG4gfTtcblxuaWYoc3RvcmFnZU5vZGUpe1xuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5vYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmlwdGlvbix7XG51cGRhdGVTdGF0ZTpwdWJsaXNoVmFsdWUsXG5maW5pc2g6cHVibGlzaFZhbHVlfSkuXG5jYXRjaChmYWlsKTtcbiB9XG5cbi8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpcHRpb24nLHtcbi8qIEB0cy1leHBlY3QtZXJyb3IgZ2V0U3RvcmVLZXkgdHlwZSBkb2VzIG5vdCBoYXZlIGBzdWJzY3JpcHRpb25gKi9cbmdldFN0b3JlS2V5OmFzeW5jKCk9PntcbmlmKCFzdG9yYWdlTm9kZSl7XG5yZXR1cm4gaGFyZGVuKHtzdWJzY3JpcHRpb259KTtcbiB9XG5jb25zdCBzdG9yZUtleT1hd2FpdCBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpO1xucmV0dXJuIGhhcmRlbih7Li4uc3RvcmVLZXksc3Vic2NyaXB0aW9ufSk7XG4gfSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyLFxuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6KCk9Plxuc3Vic2NyaXB0aW9uLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCksXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zdWJzY3JpcHRpb25bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCksXG5zdWJzY3JpYmVBZnRlcjoocHVibGlzaENvdW50KT0+c3Vic2NyaXB0aW9uLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCl9KTtcblxucmV0dXJuIHN0b3Jlc3ViO1xuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBTdG9yZWRQdWJsaXNoS2l0XG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaGVyS2l0XG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaWJlclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGlzaGVyXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbmNvbXBhdGlibGUgd2l0aCBkdXJhYmlsaXR5OyBpbnN0ZWFkIGhhbmRsZSB2c3RvcmFnZSBlcGhlbWVyYWxseSBvbiBhIGR1cmFibGUgUHVibGlzaEtpdFxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBbbWFyc2hhbGxlcl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hpbGRQYXRoXVxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hlcktpdDxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQ9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIsY2hpbGRQYXRoKT0+e1xuY29uc3R7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufT1tYWtlU3Vic2NyaXB0aW9uS2l0KCk7XG5cbmlmKHN0b3JhZ2VOb2RlJiZjaGlsZFBhdGgpe1xuc3RvcmFnZU5vZGU9RShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZFBhdGgpO1xuIH1cblxuLyogd3JhcCB0aGUgc3Vic2NyaXB0aW9uIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSwgcmVwZWF0aW5nIHRvIHRoaXMgYHN1YnNjcmliZXJgKi9cbmNvbnN0IHN1YnNjcmliZXI9bWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcik7XG5cblxucmV0dXJue1xucHVibGlzaGVyOnB1YmxpY2F0aW9uLFxuc3Vic2NyaWJlcn07XG5cbiB9O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIGluY29tcGF0aWJsZSB3aXRoIGR1cmFiaWxpdHk7IGluc3RlYWQgaGFuZGxlIHZzdG9yYWdlIGVwaGVtZXJhbGx5IG9uIGEgZHVyYWJsZSBQdWJsaXNoS2l0XG4gKlxuICogTGlrZSBtYWtlUHVibGlzaEtpdCB0aGlzIG1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIFdoYXQncyBkaWZmZXJlbnQgaXMgYHN1YnNjcmliZXJgIHRlZXMgcmVjb3Jkcywgd3JpdGluZyBvdXQgdG8gc3RvcmFnZU5vZGUuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaEtpdDxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hlcktpdChtYWtlU3RvcmVkUHVibGlzaGVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkUHVibGlzaEtpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5yZXR1cm57XG5wdWJsaXNoZXIsXG4vKiB3cmFwIHRoZSBzdWJzY3JpYmVyIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSovXG5zdWJzY3JpYmVyOm1ha2VTdG9yZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcil9O1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWRQdWJsaXNoS2l0KG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCJdLCJtYWtlU3RvcmVkU3Vic2NyaWJlciI6WyJtYWtlU3RvcmVkU3Vic2NyaWJlciJdLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIjpbIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCI6WyJtYWtlU3RvcmVkUHVibGlzaGVyS2l0Il0sIm1ha2VTdG9yZWRQdWJsaXNoS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHVi4yhuJAAAbiQAACgAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMS9zcmMvc3Vic2NyaWJlLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbInN1YnNjcmliZSIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsaXNPYmplY3QsaXNVcGdyYWRlRGlzY29ubmVjdGlvbjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qc1wiLCBbW1wiaXNVcGdyYWRlRGlzY29ubmVjdGlvblwiLCBbJGjigI1fYSA9PiAoaXNVcGdyYWRlRGlzY29ubmVjdGlvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcbmNvbnN0IHNpbms9KCk9PnsgfTtcblxuLyoqXG4gKiBDaGVjayB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGZvciByZWplY3Rpb24gYnkgdmF0IHVwZ3JhZGUsXG4gKiBhbmQgcmVmZXRjaCB1cG9uIGVuY291bnRlcmluZyB0aGF0IGNvbmRpdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBFUmVmPFQ+fSBnZXR0ZXJcbiAqIEBwYXJhbSB7RVJlZjxUPltdfSBbc2VlZF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fVxuICovXG5jb25zdCByZWNvbm5lY3RBc05lZWRlZD1hc3luYyhnZXR0ZXIsc2VlZD1bXSk9PntcbmxldCBkaXNjb25uZWN0aW9uO1xubGV0IGxhc3RWZXJzaW9uPS1JbmZpbml0eTtcbi8qIEVuZCBzeW5jaHJvbm91cyBwcmVsdWRlLiovXG5hd2FpdCBudWxsO1xuZm9yKGxldCBpPTA7O2krPTEpe1xudHJ5e1xuY29uc3QgcmVzdWx0UD1pPHNlZWQubGVuZ3RoP3NlZWRbaV06Z2V0dGVyKCk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcCwgQGplc3NpZS5qcy9uby1uZXN0ZWQtYXdhaXQqL1xuY29uc3QgcmVzdWx0PWF3YWl0IHJlc3VsdFA7XG5yZXR1cm4gcmVzdWx0O1xuIH1jYXRjaChlcnIpe1xuaWYoaXNVcGdyYWRlRGlzY29ubmVjdGlvbihlcnIpKXtcbmlmKCFkaXNjb25uZWN0aW9uKXtcbmRpc2Nvbm5lY3Rpb249ZXJyO1xuIH1cbmNvbnN0e2luY2FybmF0aW9uTnVtYmVyOnZlcnNpb259PWVycjtcbmlmKHZlcnNpb24+bGFzdFZlcnNpb24pe1xuLyogV2UgZG9uJ3QgZXhwZWN0IGFub3RoZXIgdXBncmFkZSBpbiBiZXR3ZWVuIHJlY2VpdmluZyovXG4vKiBhIGRpc2Nvbm5lY3Rpb24gYW5kIHJlLXJlcXVlc3RpbmcgYW4gdXBkYXRlLCBidXQgbXVzdCovXG4vKiBuZXZlcnRoZWxlc3MgYmUgcHJlcGFyZWQgZm9yIHRoYXQuKi9cbmxhc3RWZXJzaW9uPXZlcnNpb247XG5jb250aW51ZTtcbiB9XG4gfVxuLyogaWYgYGVycmAgaXMgYW4gKEVycm9yKSBvYmplY3QsIHdlIGNhbiB0cnkgdG8gYXNzb2NpYXRlIGl0IHdpdGgqL1xuLyogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRpc2Nvbm5lY3Rpb24gdGhhdCBwcm9tcHRlZCB0aGUgcmVxdWVzdCovXG4vKiBmb3Igd2hpY2ggaXQgaXMgYSByZXN1bHQuKi9cbmlmKGlzT2JqZWN0KGVycikmJmRpc2Nvbm5lY3Rpb24mJmRpc2Nvbm5lY3Rpb24hPT1lcnIpe1xudHJ5e1xuYXNzZXJ0Lm5vdGUoXG5lcnIsXG5YIGBBdHRlbXB0aW5nIHRvIHJlY292ZXIgZnJvbSBkaXNjb25uZWN0aW9uOiAke2Rpc2Nvbm5lY3Rpb259YCk7XG5cbiB9Y2F0Y2goX2Vycil7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHkqL1xuIH1cbiB9XG50aHJvdyBlcnI7XG4gfVxuIH1cbiB9O1xuXG4vKipcbiAqIENyZWF0ZSBhIG5lYXIgaXRlcmFibGUgdGhhdCBjb3JyZXNwb25kcyB0byBhIHBvdGVudGlhbGx5IGZhciBvbmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VD4+fSBpdFBcbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZT0oaXRQKT0+XG5GYXIoJ0FzeW5jSXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbmNvbnN0IGl0PUUoaXRQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbmNvbnN0IHNlbGY9RmFyKCdBc3luY0l0ZXJhYmxlSXRlcmF0b3InLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PnNlbGYsXG5uZXh0OmFzeW5jKCk9PkUoaXQpLm5leHQoKX0pO1xuXG5yZXR1cm4gc2VsZjtcbiB9fSk7XG5cblxuLyoqXG4gKiBBc3luY3Jvbm91c2x5IGl0ZXJhdGVzIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGEgUHVibGljYXRpb25SZWNvcmQgY2hhaW4gYXMgdGhleVxuICogYXBwZWFyLiAgVGhpcyBpdGVyYXRpb24gbXVzdCBkcm9wIHBhcnRzIG9mIHB1YmxpY2F0aW9uIHJlY29yZHMgdGhhdCBhcmUgbm9cbiAqIGxvbmdlciBuZWVkZWQgc28gdGhleSBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICogQHBhcmFtIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gbmV4dENlbGxQXG4gKiAgIFB1YmxpY2F0aW9uUmVjb3JkIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgZmlyc3QgaXRlcmF0aW9uIHJlc3VsdFxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovJGjigI1fb25jZS5zdWJzY3JpYmUoc3Vic2NyaWJlKTtcbmNvbnN0IG1ha2VFYWNoSXRlcmF0b3I9KHRvcGljLG5leHRDZWxsUCk9Pntcbi8qIFRvIHVuZGVyc3RhbmQgdGhlIGltcGxlbWVudGF0aW9uLCBzdGFydCB3aXRoKi9cbi8qIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MDQwNDEyMjI1MC9odHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1zdHJhd21hbjpjb25jdXJyZW5jeSNpbmZpbml0ZV9xdWV1ZSovXG5jb25zdCBzZWxmPUZhcignRWFjaEl0ZXJhdG9yJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zZWxmLFxubmV4dDooKT0+e1xuY29uc3R7XG5oZWFkOnJlc3VsdFAsXG5wdWJsaXNoQ291bnQ6cHVibGlzaENvdW50UCxcbnRhaWw6dGFpbFB9PVxuRS5nZXQobmV4dENlbGxQKTtcblxuLyogSWYgdGFpbFAgaXMgYnJva2VuIGJ5IHVwZ3JhZGUsIHdlIHdpbGwgbmVlZCB0byByZS1yZXF1ZXN0IGl0Ki9cbi8qIGRpcmVjdGx5IGZyb20gYHRvcGljYC4qL1xuY29uc3QgZ2V0U3VjY2Vzc29yPWFzeW5jKCk9PntcbmNvbnN0IHB1Ymxpc2hDb3VudD1hd2FpdCBwdWJsaXNoQ291bnRQO1xuYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsJ2JpZ2ludCcpO1xuY29uc3Qgc3VjY2Vzc29yPWF3YWl0IEUodG9waWMpLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCk7XG5jb25zdCBuZXdQdWJsaXNoQ291bnQ9c3VjY2Vzc29yLnB1Ymxpc2hDb3VudDtcbmlmKG5ld1B1Ymxpc2hDb3VudCE9PXB1Ymxpc2hDb3VudCsxbil7XG5GYWlsIGBlYWNoSXRlcmF0b3IgYnJva2VuIGJ5IGdhcCBmcm9tIHB1Ymxpc2hDb3VudCAke3B1Ymxpc2hDb3VudH0gdG8gJHtuZXdQdWJsaXNoQ291bnR9YDtcbiB9XG5yZXR1cm4gc3VjY2Vzc29yO1xuIH07XG5cbi8qIFJlcGxhY2UgbmV4dENlbGxQIG9uIGV2ZXJ5IGNhbGwgdG8gbmV4dCgpIHNvIHRoaW5ncyB3b3JrIGV2ZW4qL1xuLyogd2l0aCBhbiBlYWdlciBjb25zdW1lciB0aGF0IGRvZXNuJ3Qgd2FpdCBmb3IgcmVzdWx0cyB0byBzZXR0bGUuKi9cbm5leHRDZWxsUD1yZWNvbm5lY3RBc05lZWRlZChnZXRTdWNjZXNzb3IsW3RhaWxQXSk7XG5cbi8qIEF2b2lkIHVuaGFuZGxlZCByZWplY3Rpb24gd2FybmluZ3MgaGVyZSBpZiB0aGUgcHJldmlvdXMgY2VsbCB3YXMgcmVqZWN0ZWQgb3IqL1xuLyogdGhlcmUgaXMgbm8gZnVydGhlciByZXF1ZXN0IG9mIHRoaXMgaXRlcmF0b3IuKi9cbi8qIGB0YWlsUGAgaXMgaGFuZGxlZCBpbnNpZGUgYHJlY29ubmVjdEFzTmVlZGVkYCBhbmQgYHJlc3VsdFBgIGlzIHRoZSBjYWxsZXIncyovXG4vKiBjb25jZXJuLCBsZWF2aW5nIG9ubHkgYHB1Ymxpc2hDb3VudFBgIGFuZCB0aGUgbmV3IGBuZXh0Q2VsbFBgLiovXG52b2lkIEUud2hlbihwdWJsaXNoQ291bnRQLHNpbmssc2luayk7XG52b2lkIEUud2hlbihuZXh0Q2VsbFAsc2luayxzaW5rKTtcbnJldHVybiByZXN1bHRQO1xuIH0sXG5mb3JrOigpPT5tYWtlRWFjaEl0ZXJhdG9yKHRvcGljLG5leHRDZWxsUCl9KTtcblxucmV0dXJuIHNlbGY7XG4gfTtcblxuLyoqXG4gKiBHaXZlbiBhIGxvY2FsIG9yIHJlbW90ZSBzdWJzY3JpYmVyLCByZXR1cm5zIGEgbG9jYWwgQXN5bmNJdGVyYWJsZSB3aGljaFxuICogcHJvdmlkZXMgXCJwcmVmaXggbG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwicHJlZml4IGxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgZXZlcnl0aGluZyBwdWJsaXNoZWQgYmVmb3JlXG4gKiB5b3UgYXNrIHRoZSByZXR1cm5lZCBpdGVyYWJsZSBmb3IgYW4gaXRlcmF0b3IuIEJ1dCB0aGUgcmV0dXJuZWQgaXRlcmF0b3JcbiAqIHdpbGwgZW51bWVyYXRlIGVhY2ggdGhpbmcgcHVibGlzaGVkIGZyb20gdGhhdCBpdGVyYXRvcidzIHN0YXJ0aW5nIHBvaW50XG4gKiB1cCB0byBhIGRpc2Nvbm5lY3Rpb24gcmVzdWx0IGluZGljYXRpbmcgdXBncmFkZSBvZiB0aGUgcHJvZHVjZXJcbiAqICh3aGljaCBicmVha3MgdGhlIGdhcC1mcmVlIGd1YXJhbnRlZSBhbmQgdGhlcmVmb3JlIHRlcm1pbmF0ZXMgYW55IGFjdGl2ZVxuICogaXRlcmF0b3Igd2hpbGUgc3RpbGwgc3VwcG9ydGluZyBjcmVhdGlvbiBvZiBuZXcgaXRlcmF0b3JzKS5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZUVhY2g9KHRvcGljKT0+e1xuY29uc3QgaXRlcmFibGU9RmFyKCdFYWNoSXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbmNvbnN0IGZpcnN0Q2VsbFA9cmVjb25uZWN0QXNOZWVkZWQoKCk9PkUodG9waWMpLnN1YnNjcmliZUFmdGVyKCkpO1xucmV0dXJuIG1ha2VFYWNoSXRlcmF0b3IodG9waWMsZmlyc3RDZWxsUCk7XG4gfX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLnN1YnNjcmliZUVhY2goc3Vic2NyaWJlRWFjaCk7XG5oYXJkZW4oc3Vic2NyaWJlRWFjaCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKiBAcGFyYW0ge2JpZ2ludH0gW2xvY2FsVXBkYXRlQ291bnRdXG4gKiBAcGFyYW0ge0l0ZXJhdG9yUmV0dXJuUmVzdWx0PFQ+fSBbdGVybWluYWxSZXN1bHRdXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVD59XG4gKi9cbmNvbnN0IGNsb25lTGF0ZXN0SXRlcmF0b3I9KHRvcGljLGxvY2FsVXBkYXRlQ291bnQsdGVybWluYWxSZXN1bHQpPT57XG5sZXQgbXV0ZXg9UHJvbWlzZS5yZXNvbHZlKCk7XG5cbi8qKlxuICogUmVxdWVzdCB0aGUgbmV4dCB1cGRhdGUgcmVjb3JkIGZyb20gdGhlIHRvcGljLCB1cGRhdGluZyBvdXIgbG9jYWwgc3RhdGUsXG4gKiBhbmQgY29udmVydCBpdCB0byBhbiBpdGVyYXRvciByZXN1bHQuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVD4+fVxuICovXG5jb25zdCBtYXliZVJlcXVlc3ROZXh0UmVzdWx0PWFzeW5jKCk9PntcbmlmKHRlcm1pbmFsUmVzdWx0KXtcbi8qIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdG9waWMsIGp1c3Qga2VlcCByZXR1cm5pbmcgdGhlIGxhc3QgcmVzdWx0Ki9cbi8qIHdpdGhvdXQgZnVydGhlciByZXF1ZXN0cy4qL1xucmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuIH1cblxuLyogU2VuZCB0aGUgbmV4dCByZXF1ZXN0IG5vdywgc2tpcHBpbmcgcGFzdCBpbnRlcm1lZGlhdGUgdXBkYXRlcyovXG4vKiBhbmQgdXBncmFkZSBkaXNjb25uZWN0aW9ucy4qL1xuY29uc3R7dmFsdWUsdXBkYXRlQ291bnR9PWF3YWl0IHJlY29ubmVjdEFzTmVlZGVkKCgpPT5cbkUodG9waWMpLmdldFVwZGF0ZVNpbmNlKGxvY2FsVXBkYXRlQ291bnQpKTtcblxuLyogTWFrZSBzdXJlIHRoZSBuZXh0IHJlcXVlc3QgaXMgZm9yIGEgZnJlc2hlciB2YWx1ZS4qL1xubG9jYWxVcGRhdGVDb3VudD11cGRhdGVDb3VudDtcblxuLyogTWFrZSBhbiBJdGVyYXRvclJlc3VsdC4qL1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xudGVybWluYWxSZXN1bHQ9aGFyZGVuKHtkb25lOnRydWUsdmFsdWV9KTtcbnJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfTtcblxuY29uc3Qgc2VsZj1GYXIoJ0xhdGVzdEl0ZXJhdG9yJyx7XG5mb3JrOigpPT5jbG9uZUxhdGVzdEl0ZXJhdG9yKHRvcGljLGxvY2FsVXBkYXRlQ291bnQsdGVybWluYWxSZXN1bHQpLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+c2VsZixcbm5leHQ6YXN5bmMoKT0+e1xuLyogSW4gdGhpcyBhZGFwdG9yLCBvbmNlIGBuZXh0KClgIGlzIGNhbGxlZCBhbmQgcmV0dXJucyBhbiB1bnJlc29sdmVkKi9cbi8qIHByb21pc2UsIGZ1cnRoZXIgYG5leHQoKWAgY2FsbHMgd2lsbCBhbHNvIHJldHVybiB1bnJlc29sdmVkIHByb21pc2VzKi9cbi8qIGJ1dCBlYWNoIGNhbGwgd2lsbCBub3QgdHJpZ2dlciBhbm90aGVyIGB0b3BpY2AgcmVxdWVzdCB1bnRpbCB0aGUgcHJpb3IqL1xuLyogb25lIGhhcyBzZXR0bGVkLiovXG4vKiovXG4vKiBUaGlzIGxpbmVhciBxdWV1ZWluZyBiZWhhdmlvciBpcyBvbmx5IG5lZWRlZCBmb3IgY29kZSB0aGF0IHVzZXMgdGhlKi9cbi8qIGFzeW5jIGl0ZXJhdG9yIHByb3RvY29sIGV4cGxpY2l0bHkuIFdoZW4gdGhpcyBhc3luYyBpdGVyYXRvciBpcyovXG4vKiBjb25zdW1lZCBieSBhIGZvci9hd2FpdC9vZiBsb29wLCBgbmV4dCgpYCB3aWxsIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZSovXG4vKiBwcm9taXNlIGZvciB0aGUgcHJldmlvdXMgaXRlcmF0aW9uIHJlc3VsdCBoYXMgZnVsZmlsbGVkLiBJZiBpdCBmdWxmaWxscyovXG4vKiB3aXRoIGBkb25lOiB0cnVlYCwgdGhlIGZvci9hd2FpdC9vZiBsb29wIHdpbGwgbmV2ZXIgY2FsbCBgbmV4dCgpYCovXG4vKiBhZ2Fpbi4qL1xuLyoqL1xuLyogU2VlKi9cbi8qIGh0dHBzOi8vMmFsaXR5LmNvbS8yMDE2LzEwL2FzeW5jaHJvbm91cy1pdGVyYXRpb24uaHRtbCNxdWV1aW5nLW5leHQoKS1pbnZvY2F0aW9ucyovXG4vKiBmb3IgYW4gZXhwbGljaXQgdXNlIHRoYXQgc2VuZHMgYG5leHQoKWAgd2l0aG91dCB3YWl0aW5nLiovXG5cbmlmKHRlcm1pbmFsUmVzdWx0KXtcbi8qIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdG9waWMsIGp1c3Qga2VlcCByZXR1cm5pbmcgdGhlIGxhc3QqL1xuLyogcmVzdWx0LiovXG5yZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gfVxuXG4vKiBCRUdJTiBDUklUSUNBTCBTRUNUSU9OIC0gc3luY2hyb25vdXNseSBlbnF1ZXVlIGFuZCByZWFzc2lnbiBgbXV0ZXhgKi9cbi8qKi9cbi8qIFVzZSBgbXV0ZXhgIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgbm8gbW9yZSB0aGFuIGEgc2luZ2xlIHJlcXVlc3QgaW4qL1xuLyogZmxpZ2h0LiovXG5jb25zdCBuZXh0UmVzdWx0PW11dGV4LnRoZW4obWF5YmVSZXF1ZXN0TmV4dFJlc3VsdCk7XG5tdXRleD1uZXh0UmVzdWx0LnRoZW4oc2luayxzaW5rKTtcbi8qIEVORCBDUklUSUNBTCBTRUNUSU9OKi9cblxucmV0dXJuIG5leHRSZXN1bHQ7XG4gfX0pO1xuXG5yZXR1cm4gc2VsZjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovXG5jb25zdCBtYWtlTGF0ZXN0SXRlcmF0b3I9KHRvcGljKT0+Y2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYyk7XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwibG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwibG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBhbnkgcHVibGlzaGVkIHN0YXRlIGlmIGEgbW9yZVxuICogcmVjZW50IHB1Ymxpc2hlZCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCBieSB1cGdyYWRlIG9mIHRoZSBwcm9kdWNlcixcbiAqIGl0IHdpbGwgYmUgcmUtcmVxdWVzdGVkLiBBbGwgb3RoZXIgdGVybWluYWwgdmFsdWVzIHdpbGwgYmUgbG9zc2xlc3NseVxuICogcHJvcGFnYXRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gdG9waWNcbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZUxhdGVzdD0odG9waWMpPT57XG5jb25zdCBpdGVyYWJsZT1GYXIoJ0xhdGVzdEl0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5tYWtlTGF0ZXN0SXRlcmF0b3IodG9waWMpfSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2Uuc3Vic2NyaWJlTGF0ZXN0KHN1YnNjcmliZUxhdGVzdCk7XG5oYXJkZW4oc3Vic2NyaWJlTGF0ZXN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdWJzY3JpYmUiOlsic3Vic2NyaWJlIl0sInN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCJdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACeyOyPFCwAAxQsAACkAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMS9zcmMvc3Vic2NyaWJlci5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL3RvcGljLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsc3Vic2NyaWJlRWFjaCxtYWtlUHVibGlzaEtpdCxtYWtlUGlubmVkSGlzdG9yeVRvcGljOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUVhY2hcIiwgWyRo4oCNX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaOKAjV9hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vdG9waWMuanNcIiwgW1tcIm1ha2VQaW5uZWRIaXN0b3J5VG9waWNcIiwgWyRo4oCNX2EgPT4gKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICogQHJldHVybnMge1N1YnNjcmlwdGlvbjxUPn1cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbj0odG9waWMpPT57XG5jb25zdCBzdWJzY3JpcHRpb249RmFyKCdTdWJzY3JpcHRpb24nLHtcbi4uLnN1YnNjcmliZUVhY2godG9waWMpLFxuc3Vic2NyaWJlQWZ0ZXI6YXN5bmMocHVibGlzaENvdW50KT0+RSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgU3Vic2NyaXB0aW9uIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBTdWJzY3JpcHRpb24gdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZVN1YnNjcmlwdGlvbmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBTdWJzY3JpcHRpb24gYXQgdGhhdCBzaXRlLlxuICovXG5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczphc3luYygpPT50b3BpYyxcblxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7c3Vic2NyaXB0aW9ufSl9KTtcblxucmV0dXJuIHN1YnNjcmlwdGlvbjtcbiB9OyRo4oCNX29uY2UubWFrZVN1YnNjcmlwdGlvbihtYWtlU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uKTtcblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFByb2R1Y2VycyBzaG91bGQgdXNlXG4gKiBgYGBqc1xuICogY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VQdWJsaXNoS2l0KCk7XG4gKiBjb25zdCB0b3BpYyA9IG1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG4gKiBgYGBcbiAqIGluc3RlYWQsIHdoaWNoIG1ha2VzIGl0IGNsZWFyZXIgdGhhdCBhbGwgdGhlIHN1YnNjcmliZXIncyBoaXN0b3J5IGlzXG4gKiByZXRhaW5lZCwgcHJldmVudGluZyBHQy4gIFBvdGVudGlhbGx5IHJlbW90ZSBjb25zdW1lcnMgdXNlXG4gKiBgYGBqc1xuICogZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBzdWJzY3JpYmVFYWNoKHRvcGljKSkgeyAuLi4gfVxuICogYGBgXG4gKlxuICogTWFrZXMgYSBgeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH1gIGZvciBkb2luZyBsb3NzbGVzcyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb25SZWNvcmQ8VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb25LaXQ9KCk9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG4vKiBUaGUgcHVibGlzaCBraXQgc3Vic2NyaWJlciBpcyBwcmVmaXgtbG9zc3ksIHNvIG1ha2luZyAqdGhpcyogc3Vic2NyaWJlciBjb21wbGV0ZWx5Ki9cbi8qIGxvc3NsZXNzIGZyb20gaW5pdGlhbGlzYXRpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgZm9ybWVyJ3MgaGlzdG9yeS4qL1xuXG5jb25zdCBwaW5uZWRIaXN0b3J5VG9waWM9bWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhzdWJzY3JpYmVyKTtcbmNvbnN0IHN1YnNjcmlwdGlvbj1tYWtlU3Vic2NyaXB0aW9uKHBpbm5lZEhpc3RvcnlUb3BpYyk7XG5cbi8qKiBAdHlwZSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59ICovXG5jb25zdCBwdWJsaWNhdGlvbj1GYXIoJ3B1YmxpY2F0aW9uJyx7XG51cGRhdGVTdGF0ZToobm9uRmluYWxWYWx1ZSk9PnB1Ymxpc2hlci5wdWJsaXNoKG5vbkZpbmFsVmFsdWUpLFxuZmluaXNoOihjb21wbGV0aW9uKT0+cHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbmZhaWw6KHJlYXNvbik9PnB1Ymxpc2hlci5mYWlsKHJlYXNvbil9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtwdWJsaWNhdGlvbixzdWJzY3JpcHRpb259KTtcbiB9OyRo4oCNX29uY2UubWFrZVN1YnNjcmlwdGlvbktpdChtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3Vic2NyaXB0aW9uIjpbIm1ha2VTdWJzY3JpcHRpb24iXSwibWFrZVN1YnNjcmlwdGlvbktpdCI6WyJtYWtlU3Vic2NyaXB0aW9uS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACGBFnIMBgAADAYAACQAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMS9zcmMvdG9waWMuanN7ImltcG9ydHMiOlsiLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgQSBwaW5uZWQtaGlzdG9yeSB0b3BpYyBwcmVzZXJ2ZXMgYWxsIG9mIGl0cyBwdWJsaXNoZWQgdmFsdWVzIGluXG4gKiBtZW1vcnkuICBVc2UgYSBwcmVmaXgtbG9zc3kgbWFrZVB1Ymxpc2hLaXQgaW5zdGVhZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFYWNoVG9waWM8VD4gJiBMYXRlc3RUb3BpYzxUPn0gdG9waWMgbmVlZHMgdG8gYmUgbmVhciBpbiBvcmRlciB0b1xuICogcHJlc2VydmUgc3Vic2NyaXB0aW9uIHRpbWluZ3MuICBUT0RPOiBkcm9wIExhdGVzdFRvcGljPFQ+IHJlcXVpcmVtZW50XG4gKiBAcmV0dXJucyB7RWFjaFRvcGljPFQ+ICYgTGF0ZXN0VG9waWM8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUGlubmVkSGlzdG9yeVRvcGljPSh0b3BpYyk9Pntcbi8qIFN1Y2ggbG9zc2xlc3NuZXNzIGluaGliaXRzIEdDLCB3aGljaCBpcyB3aHkgd2UncmUgbW92aW5nIGF3YXkgZnJvbSBpdC4qL1xuXG4vKiBXZSBuZWVkIHRvIHRha2UgYW4gaW1tZWRpYXRlIHNuYXBzaG90IG9mIHRoZSB0b3BpYydzIGN1cnJlbnQgc3RhdGUuKi9cbmNvbnN0IHBpbm5lZFB1Ykxpc3Q9dG9waWMuc3Vic2NyaWJlQWZ0ZXIoKTtcblxucmV0dXJuIEZhcignUGlubmVkSGlzdG9yeVRvcGljJyx7XG5zdWJzY3JpYmVBZnRlcjphc3luYyhwdWJsaXNoQ291bnQ9LTFuKT0+e1xuaWYocHVibGlzaENvdW50PT09LTFuKXtcbnJldHVybiBwaW5uZWRQdWJMaXN0O1xuIH1cbnJldHVybiB0b3BpYy5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuIH0sXG5nZXRVcGRhdGVTaW5jZTphc3luYyh1cGRhdGVDb3VudD11bmRlZmluZWQpPT57XG4vKiBUT0RPOiBCdWlsZCB0aGlzIG91dCBvZiBFYWNoVG9waWM8VD4uKi9cbnJldHVybiB0b3BpYy5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VQaW5uZWRIaXN0b3J5VG9waWMobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG5oYXJkZW4obWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPhRDxM/MAAAPzAAACwAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMS9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxUPn0gRVJlZlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wcm9taXNlLWtpdCcpLlByb21pc2VLaXQ8VD59IFByb21pc2VLaXRcbiAqL1xuXG4vKipcbiAqIERlcHJlY2F0ZWQuIFVzZSBQcm9taXNlS2l0IGluc3RlYWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wcm9taXNlLWtpdCcpLlByb21pc2VSZWNvcmQ8VD59IFByb21pc2VSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgW1RSZXR1cm49YW55XVxuICogQHRlbXBsYXRlIFtUTmV4dD11bmRlZmluZWRdXG4gKiBAdHlwZWRlZiB7QXN5bmNJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD4gJiB7XG4gKiAgIGZvcmsoKTogRm9ya2FibGVBc3luY0l0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PlxuICogfX0gRm9ya2FibGVBc3luY0l0ZXJhdG9yIEFuIEFzeW5jSXRlcmF0b3IgdGhhdCBjYW4gYmUgZm9ya2VkIGF0IGEgZ2l2ZW4gcG9zaXRpb25cbiAqIGludG8gbXVsdGlwbGUgaW5kZXBlbmRlbnQgRm9ya2FibGVBc3luY0l0ZXJhdG9ycyBzdGFydGluZyBmcm9tIHRoYXQgcG9zaXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtUUmV0dXJuPWFueV1cbiAqIEB0ZW1wbGF0ZSBbVE5leHQ9dW5kZWZpbmVkXVxuICogQHR5cGVkZWYge3sgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+IH19IEFzeW5jSXRlcmFibGVPbmx5XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtUUmV0dXJuPWFueV1cbiAqIEB0ZW1wbGF0ZSBbVE5leHQ9dW5kZWZpbmVkXVxuICogQHR5cGVkZWYge3tcbiAqICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD4sXG4gKiAgIGZvcmsoKTogRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+IH0gJlxuICogICBGb3JrYWJsZUFzeW5jSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+XG4gKiB9IEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtUUmV0dXJuPWFueV1cbiAqIEB0ZW1wbGF0ZSBbVE5leHQ9dW5kZWZpbmVkXVxuICogQHR5cGVkZWYge3tcbiAqICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gRm9ya2FibGVBc3luY0l0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PlxuICogfX0gRm9ya2FibGVBc3luY0l0ZXJhYmxlXG4gKiBBbiBBc3luY0l0ZXJhYmxlIHRoYXQgcHJvZHVjZXMgRm9ya2FibGVBc3luY0l0ZXJhdG9ycy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJdGVyYXRpb25PYnNlcnZlcjxUPlxuICogQSB2YWxpZCBzZXF1ZW5jZSBvZiBjYWxscyB0byB0aGUgbWV0aG9kcyBvZiBhbiBgSXRlcmF0aW9uT2JzZXJ2ZXJgXG4gKiByZXByZXNlbnRzIGFuIGl0ZXJhdGlvbi4gQSB2YWxpZCBzZXF1ZW5jZSBjb25zaXN0cyBvZiBhbnkgbnVtYmVyIG9mIGNhbGxzXG4gKiB0byBgdXBkYXRlU3RhdGVgIHdpdGggdGhlIHN1Y2Nlc3NpdmUgbm9uLWZpbmFsIHZhbHVlcywgZm9sbG93ZWQgYnkgYVxuICogZmluYWwgY2FsbCB0byBlaXRoZXIgYGZpbmlzaGAgd2l0aCBhIHN1Y2Nlc3NmdWwgYGNvbXBsZXRpb25gIHZhbHVlXG4gKiBvciBgZmFpbGAgd2l0aCB0aGUgYWxsZWdlZCBgcmVhc29uYCBmb3IgZmFpbHVyZS4gQWZ0ZXIgYXQgbW9zdCBvbmVcbiAqIHRlcm1pbmF0aW5nIGNhbGxzLCBubyBmdXJ0aGVyIGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYXJlIHZhbGlkIGFuZCBtdXN0IGJlXG4gKiByZWplY3RlZC5cbiAqIEBwcm9wZXJ0eSB7KG5vbkZpbmFsVmFsdWU6IFQpID0+IHZvaWR9IHVwZGF0ZVN0YXRlXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBUKSA9PiB2b2lkfSBmaW5pc2hcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbjogdW5rbm93bikgPT4gdm9pZH0gZmFpbFxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGljYXRpb25SZWNvcmRcbiAqIFdpbGwgYmUgc2hhcmVkIGJldHdlZW4gbWFjaGluZXMsIHNvIGl0IG11c3QgYmUgc2FmZSB0byBleHBvc2UuIEJ1dCBzb2Z0d2FyZVxuICogb3V0c2lkZSB0aGUgY3VycmVudCBwYWNrYWdlIHNob3VsZCBjb25zaWRlciBpdCBvcGFxdWUsIG5vdCBkZXBlbmRpbmcgb24gaXRzXG4gKiBpbnRlcm5hbCBzdHJ1Y3R1cmUuXG4gKiBAcHJvcGVydHkge0l0ZXJhdG9yUmVzdWx0PFQ+fSBoZWFkXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gcHVibGlzaENvdW50IHN0YXJ0cyBhdCAxIGZvciB0aGUgZmlyc3QgcmVzdWx0XG4gKiAgIGFuZCBhZHZhbmNlcyBieSAxIGZvciBlYWNoIHN1YnNlcXVlbnQgcmVzdWx0XG4gKiBAcHJvcGVydHkge1Byb21pc2U8UHVibGljYXRpb25SZWNvcmQ8VD4+fSB0YWlsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gRWFjaFRvcGljXG4gKiBAcHJvcGVydHkgeyhwdWJsaXNoQ291bnQ/OiBiaWdpbnQpID0+IFByb21pc2U8UHVibGljYXRpb25SZWNvcmQ8VD4+fSBzdWJzY3JpYmVBZnRlclxuICogUmV0dXJucyBhIHByb21pc2UgZm9yIGEgXCJjdXJyZW50XCIgUHVibGljYXRpb25SZWNvcmQgKHJlZmVyZW5jaW5nIGl0c1xuICogaW1tZWRpYXRlIHN1Y2Nlc3NvciB2aWEgYSBgdGFpbGAgcHJvbWlzZSkgdGhhdCBpcyBsYXRlciB0aGFuIHRoZVxuICogcHJvdmlkZWQgcHVibGlzaENvdW50LlxuICogVXNlZCB0byBtYWtlIGZvcndhcmQtbG9zc2xlc3MgKFwiZWFjaFwiKSBpdGVyYXRvcnMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0ZvcmthYmxlQXN5bmNJdGVyYWJsZTxULCBUPiAmIEVhY2hUb3BpYzxUPn0gSXRlcmFibGVFYWNoVG9waWNcbiAqIEFuIEVhY2hUb3BpYyB3aXRoIGRlZmF1bHQgYXN5bmNJdGVyYWJsZSBiZWhhdmlvdXIuXG4gKlxuICogTk9URTogdGhlIHB1YmxpY2F0aW9uIHJlY29yZHMgYW5kIGl0ZXJhdG9ycyByZXR1cm5lZCBieSB0aGlzIG9iamVjdCBhcmVcbiAqIGVwaGVtZXJhbCBhbmQgd2lsbCBiZSBzZXZlcmVkIGR1cmluZyB1cGdyYWRlLiAgQSBjYWxsZXIgc2hvdWxkIHVzZVxuICogYHN1YnNjcmliZUVhY2hgIHRvIHdyYXAgdGhpcyB0b3BpYyBpbiBhIGxvY2FsIGl0ZXJhYmxlIHdoaWNoIGF1dG9tYXRpY2FsbHlcbiAqIGF0dGVtcHRzIHRvIHJlY29ubmVjdCB1cG9uIGJlaW5nIHNldmVyZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0FzeW5jSXRlcmFibGVPbmx5PFQsIFQ+ICYgTGF0ZXN0VG9waWM8VD59IEl0ZXJhYmxlTGF0ZXN0VG9waWNcbiAqIEEgTGF0ZXN0VG9waWMgd2l0aCBkZWZhdWx0IGFzeW5jSXRlcmFibGUgYmVoYXZpb3VyLlxuICpcbiAqIE5PVEU6IHRoZSBpdGVyYXRvcnMgcmV0dXJuZWQgYnkgdGhpcyBvYmplY3QgYXJlIGVwaGVtZXJhbCBhbmQgd2lsbCBiZSBzZXZlcmVkXG4gKiBkdXJpbmcgdXBncmFkZS4gIEEgY2FsbGVyIHNob3VsZCB1c2UgYHN1YnNjcmliZUxhdGVzdGAgdG8gd3JhcCB0aGlzIHRvcGljIGluXG4gKiBhIGxvY2FsIGl0ZXJhYmxlIHdoaWNoIGF1dG9tYXRpY2FsbHkgYXR0ZW1wdHMgdG8gcmVjb25uZWN0IHVwb24gYmVpbmdcbiAqIHNldmVyZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gTGF0ZXN0VG9waWNcbiAqIEBwcm9wZXJ0eSB7KHVwZGF0ZUNvdW50PzogYmlnaW50IHwgbnVtYmVyKSA9PiBQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59IGdldFVwZGF0ZVNpbmNlXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gdXBkYXRlIHJlY29yZCBhcyBvZiBhbiB1cGRhdGUgY291bnQuXG4gKiBJZiB0aGUgYHVwZGF0ZUNvdW50YCBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCB1cGRhdGUgY291bnQsXG4gKiB0aGUgcHJvbWlzZSBwcm9tcHRseSByZXNvbHZlcyB0byB0aGUgY3VycmVudCByZWNvcmQuXG4gKiBPdGhlcndpc2UsIGFmdGVyIHRoZSBuZXh0IHN0YXRlIGNoYW5nZSwgdGhlIHByb21pc2UgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdGluZyByZWNvcmQuXG4gKiBUaGlzIGlzIGFuIGF0dGVudWF0ZWQgZm9ybSBvZiBgc3Vic2NyaWJlQWZ0ZXJgIHdob3NlIHJldHVybiB2YWx1ZSBzdGFuZHMgYWxvbmUgYW5kXG4gKiBkb2VzIG5vdCBhbGxvdyBjb25zdW1lcnMgdG8gcGluIGEgY2hhaW4gb2YgaGlzdG9yaWNhbCBQdWJsaWNhdGlvblJlY29yZHMuXG4gKiBVc2VkIHRvIG1ha2UgbG9zc3kgKFwibGF0ZXN0XCIpIGl0ZXJhdG9ycy5cbiAqIE5PVEU6IFVzZSBvZiBgbnVtYmVyYCBhcyBhbiBgdXBkYXRlQ291bnRgIGlzIGRlcHJlY2F0ZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0xhdGVzdFRvcGljPFQ+fSBCYXNlTm90aWZpZXIgVGhpcyB0eXBlIGlzIGRlcHJlY2F0ZWQgYnV0IGlzIHN0aWxsXG4gKiB1c2VkIGV4dGVybmFsbHkuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0xhdGVzdFRvcGljPFQ+ICYgRWFjaFRvcGljPFQ+fSBTdWJzY3JpYmVyXG4gKiBBIHN0cmVhbSBvZiByZXN1bHRzIHRoYXQgYWxsb3dzIGNvbnN1bWVycyB0byBjb25maWd1cmVcbiAqIGZvcndhcmQtbG9zc2xlc3MgXCJlYWNoXCIgaXRlcmF0aW9uIHdpdGggYHN1YnNjcmliZUVhY2hgIGFuZFxuICogbG9zc3kgXCJsYXRlc3RcIiBpdGVyYXRpb24gd2l0aCBgc3Vic2NyaWJlTGF0ZXN0YC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaXNoZXJcbiAqIEEgdmFsaWQgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gdGhlIG1ldGhvZHMgb2YgYW4gYEl0ZXJhdGlvbk9ic2VydmVyYFxuICogcmVwcmVzZW50cyBhbiBpdGVyYXRpb24uIEEgdmFsaWQgc2VxdWVuY2UgY29uc2lzdHMgb2YgYW55IG51bWJlciBvZiBjYWxsc1xuICogdG8gYHB1Ymxpc2hgIHdpdGggdGhlIHN1Y2Nlc3NpdmUgbm9uLWZpbmFsIHZhbHVlcywgZm9sbG93ZWQgYnkgYVxuICogZmluYWwgY2FsbCB0byBlaXRoZXIgYGZpbmlzaGAgd2l0aCBhIHN1Y2Nlc3NmdWwgYGNvbXBsZXRpb25gIHZhbHVlXG4gKiBvciBgZmFpbGAgd2l0aCB0aGUgYWxsZWdlZCBgcmVhc29uYCBmb3IgZmFpbHVyZS4gQWZ0ZXIgYXQgbW9zdCBvbmVcbiAqIHRlcm1pbmF0aW5nIGNhbGxzLCBubyBmdXJ0aGVyIGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYXJlIHZhbGlkIGFuZCBtdXN0IGJlXG4gKiByZWplY3RlZC5cbiAqIEBwcm9wZXJ0eSB7KG5vbkZpbmFsVmFsdWU6IFQpID0+IHZvaWR9IHB1Ymxpc2hcbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IFQpID0+IHZvaWR9IGZpbmlzaFxuICogQHByb3BlcnR5IHsocmVhc29uOiBhbnkpID0+IHZvaWR9IGZhaWxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7UGFydGlhbDxQdWJsaXNoZXI8VD4+fSBQdWJsaXNoT2JzZXJ2ZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaXNoS2l0PFQ+XG4gKiBAcHJvcGVydHkge1B1Ymxpc2hlcjxUPn0gcHVibGlzaGVyXG4gKiBAcHJvcGVydHkge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRQdWJsaXNoS2l0PFQ+XG4gKiBAcHJvcGVydHkge1B1Ymxpc2hlcjxUPn0gcHVibGlzaGVyXG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYgeydtYW5kYXRvcnknIHwgJ29wcG9ydHVuaXN0aWMnIHwgJ2lnbm9yZWQnfSBEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eVxuICpcbiAqIER1cmFiaWxpdHkgY29uZmlndXJlcyBjb25zdHJhaW50cyBvbiBub24tdGVybWluYWwgdmFsdWVzIHRoYXQgY2FuIGJlXG4gKiBwdWJsaXNoZWQgdG8gYSBkdXJhYmxlIHB1Ymxpc2gga2l0ICh0ZXJtaW5hbCB2YWx1ZXMgc2VudCB0byBmaW5pc2ggb3IgZmFpbFxuICogbXVzdCBhbHdheXMgYmUgZHVyYWJsZSkuXG4gKiAtICdtYW5kYXRvcnknIG1lYW5zIHRoYXQgZWFjaCB2YWx1ZSBtdXN0IGJlIGR1cmFibGUsIHNvIGl0IGNhbiBiZSByZXN0b3JlZFxuICogICBvbiB1cGdyYWRlLlxuICogLSAnb3Bwb3J0dW5pc3RpYycgbWVhbnMgdGhhdCBhIGR1cmFibGUgdmFsdWUgaXMgcGVyc2lzdGVkIGZvciBwb3N0LXVwZ3JhZGVcbiAqICAgcmVzdG9yYXRpb24sIGJ1dCBhIG5vbi1kdXJhYmxlIHZhbHVlIGlzIHN0aWxsIGFjY2VwdGVkIChhbmQgd2lsbCByZXN1bHQgaW5cbiAqICAgdmFsdWVsZXNzIHJlc3RvcmF0aW9uKS5cbiAqIC0gJ2lnbm9yZWQnIG1lYW5zIHRoYXQgYSB2YWx1ZSBpcyBub3QgcGVyc2lzdGVkIGZvciByZXN0b3JhdGlvbiBldmVuIGlmIGl0XG4gKiAgIGlzIGR1cmFibGUuXG4gKlxuICogJ21hbmRhdG9yeScgaXMgdGhlIG9ubHkgY3VycmVudGx5LXN1cHBvcnRlZCB2YWx1ZSwgYW5kIG90aGVycyBtdXN0IG5vdCBiZVxuICogZW5hYmxlZCB3aXRob3V0IHRlc3QgY292ZXJhZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEdXJhYmxlUHVibGlzaEtpdFN0YXRlXG4gKlxuICogQHByb3BlcnR5IHtEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eX0gdmFsdWVEdXJhYmlsaXR5XG4gKlxuICogQHByb3BlcnR5IHtiaWdpbnR9IHB1Ymxpc2hDb3VudFxuICpcbiAqIEBwcm9wZXJ0eSB7J2xpdmUnIHwgJ2ZpbmlzaGVkJyB8ICdmYWlsZWQnfSBzdGF0dXNcbiAqXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGhhc1ZhbHVlXG4gKiBoYXNWYWx1ZSBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mIHZhbHVlLiBJdCBzdGFydHMgb2ZmIGZhbHNlLFxuICogYW5kIGNhbiBiZSByZXNldCB0byBmYWxzZSB3aGVuIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCBpcyByZXN0b3JlZCBhbmRcbiAqIHRoZSBwcmV2aW91cyB2YWx1ZSB3YXMgbm90IGR1cmFibGUsIG9yIG5vbi10ZXJtaW5hbCBhbmQgdmFsdWVEdXJhYmxpdHkgaXMgJ2lnbm9yZWQnLlxuICpcbiAqIEBwcm9wZXJ0eSB7YW55fSB2YWx1ZVxuICogdmFsdWUgaG9sZHMgZWl0aGVyIGEgbm9uLXRlcm1pbmFsIHZhbHVlIGZyb20gYHB1Ymxpc2hgIG9yIGEgdGVybWluYWwgdmFsdWVcbiAqIGZyb20gYGZpbmlzaGAgb3IgYGZhaWxgLCBkZXBlbmRpbmcgdXBvbiB0aGUgdmFsdWUgaW4gc3RhdHVzLlxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gVXBkYXRlUmVjb3JkPFQ+XG4gKiBAcHJvcGVydHkge1R9IHZhbHVlIGlzIHdoYXRldmVyIHN0YXRlIHRoZSBzZXJ2aWNlIHdhbnRzIHRvIHB1Ymxpc2hcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBbdXBkYXRlQ291bnRdIGlzIGEgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSB1cGRhdGUuICBGb3JcbiAqIHRoZSBsYXN0IHVwZGF0ZSwgaXQgaXMgYHVuZGVmaW5lZGAuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0Jhc2VOb3RpZmllcjxUPn0gTm90aWZpZXJJbnRlcm5hbHMgV2lsbCBiZSBzaGFyZWQgYmV0d2VlbiBtYWNoaW5lcyxcbiAqIHNvIGl0IG11c3QgYmUgc2FmZSB0byBleHBvc2UuIEJ1dCBvdGhlciBzb2Z0d2FyZSBzaG91bGQgYXZvaWQgZGVwZW5kaW5nIG9uXG4gKiBpdHMgaW50ZXJuYWwgc3RydWN0dXJlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtOb3RpZmllckludGVybmFsczxUPiAmXG4gKiAgIEZvcmthYmxlQXN5bmNJdGVyYWJsZTxULCBUPiAmXG4gKiAgIFNoYXJhYmxlTm90aWZpZXI8VD5cbiAqIH0gTm90aWZpZXI8VD4gYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHN0YXRlIG9yIHVwZGF0ZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaGFyYWJsZU5vdGlmaWVyXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Tm90aWZpZXJJbnRlcm5hbHM8VD4+fSBnZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzXG4gKiBVc2VkIHRvIHJlcGxpY2F0ZSB0aGUgbXVsdGljYXN0IHZhbHVlcyBhdCBvdGhlciBzaXRlcy4gVG8gbWFudWFsbHkgY3JlYXRlIGFcbiAqIGxvY2FsIHJlcHJlc2VudGF0aXZlIG9mIGEgTm90aWZpY2F0aW9uLCBkb1xuICogYGBganNcbiAqIGxvY2FsSXRlcmFibGUgPVxuICogICBtYWtlTm90aWZpZXIoRShyZW1vdGVJdGVyYWJsZSkuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFscygpKTtcbiAqIGBgYFxuICogVGhlIHJlc3VsdGluZyBgbG9jYWxJdGVyYWJsZWAgYWxzbyBzdXBwb3J0cyBzdWNoIHJlbW90ZSB1c2UsIGFuZFxuICogd2lsbCByZXR1cm4gYWNjZXNzIHRvIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vdGlmaWVyUmVjb3JkPFQ+IHRoZSBwcm9kdWNlZCBub3RpZmllci91cGRhdGVyIHBhaXJcbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHVwZGF0ZXIgdGhlIChjbG9zZWx5LWhlbGQpIG5vdGlmaWVyIHByb2R1Y2VyXG4gKiBAcHJvcGVydHkge05vdGlmaWVyPFQ+fSBub3RpZmllciB0aGUgKHdpZGVseS1oZWxkKSBub3RpZmllciBjb25zdW1lclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0l0ZXJhYmxlRWFjaFRvcGljPFQ+ICYgRWFjaFRvcGljPFQ+ICZcbiAqICAgU2hhcmFibGVTdWJzY3JpcHRpb248VD59IFN1YnNjcmlwdGlvbjxUPlxuICogQSBmb3JtIG9mIEFzeW5jSXRlcmFibGUgc3VwcG9ydGluZyBkaXN0cmlidXRlZCBhbmQgbXVsdGljYXN0IHVzYWdlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNoYXJhYmxlU3Vic2NyaXB0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8RWFjaFRvcGljPFQ+Pn0gZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBTdWJzY3JpcHRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VTdWJzY3JpcHRpb24oRShyZW1vdGVJdGVyYWJsZSkuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSk7XG4gKiBgYGBcbiAqIFRoZSByZXN1bHRpbmcgYGxvY2FsSXRlcmFibGVgIGFsc28gc3VwcG9ydHMgc3VjaCByZW1vdGUgdXNlLCBhbmRcbiAqIHdpbGwgcmV0dXJuIGFjY2VzcyB0byB0aGUgc2FtZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdWJzY3JpcHRpb25SZWNvcmQ8VD5cbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHB1YmxpY2F0aW9uXG4gKiBAcHJvcGVydHkge1N1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaXB0aW9uXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHRlbXBsYXRlIFtTbG90PXVua25vd25dIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuTWFyc2hhbDxTbG90Pn0gTWFyc2hhbGxlciAqL1xuLyoqIEB0eXBlZGVmIHtQaWNrPE1hcnNoYWxsZXIsICdmcm9tQ2FwRGF0YSc+fSBVbnNlcmlhbGl6ZXIgKi9cblxuLyoqXG4gKiBEZWZpbmVkIGJ5IHZzdG9yYWdlU3RvcmVLZXkgaW4gdnN0b3JhZ2UuZ29cbiAqXG4gKiBAdHlwZWRlZiBWU3RvcmFnZUtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlU3Via2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YVByZWZpeEJ5dGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vRGF0YVZhbHVlXVxuICovXG5cbi8qKlxuICogVGhpcyByZXByZXNlbnRzIGEgbm9kZSBpbiBhbiBJQVZMIHRyZWUuXG4gKlxuICogVGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB4L3ZzdG9yYWdlLCBhbiBBZ29yaWMgZXh0ZW5zaW9uIG9mIHRoZSBDb3Ntb3MgU0RLLlxuICpcbiAqIFZzdG9yYWdlIGlzIGEgaGllcmFyY2hpY2FsIGV4dGVybmFsbHktcmVhY2hhYmxlIHN0b3JhZ2Ugc3RydWN0dXJlIHRoYXRcbiAqIGlkZW50aWZpZXMgY2hpbGRyZW4gYnkgcmVzdHJpY3RlZCBBU0NJSSBuYW1lIGFuZCBpcyBhc3NvY2lhdGVkIHdpdGggYXJiaXRyYXJ5XG4gKiBzdHJpbmctdmFsdWVkIGRhdGEgZm9yIGVhY2ggbm9kZSwgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JhZ2VOb2RlXG4gKiBAcHJvcGVydHkgeyhkYXRhOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD59IHNldFZhbHVlIHB1Ymxpc2hlcyBzb21lIGRhdGEgKGFwcGVuZCB0byB0aGUgbm9kZSlcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8VlN0b3JhZ2VLZXk+fSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeyhzdWJQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7c2VxdWVuY2U/OiBib29sZWFufSkgPT4gU3RvcmFnZU5vZGV9IG1ha2VDaGlsZE5vZGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZEZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8c3RyaW5nPn0gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHtTdG9yYWdlTm9kZVsnZ2V0U3RvcmVLZXknXX0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoKSA9PiBVbnNlcmlhbGl6ZXJ9IGdldFVuc2VyaWFsaXplciBnZXQgdGhlIHVuc2VyaWFsaXplciBmb3IgdGhlIHN0b3JlZCBkYXRhXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgU3RvcmVkU3Vic2NyaWJlclxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtTdWJzY3JpcHRpb248VD4gJiB7XG4gKiAgIGdldFN0b3JlS2V5OiAoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5ICYgeyBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjxUPiB9PixcbiAqICAgZ2V0VW5zZXJpYWxpemVyOiAoKSA9PiBVbnNlcmlhbGl6ZXIsXG4gKiB9fSBTdG9yZWRTdWJzY3JpcHRpb25cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaWJlcjxUPiAmIFN0b3JlZEZhY2V0fSBTdG9yZWRTdWJzY3JpYmVyXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPmJcNlwBAABcAQAAIAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4xL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABqgKjv3AsAANwLAAAhAAAAQGFnb3JpYy9zdG9yZS12MC45LjEvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyIsIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLCJAZW5kby9leG8iLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtdXSxbXCJAZW5kby9leG9cIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzXCIsIFtdXSxbXCIuL2xlZ2FjeS9sZWdhY3lNYXAuanNcIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiQGVuZG8vcGF0dGVybnMiOltbImlzS2V5IiwiaXNLZXkiXSxbImFzc2VydEtleSIsImFzc2VydEtleSJdLFsiYXNzZXJ0U2NhbGFyS2V5IiwiYXNzZXJ0U2NhbGFyS2V5Il0sWyJtYWtlQ29weVNldCIsIm1ha2VDb3B5U2V0Il0sWyJnZXRDb3B5U2V0S2V5cyIsImdldENvcHlTZXRLZXlzIl0sWyJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnIl0sWyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sWyJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlCYWdFbnRyaWVzIl0sWyJtYWtlQ29weU1hcCIsIm1ha2VDb3B5TWFwIl0sWyJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIl0sWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdLFsiY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIl0sWyJjb21wYXJlS2V5cyIsImNvbXBhcmVLZXlzIl0sWyJrZXlMVCIsImtleUxUIl0sWyJrZXlMVEUiLCJrZXlMVEUiXSxbImtleUVRIiwia2V5RVEiXSxbImtleUdURSIsImtleUdURSJdLFsia2V5R1QiLCJrZXlHVCJdLFsiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldENvbXBhcmUiLCJzZXRDb21wYXJlIl0sWyJzZXRVbmlvbiIsInNldFVuaW9uIl0sWyJzZXREaXNqb2ludFVuaW9uIiwic2V0RGlzam9pbnRVbmlvbiJdLFsic2V0SW50ZXJzZWN0aW9uIiwic2V0SW50ZXJzZWN0aW9uIl0sWyJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRTdWJ0cmFjdCJdLFsiYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il0sWyJNIiwiTSJdLFsiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIl0sWyJpc1BhdHRlcm4iLCJpc1BhdHRlcm4iXSxbImFzc2VydFBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIl0sWyJtYXRjaGVzIiwibWF0Y2hlcyJdLFsibXVzdE1hdGNoIiwibXVzdE1hdGNoIl1dLCJAZW5kby9leG8iOltbImluaXRFbXB0eSIsImluaXRFbXB0eSJdLFsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyJdLFsiZGVmaW5lRXhvQ2xhc3NLaXQiLCJkZWZpbmVFeG9DbGFzc0tpdCJdLFsibWFrZUV4byIsIm1ha2VFeG8iXV0sIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyI6W1sibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXV0sIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiXV0sIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyI6W1sibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiXV0sIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXV0sIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjpbWyJwcm92aWRlTGF6eSIsInByb3ZpZGVMYXp5Il1dLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiOltbIm1ha2VMZWdhY3lNYXAiLCJtYWtlTGVnYWN5TWFwIl1dLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjpbWyJtYWtlTGVnYWN5V2Vha01hcCIsIm1ha2VMZWdhY3lXZWFrTWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADir4B9RgsAAEYLAAAsAAAAQGFnb3JpYy9zdG9yZS12MC45LjEvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMuanMiLCJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcSxGYWlsOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBhbmQgaXRzIGZyYXRlcm5hbCBzaWJsaW5nIGxlZ2FjeVdlYWtNYXAgZXhpc3Qgb25seSB0b1xuICogZWFzZSBhIHRyYW5zaXRpb24gdG8gdGhlIG1vZGVybiBgc3RvcmVgIHN5c3RlbSwgYXJlIGRlcHJlY2F0ZWQsXG4gKiBhbmQgd2lsbCBldmVudHVhbGx5IGRpc2FwcGVhci4gVGhleSBhcmUgbmVlZGVkIGZvciBub3cgdG8gc3VwcG9ydFxuICogc29tZSBvZiB0aGUgdXNlcyBvZiB0aGUgb2xkIGJlaGF2aW9yIHRoYXQgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGhcbiAqIHRoZSBuZXcuIFRoZSBjb25zdHJhaW50IGltcG9zZWQgYnkgdGhlIG5ldyBpcyB0aGF0IG9ubHkgcGFzc2FibGVzIGNhblxuICogYmUgdXNlZCBhcyB2YWx1ZXMsIGFuZCBvbmx5IGtleXMgKHJvdWdobHksIHN0cnVjdHVyZXMsIGFrYSBjb21wYXJhYmxlcylcbiAqIGNhbiBiZSB1c2VkIGFzIHZhbHVlcy5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvMzU2N1xuICogVE9ETyBPbmNlIHRoYXQgUFIgaXMgbWVyZ2VkLCBsaW5rIHRvIHRoZSBkb2N1bWVudHMgcmF0aGVyIHRoYW4gdGhlIFBScy5cbiAqXG4gKiBFYWNoIG9mIHRoZXNlIG5vbi1jb25mb3JtaW5nIHVzZXMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoIGFcbiAqIGBgYGpzXG4gKiAvLyBMZWdhY3kgYmVjYXVzZS4uLlxuICogYGBgXG4gKiBjb21tZW50IGV4cGxhaW5pbmcgdGhlIHByb2JsZW0gaW5oaWJpdGluZyBjb252ZXJzaW9uIHRvIHRoZSBuZXdcbiAqIHN5c3RlbS4gU29tZSBvZiB0aGVzZSBwcm9ibGVtcyBhcyBvZiB0aGlzIHdyaXRpbmc6XG4gKiAgICAqIEEgcHJvbWlzZUtpdCB1c2VkIGFzIGEgdmFsdWUsIGV2ZW4gdGhvdWdoIGEgcHJvbWlzZUtpdCBpcyBub3RcbiAqICAgICAgYSBwYXNzYWJsZS4gU29sdXRpb25zIGFyZSB0byBtYWtlIGl0IGEgcGFzc2FibGUsIG9yIHRvIGNvbnZlcnRcbiAqICAgICAgdGhlIGNvbnRhaW5lciBiYWNrIHRvIGEgY29udmVudGlvbmFsIEphdmFTY3JpcHQgTWFwLlxuICogICAgKiBBIG11dGFibGUgYXJyYXkgdXNlZCBhcyBhIHZhbHVlLCB0aGF0IGlzIHN1YnNlcXVlbnRseSBtdXRhdGVkLlxuICogICAgICBGcmVlemluZyB0aGUgYXJyYXkgd291bGRuJ3Qgd29yayBvZiBjb3Vyc2UgYmVjYXVzZSBpdCB3b3VsZCBicmVha1xuICogICAgICB0aGUgc3Vic2VxdWVudCBtdXRhdGlvbi4gVXNpbmcgYSBmYXIgb2JqZWN0IHdyYXBwaW5nIGFuIGFycmF5IHdvdWxkXG4gKiAgICAgIGxpa2VseSB3b3JrIGZpbmUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhck1hcCBpZiBwb3NzaWJsZSwgTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VMZWdhY3lNYXA9KHRhZz0na2V5Jyk9PntcbmNvbnN0IG09bmV3IE1hcCgpO1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiFtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbm0uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiBtLmhhcyhrZXkpO1xuIH0sXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbm0uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5yZXR1cm4gbS5nZXQoa2V5KTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbm0uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLmRlbGV0ZShrZXkpO1xuIH0sXG5rZXlzOigpPT5tLmtleXMoKSxcbnZhbHVlczooKT0+bS52YWx1ZXMoKSxcbmVudHJpZXM6KCk9Pm0uZW50cmllcygpLFxuZ2V0U2l6ZTooKT0+bS5zaXplLFxuY2xlYXI6KCk9Pm0uY2xlYXIoKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lNYXAobWFrZUxlZ2FjeU1hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeU1hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeU1hcCI6WyJtYWtlTGVnYWN5TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKaDTbTCBgAAwgYAADAAAABAYWdvcmljL3N0b3JlLXYwLjkuMS9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMuanMiLCJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHEsRmFpbDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG4vKipcbiAqIFNlZSBkb2Njb21tZW50IGluIHRoZSBjbG9zZWx5IHJlbGF0ZWQgYGxlZ2FjeU1hcC5qc2AgbW9kdWxlLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJXZWFrTWFwIGlmIHBvc3NpYmxlLCBXZWFrTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lXZWFrTWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTGVnYWN5V2Vha01hcD0odGFnPSdrZXknKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSAqL1xuY29uc3Qgd209bmV3IFdlYWtNYXAoKTtcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hd20uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9Plxud20uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiB3bS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtWfSAqL3dtLmdldChrZXkpKTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xud20uZGVsZXRlKGtleSk7XG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lXZWFrTWFwKG1ha2VMZWdhY3lXZWFrTWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5V2Vha01hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeVdlYWtNYXAiOlsibWFrZUxlZ2FjeVdlYWtNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmgO61xYWAAAWFgAAMQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4xL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLGZpbHRlckl0ZXJhYmxlLG1hcEl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weU1hcCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjigI1fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaOKAjV9hKV1dLFtcIm1hcEl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChtYXBJdGVyYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weU1hcFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlNYXAgPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIi4vc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kc1wiLCBbJGjigI1fYSA9PiAobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsIFskaOKAjV9hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge01hcDxLLFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKX0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ11cbiAqIEByZXR1cm5zIHtNYXBTdG9yZTxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZU1hcFN0b3JlTWV0aG9kcz0oXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxudGFnPSdrZXknKT0+XG57XG5jb25zdHthc3NlcnRVcGRhdGVPbkFkZCxhc3NlcnRVcGRhdGVPbkRlbGV0ZSxpdGVyYWJsZUtleXN9PVxubWFrZUN1cnJlbnRLZXlzS2l0KFxuKCk9PmpzbWFwLmtleXMoKSxcbihrKT0+anNtYXAuaGFzKGspLFxuY29tcGFyZVJhbmssXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlLFxudGFnKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbmNvbnN0IGtleXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGl0ZXJhYmxlS2V5cztcbiB9XG5jb25zdCBmaWx0ZXI9KGspPT57XG5pZihrZXlQYXR0IT09dW5kZWZpbmVkJiYhbWF0Y2hlcyhrLGtleVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vKiBVc2VzIHRoZSBjdXJyZW50IGpzbWFwIHZhbHVlLCBzaW5jZSB0aGUgaXRlcmF0YXRvciBzdXJ2aXZlcyBgLnNldGAqL1xuaWYodmFsdWVQYXR0IT09dW5kZWZpbmVkJiYhbWF0Y2hlcyhqc21hcC5nZXQoayksdmFsdWVQYXR0KSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcbnJldHVybiBmaWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsZmlsdGVyKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Vj59XG4gKi9cbmNvbnN0IHZhbHVlcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT4vKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGspKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHBhcmFtIHtQYXR0ZXJufSBbdmFsdWVQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuY29uc3QgZW50cmllcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT5bXG5rLFxuLyoqIEB0eXBlIHtWfSAqL2pzbWFwLmdldChrKV0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbi8qKiBAdHlwZSB7KGs6IEssIHY6IFYpID0+IHZvaWR9ICovYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbnRhZyksXG5cbmtleXMsXG52YWx1ZXMsXG5lbnRyaWVzLFxuXG5zbmFwc2hvdDooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFrZUNvcHlNYXAoZW50cmllcyhrZXlQYXR0LHZhbHVlUGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQ/XG5qc21hcC5zaXplOlxuWy4uLmtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+e1xuaWYoa2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkKXtcbmpzbWFwLmNsZWFyKCk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSl7XG5qc21hcC5kZWxldGUoa2V5KTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gYWRkaW5nIGEgbmV3IGtleSAoaW5pdCkgYW5kIHVwZGF0aW5nIG9yXG4gKiByZWZlcmVuY2luZyBhIGtleSAoZ2V0LCBzZXQsIGRlbGV0ZSkuXG4gKlxuICogYGluaXRgIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuIGBHZXRgLFxuICogYHNldGAgYW5kIGBkZWxldGVgIGFyZSBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIGFscmVhZHkgZXhpc3QuXG4gKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIG1hcCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlTWFwcyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0aGUgY29sdW1uIG5hbWUgZm9yIHRoZSBrZXlcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtNYXBTdG9yZTxLLFY+fVxuICovJGjigI1fb25jZS5tYWtlTWFwU3RvcmVNZXRob2RzKG1ha2VNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJNYXBTdG9yZT0oXG50YWc9J2tleScsXG57a2V5U2hhcGU9dW5kZWZpbmVkLHZhbHVlU2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNtYXA9bmV3IE1hcCgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S1ZPa1RvU2V0PShfa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4odmFsdWUpO1xuXG5hc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaCh2YWx1ZSx2YWx1ZVNoYXBlLCdtYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5cbmFzc2VydFNjYWxhcktleShrZXkpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnbWFwU3RvcmUga2V5Jyk7XG4gfVxuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBNYXBTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJNYXBTdG9yZShtYWtlU2NhbGFyTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcFN0b3JlTWV0aG9kcyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnQOWIEEPAABBDwAAMQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4xL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5U2V0XCIsIFskaOKAjV9hID0+IChtYWtlQ29weVNldCA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzXCIsIFskaOKAjV9hID0+IChtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtTZXQ8Sz59IGpzc2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRLZXlPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXRTdG9yZU1ldGhvZHM9KFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdHthc3NlcnRVcGRhdGVPbkFkZCxhc3NlcnRVcGRhdGVPbkRlbGV0ZSxpdGVyYWJsZUtleXN9PVxubWFrZUN1cnJlbnRLZXlzS2l0KFxuKCk9Pmpzc2V0LmtleXMoKSxcbihrKT0+anNzZXQuaGFzKGspLFxuY29tcGFyZVJhbmssXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbmtleU5hbWUpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/XG5pdGVyYWJsZUtleXM6XG5maWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsKGspPT5tYXRjaGVzKGssa2V5UGF0dCkpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKFxuanNzZXQsXG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxua2V5TmFtZSksXG5cblxua2V5cyxcblxudmFsdWVzOmtleXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCk9Pm1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZD9qc3NldC5zaXplOlsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQpe1xuanNzZXQuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpe1xuanNzZXQuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVNldFN0b3JlTWV0aG9kcyhtYWtlU2V0U3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2tleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyBTZXQoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S2V5T2tUb0FkZD0oa2V5KT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCdzZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VTZXRTdG9yZU1ldGhvZHMoanNzZXQsYXNzZXJ0S2V5T2tUb0FkZCx1bmRlZmluZWQsdGFnKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJTZXRTdG9yZShtYWtlU2NhbGFyU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVNldFN0b3JlTWV0aG9kcyI6WyJtYWtlU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGUFp2OMSAADjEgAANQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4xL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4vc3RvcmUtdXRpbHMuanMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLHBhc3NTdHlsZU9mLGdldENvcHlNYXBFbnRyaWVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weU1hcDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldENvcHlNYXBFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wiaXNDb3B5TWFwXCIsIFskaOKAjV9hID0+IChpc0NvcHlNYXAgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPn0ganNtYXBcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb0FkZFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvU2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzPShcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIWpzbWFwLmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcblxuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbmpzbWFwLmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4ganNtYXAuaGFzKGtleSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4vKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoa2V5KSk7XG4gfSxcblxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG5hc3NlcnRLVk9rVG9BZGQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH0sXG5zZXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmlmKGFzc2VydEtleU9rVG9EZWxldGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuIH1cbmpzbWFwLmRlbGV0ZShrZXkpO1xuIH0sXG5cbmFkZEFsbDooZW50cmllcyk9PntcbmlmKGlzQ29weU1hcChlbnRyaWVzKSl7XG5lbnRyaWVzPWdldENvcHlNYXBFbnRyaWVzKGVudHJpZXMpO1xuIH1cbmZvcihjb25zdFtrZXksdmFsdWVdb2YvKiogQHR5cGUge0l0ZXJhYmxlPFtLLCBWXT59ICovZW50cmllcyl7XG4vKiBEb24ndCBhc3NlcnQgdGhhdCB0aGUga2V5IGVpdGhlciBkb2VzIG9yIGRvZXMgbm90IGV4aXN0LiovXG5hc3NlcnRLVk9rVG9BZGQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBtYXBTdG9yZSBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXM6XG4gKiBwcmltaXRpdmVzIG9yIHJlbW90YWJsZXMuXG4gKiBPdGhlciBtYXBTdG9yZXMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIFRPRE8gRm9yIG5vdywgdGhpcyBzY2FsYXJXZWFrTWFwIGFjY2VwdHMgb25seSByZW1vdGFibGVzLCByZWZsZWN0aW5nIHRoZVxuICogY29uc3RyYWludHMgb2YgdGhlIHVuZGVybHlpbmcgSmF2YVNjcmlwdCBXZWFrTWFwIGl0IHVzZXMgaW50ZXJuYWxseS4gQnV0XG4gKiBpdCBzaG91bGQgYWNjZXB0IHRoZSBwcmltaXRpdmVzIGFzIHdlbGwsIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGludGVybmFsXG4gKiBtYXAuIFdoYXQgbWFrZXMgaXQgXCJ3ZWFrXCIgaXMgdGhhdCBpdCBwcm92aWRlcyBubyBBUEkgZm9yIGVudW1lcmF0aW5nIHdoYXQnc1xuICogdGhlcmUuIFRob3VnaCBub3RlIHRoYXQgdGhpcyB3b3VsZCBvbmx5IGVuYWJsZXMgY29sbGVjdGlvbiBvZiB0aGVcbiAqIHJlbW90YWJsZXMsIHNpbmNlIHRoZSBvdGhlciBwcmltaXRpdmVzIG1heSBhbHdheXMgcmVhcHBlYXIuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrTWFwU3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZCx2YWx1ZVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzbWFwPW5ldyhsb25nTGl2ZWQ/V2Vha01hcDpNYXApKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKHZhbHVlLHZhbHVlU2hhcGUsJ3dlYWtNYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrTWFwU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnd2Vha01hcFN0b3JlIGtleScpO1xuIH1cbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgV2Vha01hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUobWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG2sP72EDgAAhA4AADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMS9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixwYXNzU3R5bGVPZixnZXRDb3B5U2V0S2V5cyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlTZXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJpc0NvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKGlzQ29weVNldCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7V2Vha1NldDxLICYgb2JqZWN0Pn0ganNzZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IGFzc2VydEtleU9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzPShcbmpzc2V0LFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbmpzc2V0LmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgc2V0LiovXG5yZXR1cm4ganNzZXQuaGFzKGtleSk7XG4gfSxcblxuYWRkOihrZXkpPT57XG5hc3NlcnRLZXlPa1RvQWRkKGtleSk7XG5qc3NldC5hZGQoa2V5KTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmlmKGFzc2VydEtleU9rVG9EZWxldGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuIH1cbmpzc2V0LmRlbGV0ZShrZXkpO1xuIH0sXG5cbmFkZEFsbDooa2V5cyk9PntcbmlmKGlzQ29weVNldChrZXlzKSl7XG5rZXlzPWdldENvcHlTZXRLZXlzKGtleXMpO1xuIH1cbmZvcihjb25zdCBrZXkgb2YvKiogQHR5cGUge0l0ZXJhYmxlPEs+fSAqL2tleXMpe1xuYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuanNzZXQuYWRkKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIHNldCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlU2V0cyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIFRPRE8gRm9yIG5vdywgdGhpcyBzY2FsYXJXZWFrU2V0IGFjY2VwdHMgb25seSByZW1vdGFibGVzLCByZWZsZWN0aW5nIHRoZVxuICogY29uc3RyYWludHMgb2YgdGhlIHVuZGVybHlpbmcgSmF2YVNjcmlwdCBXZWFrU2V0IGl0IHVzZXMgaW50ZXJuYWxseS4gQnV0XG4gKiBpdCBzaG91bGQgYWNjZXB0IHRoZSBwcmltaXRpdmVzIGFzIHdlbGwsIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGludGVybmFsXG4gKiBzZXQuIFdoYXQgbWFrZXMgaXQgXCJ3ZWFrXCIgaXMgdGhhdCBpdCBwcm92aWRlcyBubyBBUEkgZm9yIGVudW1lcmF0aW5nIHdoYXQnc1xuICogdGhlcmUuIFRob3VnaCBub3RlIHRoYXQgdGhpcyB3b3VsZCBvbmx5IGVuYWJsZXMgY29sbGVjdGlvbiBvZiB0aGVcbiAqIHJlbW90YWJsZXMsIHNpbmNlIHRoZSBvdGhlciBwcmltaXRpdmVzIG1heSBhbHdheXMgYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyhsb25nTGl2ZWQ/V2Vha1NldDpTZXQpKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtleU9rVG9BZGQ9KGtleSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnd2Vha1NldFN0b3JlIGtleScpO1xuIH1cbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFdlYWtTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKGpzc2V0LGFzc2VydEtleU9rVG9BZGQsdW5kZWZpbmVkLHRhZyl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACy12MInRkAAJ0ZAAAuAAAAQGFnb3JpYy9zdG9yZS12MC45LjEvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJhcHBlbmRUb1N0b3JlZEFycmF5IiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUN1cnJlbnRLZXlzS2l0IiwicHJvdmlkZUxhenkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLE0sbWF0Y2hlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIFNob3VsZCBiZWhhdmUgaWRlbnRpY2FsbHkgdG8gdGhlIG9uZSBpbiBgQGVuZG8vcGF0dGVybnNgLCBidXRcbiAqIHJlaW1wbGVtZW50ZWQgZm9yIG5vdyBiZWNhdXNlIGBAZW5kby9wYXR0ZXJuc2AgZm9yZ290IHRvIGV4cG9ydCB0aGlzIG9uZS5cbiAqIFRoaXMgb25lIGlzIHNpbXBsZSBlbm91Z2ggdGhhdCBJIHByZWZlciBhIHJlaW1wbGVtZW50YXRpb24gdG8gYSBkZWVwIGltcG9ydC5cbiAqIFRPRE86IFVuZGF0ZSBgQGVuZG8vcGF0dGVybnNgIHRvIGV4cG9ydCB0aGUgb3JpZ2luYWwsIGFuZCBkZWxldGUgdGhlXG4gKiByZWltcGxlbWVudGF0aW9uIGhlcmUuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHJldHVybnMge3MgaXMgQ29weVNldH1cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weVNldD0ocyk9Pm1hdGNoZXMocyxNLnNldCgpKTtcblxuLyoqXG4gKiBTaG91bGQgYmVoYXZlIGlkZW50aWNhbGx5IHRvIHRoZSBvbmUgaW4gYEBlbmRvL3BhdHRlcm5zYCwgYnV0XG4gKiByZWltcGxlbWVudGVkIGZvciBub3cgYmVjYXVzZSBgQGVuZG8vcGF0dGVybnNgIGZvcmdvdCB0byBleHBvcnQgdGhpcyBvbmUuXG4gKiBUaGlzIG9uZSBpcyBzaW1wbGUgZW5vdWdoIHRoYXQgSSBwcmVmZXIgYSByZWltcGxlbWVudGF0aW9uIHRvIGEgZGVlcCBpbXBvcnQuXG4gKiBUT0RPOiBVbmRhdGUgYEBlbmRvL3BhdHRlcm5zYCB0byBleHBvcnQgdGhlIG9yaWdpbmFsLCBhbmQgZGVsZXRlIHRoZVxuICogcmVpbXBsZW1lbnRhdGlvbiBoZXJlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHttIGlzIENvcHlNYXB9XG4gKi8kaOKAjV9vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuY29uc3QgICAgICAgIGlzQ29weU1hcD0obSk9Pm1hdGNoZXMobSxNLm1hcCgpKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDdXJyZW50S2V5c0tpdFxuICogQHByb3BlcnR5IHsoazogSywgdj86IFYpID0+IHZvaWR9IGFzc2VydFVwZGF0ZU9uQWRkXG4gKiBAcHJvcGVydHkgeyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkRlbGV0ZVxuICogQHByb3BlcnR5IHtJdGVyYWJsZTxLPn0gaXRlcmFibGVLZXlzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0geygpID0+IEl0ZXJhYmxlPEs+fSBnZXRSYXdLZXlzXG4gKiBAcGFyYW0geyhrOiBLKSA9PiBib29sZWFufSBjaGVja0hhc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHsoazogSywgdj86IFYpID0+IHZvaWR9IGFzc2VydE9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge0N1cnJlbnRLZXlzS2l0PEssVj59XG4gKi8kaOKAjV9vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuY29uc3QgICAgICAgIG1ha2VDdXJyZW50S2V5c0tpdD0oXG5nZXRSYXdLZXlzLFxuY2hlY2tIYXMsXG5jb21wYXJlLFxuYXNzZXJ0T2tUb0FkZCxcbmFzc2VydE9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xubGV0IHVwZGF0ZUNvdW50PTA7XG5sZXQgc29ydGVkS2V5c01lbW87XG5cbmNvbnN0IGFzc2VydFVwZGF0ZU9uQWRkPShrLHY9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0T2tUb0FkZChrLHYpO1xudXBkYXRlQ291bnQrPTE7XG5zb3J0ZWRLZXlzTWVtbz11bmRlZmluZWQ7XG4gfTtcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25EZWxldGU9KGspPT5hc3NlcnRPa1RvRGVsZXRlJiZhc3NlcnRPa1RvRGVsZXRlKGspO1xuXG5jb25zdCBnZXRTb3J0ZWRLZXlzPSgpPT57XG5pZihzb3J0ZWRLZXlzTWVtbz09PXVuZGVmaW5lZCl7XG5zb3J0ZWRLZXlzTWVtbz1oYXJkZW4oWy4uLmdldFJhd0tleXMoKV0uc29ydChjb21wYXJlKSk7XG4gfVxucmV0dXJuIHNvcnRlZEtleXNNZW1vO1xuIH07XG5cbmNvbnN0IGl0ZXJhYmxlS2V5cz1GYXIoJ0l0ZXJhYmxlIG9mIGtleXMnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBnZW5lcmF0aW9uPXVwZGF0ZUNvdW50O1xuZ2V0U29ydGVkS2V5cygpO1xuY29uc3QgbGVuPXNvcnRlZEtleXNNZW1vLmxlbmd0aDtcbmxldCBpPTA7XG5yZXR1cm4gRmFyKCdJdGVyYXRvciBvZiBrZXlzJyx7XG5uZXh0OigpPT57XG5nZW5lcmF0aW9uPT09dXBkYXRlQ291bnR8fEZhaWwgYFN0b3JlICR7cShrZXlOYW1lKX0gY3Vyc29yIHN0YWxlYDtcbi8qIElmIHRoZXkncmUgZXF1YWwsIHRoZW4gdGhlIHNvcnRlZEtleU1lbW8gaXMgdGhlIHNhbWUgb25lKi9cbi8qIHdlIHN0YXJ0ZWQgd2l0aC4qL1xuZm9yKDs7KXtcbmlmKGk8bGVuKXtcbmNvbnN0IHZhbHVlPXNvcnRlZEtleXNNZW1vW2ldO1xuaSs9MTtcbmlmKGNoZWNrSGFzKHZhbHVlKSl7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfVxuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbml0ZXJhYmxlS2V5c30pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VDdXJyZW50S2V5c0tpdChtYWtlQ3VycmVudEtleXNLaXQpO1xuaGFyZGVuKG1ha2VDdXJyZW50S2V5c0tpdCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUxhenlgIHRvIGdldCBvciBtYWtlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS5cbiAqIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yXG4gKiB0aGF0IGtleSwgYW5kIHJldHVybiBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxLLFY+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVMYXp5PShtYXBTdG9yZSxrZXksbWFrZVZhbHVlKT0+e1xuaWYoIW1hcFN0b3JlLmhhcyhrZXkpKXtcbm1hcFN0b3JlLmluaXQoa2V5LG1ha2VWYWx1ZShrZXkpKTtcbiB9XG5yZXR1cm4gbWFwU3RvcmUuZ2V0KGtleSk7XG4gfTskaOKAjV9vbmNlLnByb3ZpZGVMYXp5KHByb3ZpZGVMYXp5KTtcbmhhcmRlbihwcm92aWRlTGF6eSk7XG5cbi8qKlxuICogSGVscGVyIGZvciB1c2UgY2FzZXMgaW4gd2hpY2ggdGhlIG1ha2VyIGZ1bmN0aW9uIGlzIGFzeW5jLlxuICogRm9yIHR3byBwcm92aWRlTGF6eSBjYWxscyB3aXRoIHRoZSBzYW1lIGtleSwgb25lIG1heSBiZSBtYWtpbmcgd2hlbiB0aGVcbiAqIG90aGVyIGNhbGwgc3RhcnRzIGFuZCBpdCB3b3VsZCBtYWtlIGFnYWluLlxuICogKFRoZW4gdGhlcmUnZCBiZSBhIGNvbGxpc2lvbiB3aGVuIHRoZSBzZWNvbmQgdHJpZXMgdG8gc3RvcmVcbiAqIHRoZSBrZXkuKSBUaGlzIHByZXZlbnRzIHRoYXQgcmFjZSBjb25kaXRpb24gYnkgaW1tZWRpYXRlbHkgc3RvcmluZyBhIFByb21pc2VcbiAqIGZvciB0aGUgbWFrZXIgaW4gYW4gZXBoZW1lcmFsIHN0b3JlLlxuICpcbiAqIFdoZW4gdGhlIGBzdG9yZWAgYXJndW1lbnQgaXMgZHVyYWJsZSBzdG9yYWdlLCBub3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3JcbiAqIHRlcm1pbmF0aW9uIHRvIGhhcHBlbiBhZnRlciB0aGUgbWFrZSBjb21wbGV0ZXMgYW5kIGJlZm9yZSBpdCByZWFjaGVzIGR1cmFibGVcbiAqIHN0b3JhZ2UuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxLLCBWPn0gc3RvcmVcbiAqL1xuY29uc3QgICAgICAgIG1ha2VBdG9taWNQcm92aWRlcj0oc3RvcmUpPT57XG4vKiogQHR5cGUge01hcDxLLCBQcm9taXNlPFY+Pn0gKi9cbmNvbnN0IHBlbmRpbmc9bmV3IE1hcCgpO1xuXG4vKipcbiAqIENhbGwgYHByb3ZpZGVBc3luY2AgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LFxuICogd2hlbiB0aGUgbWFrZXIgaXMgYXN5bmNocm9ub3VzLlxuICogSWYgdGhlcmUgYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsXG4gKiBjYWxsIGBtYWtlVmFsdWUoa2V5KWAsIHJlbWVtYmVyIGl0IGFzIHRoZSB2YWx1ZSBmb3JcbiAqIHRoYXQga2V5LCBhbmQgcmV0dXJuIGl0LlxuICpcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFByb21pc2U8Vj59IG1ha2VWYWx1ZSBtYWtlIHRoZSB2YWx1ZSBmb3IgdGhlIHN0b3JlXG4gKiBpZiBpdCBoYXNuJ3QgYmVlbiBtYWRlIHlldCBvciB0aGUgbGFzdCBtYWtlIGZhaWxlZFxuICogQHBhcmFtIHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gUHJvbWlzZTx2b2lkPn0gW2ZpbmlzaFZhbHVlXSBydW5zIGV4YWN0bHlcbiAqIG9uY2UgYWZ0ZXIgYSBuZXcgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIHN0b3JlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxWPn1cbiAqL1xuY29uc3QgcHJvdmlkZUFzeW5jPShrZXksbWFrZVZhbHVlLGZpbmlzaFZhbHVlKT0+e1xuaWYoc3RvcmUuaGFzKGtleSkpe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShzdG9yZS5nZXQoa2V5KSk7XG4gfVxuaWYoIXBlbmRpbmcuaGFzKGtleSkpe1xuY29uc3QgdmFsUD1tYWtlVmFsdWUoa2V5KS5cbnRoZW4oKHYpPT57XG5zdG9yZS5pbml0KGtleSx2KTtcbnJldHVybiB2O1xuIH0pLlxudGhlbigodik9PntcbmlmKGZpbmlzaFZhbHVlKXtcbnJldHVybiBmaW5pc2hWYWx1ZShrZXksdikudGhlbigoKT0+dik7XG4gfVxucmV0dXJuIHY7XG4gfSkuXG5maW5hbGx5KCgpPT57XG5wZW5kaW5nLmRlbGV0ZShrZXkpO1xuIH0pO1xucGVuZGluZy5zZXQoa2V5LHZhbFApO1xuIH1cbmNvbnN0IHZhbFA9cGVuZGluZy5nZXQoa2V5KTtcbmFzc2VydCh2YWxQKTtcbnJldHVybiB2YWxQO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe3Byb3ZpZGVBc3luY30pO1xuIH07JGjigI1fb25jZS5tYWtlQXRvbWljUHJvdmlkZXIobWFrZUF0b21pY1Byb3ZpZGVyKTtcbmhhcmRlbihtYWtlQXRvbWljUHJvdmlkZXIpO1xuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXRvbWljUHJvdmlkZXI8SywgVj4+fSBBdG9taWNQcm92aWRlcjxLLCBWPlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssIFZcbiAqIEBwYXJhbSB7TWFwU3RvcmU8SywgVltdPn0gbWFwU3RvcmVcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0ge1Z9IGl0ZW1cbiAqL1xuY29uc3QgICAgICAgIGFwcGVuZFRvU3RvcmVkQXJyYXk9KG1hcFN0b3JlLGtleSxpdGVtKT0+e1xuaWYobWFwU3RvcmUuaGFzKGtleSkpe1xuY29uc3QgZXh0YW50PW1hcFN0b3JlLmdldChrZXkpO1xubWFwU3RvcmUuc2V0KGtleSxoYXJkZW4oWy4uLmV4dGFudCxpdGVtXSkpO1xuIH1lbHNle1xubWFwU3RvcmUuaW5pdChrZXksaGFyZGVuKFtpdGVtXSkpO1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwZW5kVG9TdG9yZWRBcnJheShhcHBlbmRUb1N0b3JlZEFycmF5KTtcbmhhcmRlbihhcHBlbmRUb1N0b3JlZEFycmF5KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0Il0sImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiXSwibWFrZUN1cnJlbnRLZXlzS2l0IjpbIm1ha2VDdXJyZW50S2V5c0tpdCJdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSJdLCJtYWtlQXRvbWljUHJvdmlkZXIiOlsibWFrZUF0b21pY1Byb3ZpZGVyIl0sImFwcGVuZFRvU3RvcmVkQXJyYXkiOlsiYXBwZW5kVG9TdG9yZWRBcnJheSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADFAKyCWCoAAFgqAAAhAAAAQGFnb3JpYy9zdG9yZS12MC45LjEvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVRhZ2dlZH0gQ29weVRhZ2dlZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXkgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlcicpLlJhbmtDb21wYXJpc29ufSBSYW5rQ29tcGFyaXNvbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG4vKiBQbGFjZWhvbGRlciByZWR1bmRhbnQgdHlwZXMsIHRvIGJlIGltcG9ydGVkIGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkLiovXG5cbi8qKlxuICogQHR5cGVkZWYge1Bhc3NhYmxlfSBLZXlcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1Bhc3NhYmxlfSBQYXR0ZXJuXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5U2V0JyxcbiAqICAgcGF5bG9hZDogQXJyYXk8Sz4sXG4gKiB9fSBDb3B5U2V0XG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5QmFnJyxcbiAqICAgcGF5bG9hZDogQXJyYXk8W0ssIGJpZ2ludF0+LFxuICogfX0gQ29weUJhZ1xuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XVxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gW1Y9UGFzc2FibGVdXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5TWFwJyxcbiAqICAgcGF5bG9hZDogeyBrZXlzOiBBcnJheTxLPiwgdmFsdWVzOiBBcnJheTxWPiB9LFxuICogfX0gQ29weU1hcFxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHdWFyZE1ha2Vyc1xuICogQHByb3BlcnR5IHs8TSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+KGludGVyZmFjZU5hbWU6IHN0cmluZyxcbiAqICAgICAgICAgICAgIG1ldGhvZEd1YXJkczogTSxcbiAqICAgICAgICAgICAgIG9wdGlvbnM/OiB7c2xvcHB5PzogYm9vbGVhbn1cbiAqICkgPT4gSW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZVxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKlxuICogQHByb3BlcnR5IHsoLi4uYXJnR3VhcmRzOiBBcmdHdWFyZFtdKSA9PiBNZXRob2RHdWFyZE1ha2VyfSBjYWxsIEd1YXJkIGEgc3luY2hyb25vdXMgY2FsbFxuICpcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ0d1YXJkczogQXJnR3VhcmRbXSkgPT4gTWV0aG9kR3VhcmRNYWtlcn0gY2FsbFdoZW4gR3VhcmQgYW4gYXN5bmMgY2FsbFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFyZ0d1YXJkOiBBcmdHdWFyZCkgPT4gQXJnR3VhcmR9IGF3YWl0IEd1YXJkIGFuIGF3YWl0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IE1ldGhvZFxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICoga2xhc3M6ICdJbnRlcmZhY2UnLFxuICogaW50ZXJmYWNlTmFtZTogc3RyaW5nLFxuICogbWV0aG9kR3VhcmRzOiBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBNZXRob2RHdWFyZD5cbiAqIHNsb3BweT86IGJvb2xlYW5cbiAqIH19IEludGVyZmFjZUd1YXJkXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHthbnl9IE1ldGhvZEd1YXJkTWFrZXJcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sga2xhc3M6ICdtZXRob2RHdWFyZCcsIGNhbGxLaW5kOiAnc3luYycgfCAnYXN5bmMnLCByZXR1cm5HdWFyZDogdW5rbm93biB9fSBNZXRob2RHdWFyZFxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7YW55fSBBcmdHdWFyZFxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlT3B0aW9uc1xuICogT2YgdGhlIGRpbWVuc2lvbnMgb24gd2hpY2ggS2V5ZWRTdG9yZXMgY2FuIGRpZmZlciwgd2Ugb25seSByZXByZXNlbnQgYSBmZXdcbiAqIG9mIHRoZW0gYXMgc3RhbmRhcmQgb3B0aW9ucy4gQSBnaXZlbiBzdG9yZSBtYWtlciBzaG91bGQgZG9jdW1lbnQgd2hpY2hcbiAqIG9wdGlvbnMgaXQgc3VwcG9ydHMsIGFzIHdlbGwgYXMgaXRzIHBvc2l0aW9ucyBvbiBkaW1lbnNpb25zIGZvciB3aGljaCBpdFxuICogZG9lcyBub3Qgc3VwcG9ydCBvcHRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbG9uZ0xpdmVkPXRydWVdIFdoaWNoIHdheSB0byBvcHRpbWl6ZSBhIHdlYWsgc3RvcmUuIFRydWUgbWVhbnNcbiAqIHRoYXQgd2UgZXhwZWN0IHRoaXMgd2VhayBzdG9yZSB0byBvdXRsaXZlIG1vc3Qgb2YgaXRzIGtleXMsIGluIHdoaWNoXG4gKiBjYXNlIHdlIGludGVybmFsbHkgbWF5IHVzZSBhIEphdmFTY3JpcHQgYFdlYWtNYXBgLiBPdGhlcndpc2Ugd2UgaW50ZXJuYWxseVxuICogbWF5IHVzZSBhIEphdmFTY3JpcHQgYE1hcGAuXG4gKiBEZWZhdWx0cyB0byB0cnVlLCBzbyBwbGVhc2UgbWFyayBzaG9ydCBsaXZlZCBzdG9yZXMgZXhwbGljaXRseS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2R1cmFibGU9ZmFsc2VdICBUaGUgY29udGVudHMgb2YgdGhpcyBzdG9yZSBzdXJ2aXZlIHRlcm1pbmF0aW9uXG4gKiAgIG9mIGl0cyBjb250YWluaW5nIHByb2Nlc3MsIGFsbG93aW5nIGZvciByZXN0YXJ0IG9yIHVwZ3JhZGUgYnV0IGF0IHRoZSBjb3N0XG4gKiAgIG9mIGZvcmJpZGRpbmcgc3RvcmFnZSBvZiByZWZlcmVuY2VzIHRvIGVwaGVtZXJhbCBkYXRhLiAgRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWtlRHVyYWJsZT1mYWxzZV0gIFRoaXMgc3RvcmUgcHJldGVuZHMgdG8gYmUgYSBkdXJhYmxlIHN0b3JlXG4gKiAgIGJ1dCBkb2VzIG5vdCBlbmZvcmNlIHRoYXQgdGhlIHRoaW5ncyBzdG9yZWQgaW4gaXQgYWN0dWFsbHkgYmUgdGhlbXNlbHZlc1xuICogICBkdXJhYmxlICh3aGVyZWFzIGFuIGFjdHVhbCBkdXJhYmxlIHN0b3JlIHdvdWxkIGZvcmJpZCBzdG9yYWdlIG9mIHN1Y2hcbiAqICAgaXRlbXMpLiAgVGhpcyBpcyBpbiBzZXJ2aWNlIG9mIGFsbG93aW5nIGluY3JlbWVudGFsIHRyYW5zaXRpb24gdG8gdXNlIG9mXG4gKiAgIGR1cmFibGUgc3RvcmVzLCB0byBlbmFibGUgbm9ybWFsIG9wZXJhdGlvbiBhbmQgdGVzdGluZyB3aGVuIHNvbWUgc3R1ZmZcbiAqICAgaW50ZW5kZWQgdG8gZXZlbnR1YWxseSBiZSBkdXJhYmxlIGhhcyBub3QgeWV0IGJlZW4gbWFkZSBkdXJhYmxlLiAgQSBzdG9yZVxuICogICBtYXJrZWQgYXMgZmFrZUR1cmFibGUgd2lsbCBhcHBlYXIgdG8gb3BlcmF0ZSBub3JtYWxseSBidXQgYW55IGF0dGVtcHQgdG9cbiAqICAgdXBncmFkZSBpdHMgY29udGFpbmluZyB2YXQgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IuXG4gKiBAcHJvcGVydHkge1BhdHRlcm59IFtrZXlTaGFwZV1cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybn0gW3ZhbHVlU2hhcGVdXG4gKi9cblxuLyoqXG4gKiBNb3N0IHN0b3JlIG1ldGhvZHMgYXJlIGluIG9uZSBvZiB0aHJlZSBjYXRlZ29yaWVzXG4gKiAgICogbG9va3VwIG1ldGhvZHMgKGBoYXNgLGBnZXRgKVxuICogICAqIHVwZGF0ZSBtZXRob2RzIChgYWRkYCxgaW5pdGAsYHNldGAsYGRlbGV0ZWAsYGFkZEFsbGApXG4gKiAgICogcXVlcnkgbWV0aG9kcyAoYHNuYXBzaG90YCxga2V5c2AsYHZhbHVlc2AsYGVudHJpZXNgLGBnZXRTaXplYClcbiAqICAgKiBxdWVyeS11cGRhdGUgbWV0aG9kcyAoYGNsZWFyYClcbiAqXG4gKiBXZWFrU3RvcmVzIGhhdmUgdGhlIGxvb2t1cCBhbmQgdXBkYXRlIG1ldGhvZHMgYnV0IG5vdCB0aGUgcXVlcnlcbiAqIG9yIHF1ZXJ5LXVwZGF0ZSBtZXRob2RzLlxuICogTm9uLXdlYWsgU3RvcmVzIGFyZSBsaWtlIHRoZWlyIGNvcnJlc3BvbmRpbmcgV2Vha1N0b3JlcywgYnV0IHdpdGggdGhlXG4gKiBhZGRpdGlvbmFsIHF1ZXJ5IGFuZCBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5ICYgb2JqZWN0fSBbSz1LZXldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXZWFrU2V0U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gYWRkXG4gKiBBZGQgdGhlIGtleSB0byB0aGUgc2V0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiBEbyBub3RoaW5nIHNpbGVudGx5IGlmXG4gKiBhbHJlYWR5IHRoZXJlLlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5czogQ29weVNldDxLPiB8IEl0ZXJhYmxlPEs+KSA9PiB2b2lkfSBhZGRBbGxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXRTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBhZGRcbiAqIEFkZCB0aGUga2V5IHRvIHRoZSBzZXQgaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmUuIERvIG5vdGhpbmcgc2lsZW50bHkgaWZcbiAqIGFscmVhZHkgdGhlcmUuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXlzOiBDb3B5U2V0PEs+IHwgSXRlcmFibGU8Sz4pID0+IHZvaWR9IGFkZEFsbFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IENvcHlTZXQ8Sz59IHNuYXBzaG90XG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gdm9pZH0gY2xlYXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5ICYgb2JqZWN0fSBbSz1LZXldXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVj1QYXNzYWJsZV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYWtNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IENvcHlNYXA8SyxWPiB8IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XVxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gW1Y9UGFzc2FibGVdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIG1hcFxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IENvcHlNYXA8SyxWPiB8IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxWPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeyhcbiAqICAga2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgIHZhbHVlUGF0dD86IFBhdHRlcm5cbiAqICkgPT4gSXRlcmFibGU8W0ssVl0+fSBlbnRyaWVzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gQ29weU1hcDxLLFY+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBEZXByZWNhdGVkIExlZ2FjeSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExlZ2FjeVdlYWtNYXBcbiAqIExlZ2FjeVdlYWtNYXAgaXMgZGVwcmVjYXRlZC4gVXNlIFdlYWtNYXBTdG9yZSBpbnN0ZWFkIGlmIHBvc3NpYmxlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExlZ2FjeU1hcFxuICogTGVnYWN5TWFwIGlzIGRlcHJlY2F0ZWQuIFVzZSBNYXBTdG9yZSBpbnN0ZWFkIGlmIHBvc3NpYmxlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Vj59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxbSyxWXT59IGVudHJpZXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsZWFyXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAIZgh2L8BAAC/AQAAHAAAAEBhZ29yaWMvdGltZS12MC4zLjEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvdGltZU1hdGguanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdGltZU1hdGguanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdGltZU1hdGguanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMBAN+aoIgAAqCIAACMAAABAYWdvcmljL3RpbWUtdjAuMy4xL3NyYy90aW1lTWF0aC5qc3siaW1wb3J0cyI6WyIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiVGltZU1hdGgiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbXVzdE1hdGNoLE5hdCxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxUaW1lc3RhbXBSZWNvcmRTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJUaW1lc3RhbXBSZWNvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoVGltZXN0YW1wUmVjb3JkU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVyQnJhbmR9IFRpbWVyQnJhbmRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuVGltZXN0YW1wfSBUaW1lc3RhbXBcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuUmVsYXRpdmVUaW1lfSBSZWxhdGl2ZVRpbWVcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuUmVsYXRpdmVUaW1lVmFsdWV9IFJlbGF0aXZlVGltZVZhbHVlXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVzdGFtcFZhbHVlfSBUaW1lc3RhbXBWYWx1ZVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5UaW1lTWF0aFR5cGV9IFRpbWVNYXRoVHlwZVxuICpcbiAqL1xuXG4vKipcbiAqIGBhZ3JlZWRUaW1lckJyYW5kYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAcGFyYW0ge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9IGxlZnRCcmFuZFxuICogQHBhcmFtIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfSByaWdodEJyYW5kXG4gKiBAcmV0dXJucyB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgYWdyZWVkVGltZXJCcmFuZD0obGVmdEJyYW5kLHJpZ2h0QnJhbmQpPT57XG5pZihsZWZ0QnJhbmQ9PT11bmRlZmluZWQpe1xuaWYocmlnaHRCcmFuZD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1lbHNle1xucmV0dXJuIHJpZ2h0QnJhbmQ7XG4gfVxuIH1lbHNlIGlmKHJpZ2h0QnJhbmQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGxlZnRCcmFuZDtcbiB9ZWxzZXtcbmxlZnRCcmFuZD09PXJpZ2h0QnJhbmR8fFxuRmFpbCBgVGltZXJCcmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnRCcmFuZCl9IHZzICR7cShyaWdodEJyYW5kKX1gO1xucmV0dXJuIGxlZnRCcmFuZDtcbiB9XG4gfTtcblxuLyoqXG4gKiBgc2hhcmVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCBpbXBsZW1lbnRzIHRoZVxuICogdHJhbnNpdGlvbmFsIGJyYW5kIGNoZWNraW5nIGFuZCBjb250YWlnaW9uIGxvZ2ljIGV4cGxhaW5lZCBpbiB0aGUgYFRpbWVNYXRoYFxuICogY29tbWVudC4gSXQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGJpbmFyeSBvcGVyYXRvcnMgdGhhdCBzaG91bGQgZm9sbG93XG4gKiB0aGlzIGxvZ2ljLiBJdCBkb2VzIHRoZSBlcnJvciBjaGVja2luZyBiZXR3ZWVuIHRoZSBvcGVyYW5kcywgYW5kIHJldHVybnNcbiAqIHRoZSBicmFuZCwgaWYgYW55LCB0aGF0IHNob3VsZCBsYWJlbCB0aGUgcmVzdWx0aW5nIHRpbWUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IHNoYXJlZFRpbWVyQnJhbmQ9KGxlZnQscmlnaHQpPT57XG5jb25zdCBsZWZ0QnJhbmQ9dHlwZW9mIGxlZnQ9PT0nYmlnaW50Jz91bmRlZmluZWQ6bGVmdC50aW1lckJyYW5kO1xuY29uc3QgcmlnaHRCcmFuZD10eXBlb2YgcmlnaHQ9PT0nYmlnaW50Jz91bmRlZmluZWQ6cmlnaHQudGltZXJCcmFuZDtcbnJldHVybiBhZ3JlZWRUaW1lckJyYW5kKGxlZnRCcmFuZCxyaWdodEJyYW5kKTtcbiB9O1xuXG4vKipcbiAqIGBhYnNMaWtlYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnlcbiAqIG9wZXJhdG9ycyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgYSBgVGltZXN0YW1wYFxuICogcmF0aGVyIHRoYW4gYSBgUmVsYXRpdmVUaW1lYC5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcFZhbHVlfSBhYnNWYWx1ZVxuICogQHJldHVybnMge1RpbWVzdGFtcH1cbiAqL1xuY29uc3QgYWJzTGlrZT0obGVmdCxyaWdodCxhYnNWYWx1ZSk9Pntcbk5hdChhYnNWYWx1ZSk7XG5jb25zdCB0aW1lckJyYW5kPXNoYXJlZFRpbWVyQnJhbmQobGVmdCxyaWdodCk7XG5pZih0aW1lckJyYW5kKXtcbnJldHVybiBoYXJkZW4oe1xudGltZXJCcmFuZCxcbmFic1ZhbHVlfSk7XG5cbiB9ZWxzZXtcbnJldHVybiBhYnNWYWx1ZTtcbiB9XG4gfTtcblxuLyoqXG4gKiBgcmVsTGlrZWAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5XG4gKiBvcGVyYXRvcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIGEgYFJlbGF0aXZlVGltZWBcbiAqIHJhdGhlciB0aGFuIGEgYFRpbWVzdGFtcGAuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWVWYWx1ZX0gcmVsVmFsdWVcbiAqIEByZXR1cm5zIHtSZWxhdGl2ZVRpbWV9XG4gKi9cbmNvbnN0IHJlbExpa2U9KGxlZnQscmlnaHQscmVsVmFsdWUpPT57XG5OYXQocmVsVmFsdWUpO1xuY29uc3QgdGltZXJCcmFuZD1zaGFyZWRUaW1lckJyYW5kKGxlZnQscmlnaHQpO1xuaWYodGltZXJCcmFuZCl7XG5yZXR1cm4gaGFyZGVuKHtcbnRpbWVyQnJhbmQsXG5yZWxWYWx1ZX0pO1xuXG4gfWVsc2V7XG5yZXR1cm4gcmVsVmFsdWU7XG4gfVxuIH07XG5cbi8qIEZvciBhbGwgdGhlIGZvbGxvd2luZyB0aW1lIG9wZXJhdG9ycywgdGhlaXIgZG9jdW1lbnRhdGlvbiBpcyBpbiovXG4vKiB0aGUgYFRpbWVNYXRoVHlwZWAsIHNpbmNlIHRoYXQgaXMgdGhlIGRvY3VtZW50YXRpb24gdGhhdCBzaG93cyB1cCovXG4vKiBpbiB0aGUgSURFLiBXZWxsLCBhdCBsZWFzdCB0aGUgdnNjb2RlIElERS4qL1xuXG5jb25zdCBhYnNWYWx1ZT0oYWJzKT0+e1xuaWYodHlwZW9mIGFicz09PSdiaWdpbnQnKXtcbnJldHVybiBOYXQoYWJzKTtcbiB9XG5tdXN0TWF0Y2goYWJzLFRpbWVzdGFtcFJlY29yZFNoYXBlLCd0aW1lc3RhbXAnKTtcbnJldHVybiBOYXQoYWJzLmFic1ZhbHVlKTtcbiB9O1xuXG5jb25zdCByZWxWYWx1ZT0ocmVsKT0+e1xuaWYodHlwZW9mIHJlbD09PSdiaWdpbnQnKXtcbnJldHVybiBOYXQocmVsKTtcbiB9XG5tdXN0TWF0Y2gocmVsLFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLCdyZWxhdGl2ZScpO1xucmV0dXJuIE5hdChyZWwucmVsVmFsdWUpO1xuIH07XG5cbmNvbnN0IG1ha2VUaW1lc3RhbXBSZWNvcmQ9KGFicyx0aW1lckJyYW5kKT0+XG5oYXJkZW4oe2Fic1ZhbHVlOmFicyx0aW1lckJyYW5kfSk7XG5jb25zdCBtYWtlUmVsYXRpdmVUaW1lUmVjb3JkPShyZWwsdGltZXJCcmFuZCk9PlxuaGFyZGVuKHtyZWxWYWx1ZTpyZWwsdGltZXJCcmFuZH0pO1xuXG5jb25zdCBjb2VyY2VUaW1lc3RhbXBSZWNvcmQ9KHRzLGJyYW5kKT0+e1xuYnJhbmR8fEZhaWwgYG11c3QgaGF2ZSBhIGJyYW5kYDtcbmlmKHR5cGVvZiB0cz09PSdudW1iZXInKXtcbnRzPU5hdCh0cyk7XG4gfVxuaWYodHlwZW9mIHRzPT09J2JpZ2ludCcpe1xucmV0dXJuIG1ha2VUaW1lc3RhbXBSZWNvcmQodHMsYnJhbmQpO1xuIH1lbHNle1xuY29uc3R7dGltZXJCcmFuZH09dHM7XG5tdXN0TWF0Y2godHMsVGltZXN0YW1wUmVjb3JkU2hhcGUsJ3RpbWVzdGFtcCcpO1xuYWdyZWVkVGltZXJCcmFuZCh0aW1lckJyYW5kLGJyYW5kKTtcbnJldHVybiB0cztcbiB9XG4gfTtcblxuY29uc3QgY29lcmNlUmVsYXRpdmVUaW1lUmVjb3JkPShydCxicmFuZCk9PntcbmJyYW5kfHxGYWlsIGBtdXN0IGhhdmUgYSBicmFuZGA7XG5pZih0eXBlb2YgcnQ9PT0nbnVtYmVyJyl7XG5ydD1OYXQocnQpO1xuIH1cbmlmKHR5cGVvZiBydD09PSdiaWdpbnQnKXtcbnJldHVybiBtYWtlUmVsYXRpdmVUaW1lUmVjb3JkKHJ0LGJyYW5kKTtcbiB9ZWxzZXtcbmNvbnN0e3RpbWVyQnJhbmR9PXJ0O1xubXVzdE1hdGNoKHJ0LFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLCdyZWxhdGl2ZVRpbWUnKTtcbmFncmVlZFRpbWVyQnJhbmQodGltZXJCcmFuZCxicmFuZCk7XG5yZXR1cm4gcnQ7XG4gfVxuIH07XG5cbmNvbnN0IGFkZEFic1JlbD0oYWJzLHJlbCk9PlxuYWJzTGlrZShhYnMscmVsLGFic1ZhbHVlKGFicykrcmVsVmFsdWUocmVsKSk7XG5cbmNvbnN0IGFkZFJlbFJlbD0ocmVsMSxyZWwyKT0+XG5yZWxMaWtlKHJlbDEscmVsMixyZWxWYWx1ZShyZWwxKStyZWxWYWx1ZShyZWwyKSk7XG5cbmNvbnN0IHN1YnRyYWN0QWJzQWJzPShhYnMxLGFiczIpPT5cbnJlbExpa2UoYWJzMSxhYnMyLGFic1ZhbHVlKGFiczEpLWFic1ZhbHVlKGFiczIpKTtcblxuY29uc3QgY2xhbXBlZFN1YnRyYWN0QWJzQWJzPShhYnMxLGFiczIpPT57XG5jb25zdCB2YWwxPWFic1ZhbHVlKGFiczEpO1xuY29uc3QgdmFsMj1hYnNWYWx1ZShhYnMyKTtcbnJldHVybiByZWxMaWtlKGFiczEsYWJzMix2YWwxPnZhbDI/dmFsMS12YWwyOjBuKTtcbiB9O1xuXG5jb25zdCBzdWJ0cmFjdEFic1JlbD0oYWJzLHJlbCk9PlxuYWJzTGlrZShhYnMscmVsLGFic1ZhbHVlKGFicyktcmVsVmFsdWUocmVsKSk7XG5cbmNvbnN0IHN1YnRyYWN0UmVsUmVsPShyZWwxLHJlbDIpPT5cbnJlbExpa2UocmVsMSxyZWwyLHJlbFZhbHVlKHJlbDEpLXJlbFZhbHVlKHJlbDIpKTtcblxuY29uc3QgaXNSZWxaZXJvPShyZWwpPT5yZWxWYWx1ZShyZWwpPT09MG47XG5cbmNvbnN0IG11bHRpcGx5UmVsTmF0PShyZWwsbmF0KT0+cmVsTGlrZShyZWwsbmF0LHJlbFZhbHVlKHJlbCkqbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsTmF0PShyZWwsbmF0KT0+cmVsTGlrZShyZWwsbmF0LHJlbFZhbHVlKHJlbCkvbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsUmVsPShyZWwxLHJlbDIpPT57XG5zaGFyZWRUaW1lckJyYW5kKHJlbDEscmVsMik7LyoganVzdCBlcnJvciBjaGVjayovXG5yZXR1cm4gcmVsVmFsdWUocmVsMSkvcmVsVmFsdWUocmVsMik7XG4gfTtcblxuY29uc3QgbW9kQWJzUmVsPShhYnMsc3RlcCk9PlxucmVsTGlrZShhYnMsc3RlcCxhYnNWYWx1ZShhYnMpJXJlbFZhbHVlKHN0ZXApKTtcblxuY29uc3QgbW9kUmVsUmVsPShyZWwsc3RlcCk9PlxucmVsTGlrZShyZWwsc3RlcCxyZWxWYWx1ZShyZWwpJXJlbFZhbHVlKHN0ZXApKTtcblxuLyoqXG4gKiBgY29tcGFyZVZhbHVlc2AgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudFxuICogdGhlIHRpbWUgY29tcGFyaXNvbiBvcGVyYXRvcnMuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtiaWdpbnR9IHYxXG4gKiBAcGFyYW0ge2JpZ2ludH0gdjJcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuY29uc3QgY29tcGFyZVZhbHVlcz0obGVmdCxyaWdodCx2MSx2Mik9PntcbnNoYXJlZFRpbWVyQnJhbmQobGVmdCxyaWdodCk7XG5pZih2MTx2Mil7XG5yZXR1cm4tMTtcbiB9ZWxzZSBpZih2MT09PXYyKXtcbnJldHVybiAwO1xuIH1lbHNle1xuYXNzZXJ0KHYxPnYyKTtcbnJldHVybiAxO1xuIH1cbiB9O1xuXG4vKipcbiAqIFRoZSBgVGltZU1hdGhgIG9iamVjdCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyB0byBkbyBhcml0aG1ldGljIG9uIGxhYmVsZWRcbiAqIHRpbWUgdmFsdWVzLCBtdWNoIGxpa2UgYEFtb3VudE1hdGhgIHByb3ZpZGVzIGhlbHBlciBtZXRob2RzIHRvIGRvIGFyaXRobWV0aWNcbiAqIG9uIGxhYmVsZWQgYXNzZXQvbW9uZXkgdmFsdWVzLiBCb3RoIGNoZWNrIGZvciBjb25zaXN0ZW5jeSBvZiBsYWJlbHM6IGFcbiAqIGJpbmFyeSBvcGVyYXRpb24gb24gdHdvIGxhYmVsZWQgb2JqZWN0cyBlbnN1cmVzIHRoYXQgdGhlIGJvdGggY2FycnlcbiAqIHRoZSBzYW1lIGxhYmVsLiBJZiB0aGV5IHByb2R1Y2UgYW5vdGhlciBvYmplY3QgZnJvbSB0aGUgc2FtZSBkb21haW4sIGl0XG4gKiB3aWxsIGNhcnJ5IHRoZSBzYW1lIGxhYmVsLiBJZiB0aGUgb3BlcmFuZHMgaGF2ZSBpbmNvbXBhdGlibGUgbGFiZWxzLFxuICogYW4gZXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIFVubGlrZSBhbW91bnQgYXJpdGhtZXRpYywgdGltZSBhcml0aG1ldGljIGRlYWxzIGluIHR3byBraW5kcyBvZiB0aW1lIG9iamVjdHM6XG4gKiBUaW1lc3RhbXBzLCB3aGljaCByZXByZXNlbnQgYWJzb2x1dGUgdGltZSwgYW5kIFJlbGF0aXZlVGltZSwgd2hpY2ggcmVwcmVzZW50c1xuICogdGhlIGR1cmF0aW9uIGJldHdlZW4gdHdvIGFic29sdXRlIHRpbWVzLiBCb3RoIGtpbmRzIG9mIHRpbWUgb2JqZWN0XG4gKiBhcmUgbGFiZWxlZCBieSBhIGBUaW1lckJyYW5kYC4gRm9yIGEgVGltZXN0YW1wIG9iamVjdCwgdGhlIHZhbHVlIGlzXG4gKiBhIGJpZ2ludCBpbiBhbiBgYWJzVmFsdWVgIHByb3BlcnR5LiBGb3IgYSBSZWxhdGl2ZVRpbWUgb2JqZWN0LCB0aGUgdmFsdWVcbiAqIGlzIGEgYmlnaW50IGluIGEgYHJlbFZhbHVlYCBwcm9wZXJ0eS4gVGh1cyB3ZSBoYXZlIGEgcnVudGltZSBzYWZldHkgY2hlY2tcbiAqIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGNvbmZ1c2VkIHRoZSB0d28sIGV2ZW4gaWYgd2UgaGF2ZSBtYW5hZ2VkIHRvIGZvb2xcbiAqIHRoZSAodW5zb3VuZCkgc3RhdGljIHR5cGUgc3lzdGVtLlxuICpcbiAqIEFzIGEgdHJhbnNpdGlvbmFsIG1lYXN1cmUsIGN1cnJlbnRseSBtYW55IFRpbWVzdGFtcHMgYW5kIFJlbGF0aXZlVGltZXMgYXJlXG4gKiBzdGlsbCByZXByZXNlbnRlZCBieSB1bmxhYmVsZWQgYmlnaW50cy4gRHVyaW5nIHRoaXMgdHJhbnNpdGlvbmFsIHBlcmlvZCxcbiAqIHdlIGFsbG93IHRoaXMsIGJvdGggc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkuIEZvciBhIG5vcm1hbCBiaW5hcnlcbiAqIG9wZXJhdGlvbiwgaWYgYm90aCBpbnB1dHMgYXJlIGxhYmVsZWQsIHRoZW4gd2UgZG8gdGhlIGZ1bGwgY2hlY2tpbmcgYXNcbiAqIGV4cGxhaW5lZCBhYm92ZSBhbmQgcmV0dXJuIGEgbGFiZWxlZCByZXN1bHQuIElmIGJvdGggaW5wdXRzIGFyZSB1bmxhYmVsZWRcbiAqIGJpZ2ludHMsIHdlICphc3N1bWUqIHRoYXQgdGhleSBpbmRpY2F0ZSBhIHRpbWUgb2YgdGhlIHJpZ2h0IGtpbmRcbiAqIChUaW1lc3RhbXAgdnMgUmVsYXRpdmVUaW1lKSBhbmQgdGltZXIgYnJhbmQuIFNpbmNlIHdlIGRvbid0IGtub3cgd2hhdFxuICogYnJhbmQgd2FzIGludGVuZGVkLCB3ZSBjYW4gb25seSByZXR1cm4geWV0IGFub3RoZXIgdW5sYWJlbGVkIGJpZ2ludC5cbiAqXG4gKiBJZiBvbmUgb3BlcmFuZCBpcyBsYWJlbGVkIGFuZCB0aGUgb3RoZXIgaXMgbm90LCB3ZSBjaGVjayB0aGUgbGFiZWxlZCBvcGVyYW5kLFxuICogKmFzc3VtZSogdGhlIHVubGFiZWxlZCBiaWdpbnQgcmVwcmVzZW50cyB0aGUgdmFsdWUgbmVlZGVkIGZvciB0aGUgb3RoZXJcbiAqIG9wZXJhbmQsIGFuZCByZXR1cm4gYSBsYWJlbGVkIHRpbWUgb2JqZWN0IHdpdGggdGhlIGJyYW5kIG9mIHRoZSBsYWJlbGVkXG4gKiBvcGVyYW5kLlxuICpcbiAqIEB0eXBlIHtUaW1lTWF0aFR5cGV9XG4gKi9cbmNvbnN0ICAgICAgICBUaW1lTWF0aD1oYXJkZW4oe1xuYWJzVmFsdWUsXG5yZWxWYWx1ZSxcbmNvZXJjZVRpbWVzdGFtcFJlY29yZCxcbmNvZXJjZVJlbGF0aXZlVGltZVJlY29yZCxcbmFkZEFic1JlbCxcbmFkZFJlbFJlbCxcbnN1YnRyYWN0QWJzQWJzLFxuY2xhbXBlZFN1YnRyYWN0QWJzQWJzLFxuc3VidHJhY3RBYnNSZWwsXG5zdWJ0cmFjdFJlbFJlbCxcbmlzUmVsWmVybyxcbm11bHRpcGx5UmVsTmF0LFxuZGl2aWRlUmVsTmF0LFxuZGl2aWRlUmVsUmVsLFxubW9kQWJzUmVsLFxubW9kUmVsUmVsLFxuY29tcGFyZUFiczooYWJzMSxhYnMyKT0+XG5jb21wYXJlVmFsdWVzKGFiczEsYWJzMixhYnNWYWx1ZShhYnMxKSxhYnNWYWx1ZShhYnMyKSksXG5jb21wYXJlUmVsOihyZWwxLHJlbDIpPT5cbmNvbXBhcmVWYWx1ZXMocmVsMSxyZWwyLHJlbFZhbHVlKHJlbDEpLHJlbFZhbHVlKHJlbDIpKX0pOyRo4oCNX29uY2UuVGltZU1hdGgoVGltZU1hdGgpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRpbWVNYXRoIjpbIlRpbWVNYXRoIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG6zHqqnBwAApwcAACUAAABAYWdvcmljL3RpbWUtdjAuMy4xL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSIsIlJlbGF0aXZlVGltZVNoYXBlIiwiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSIsIlRpbWVyQnJhbmRTaGFwZSIsIlRpbWVyU2VydmljZVNoYXBlIiwiVGltZXN0YW1wUmVjb3JkU2hhcGUiLCJUaW1lc3RhbXBTaGFwZSIsIlRpbWVzdGFtcFZhbHVlU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0ICAgICAgICBUaW1lckJyYW5kU2hhcGU9TS5yZW1vdGFibGUoJ1RpbWVyQnJhbmQnKTskaOKAjV9vbmNlLlRpbWVyQnJhbmRTaGFwZShUaW1lckJyYW5kU2hhcGUpO1xuY29uc3QgICAgICAgIFRpbWVzdGFtcFZhbHVlU2hhcGU9TS5uYXQoKTskaOKAjV9vbmNlLlRpbWVzdGFtcFZhbHVlU2hhcGUoVGltZXN0YW1wVmFsdWVTaGFwZSk7XG5jb25zdCAgICAgICAgUmVsYXRpdmVUaW1lVmFsdWVTaGFwZT1NLm5hdCgpOy8qIFNob3VsZCB3ZSBhbGxvdyBuZWdhdGl2ZXM/Ki8kaOKAjV9vbmNlLlJlbGF0aXZlVGltZVZhbHVlU2hhcGUoUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBUaW1lc3RhbXBSZWNvcmRTaGFwZT1oYXJkZW4oe1xudGltZXJCcmFuZDpUaW1lckJyYW5kU2hhcGUsXG5hYnNWYWx1ZTpUaW1lc3RhbXBWYWx1ZVNoYXBlfSk7JGjigI1fb25jZS5UaW1lc3RhbXBSZWNvcmRTaGFwZShUaW1lc3RhbXBSZWNvcmRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFJlbGF0aXZlVGltZVJlY29yZFNoYXBlPWhhcmRlbih7XG50aW1lckJyYW5kOlRpbWVyQnJhbmRTaGFwZSxcbnJlbFZhbHVlOlJlbGF0aXZlVGltZVZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLlJlbGF0aXZlVGltZVJlY29yZFNoYXBlKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVGltZXN0YW1wU2hhcGU9TS5vcihUaW1lc3RhbXBSZWNvcmRTaGFwZSxUaW1lc3RhbXBWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLlRpbWVzdGFtcFNoYXBlKFRpbWVzdGFtcFNoYXBlKTtcbmNvbnN0ICAgICAgICBSZWxhdGl2ZVRpbWVTaGFwZT1NLm9yKFxuUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsXG5SZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLlJlbGF0aXZlVGltZVNoYXBlKFJlbGF0aXZlVGltZVNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVGltZXJTZXJ2aWNlU2hhcGU9TS5yZW1vdGFibGUoJ1RpbWVyU2VydmljZScpOyRo4oCNX29uY2UuVGltZXJTZXJ2aWNlU2hhcGUoVGltZXJTZXJ2aWNlU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRpbWVyQnJhbmRTaGFwZSI6WyJUaW1lckJyYW5kU2hhcGUiXSwiVGltZXN0YW1wVmFsdWVTaGFwZSI6WyJUaW1lc3RhbXBWYWx1ZVNoYXBlIl0sIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiOlsiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSJdLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSI6WyJUaW1lc3RhbXBSZWNvcmRTaGFwZSJdLCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSJdLCJUaW1lc3RhbXBTaGFwZSI6WyJUaW1lc3RhbXBTaGFwZSJdLCJSZWxhdGl2ZVRpbWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVTaGFwZSJdLCJUaW1lclNlcnZpY2VTaGFwZSI6WyJUaW1lclNlcnZpY2VTaGFwZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC+1ERjYygAAGMoAAAoAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjEvc3JjL2V4by11dGlscy5qc3siaW1wb3J0cyI6WyIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImlnbm9yZUNvbnRleHQiLCJtYWtlRXhvVXRpbHMiLCJwcmVwYXJlRXhvIiwicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUtpbmQiLCJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZVNpbmdsZXRvbiIsInByb3ZpZGVLaW5kSGFuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGluaXRFbXB0eSxwcm92aWRlLGdsb2JhbFZhdERhdGE7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wicHJvdmlkZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZSA9ICRo4oCNX2EpXV0sW1wiVmF0RGF0YVwiLCBbJGjigI1fYSA9PiAoZ2xvYmFsVmF0RGF0YSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8VD59IEVSZWYgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkRlZmluZUtpbmRPcHRpb25zPFQ+fSBEZWZpbmVLaW5kT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuS2luZEZhY2V0PFQ+fSBLaW5kRmFjZXQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLktpbmRGYWNldHM8VD59IEtpbmRGYWNldHMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkR1cmFibGVLaW5kSGFuZGxlfSBEdXJhYmxlS2luZEhhbmRsZSAqL1xuXG4vKipcbiAqIE1ha2UgYSB2ZXJzaW9uIG9mIHRoZSBhcmd1bWVudCBmdW5jdGlvbiB0aGF0IHRha2VzIGEga2luZCBjb250ZXh0IGJ1dFxuICogaWdub3JlcyBpdC5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyBGdW5jdGlvbj4oZm46IFQpID0+IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5QbHVzQ29udGV4dDxuZXZlciwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBpZ25vcmVDb250ZXh0PVxuKGZuKT0+XG4oX2NvbnRleHQsLi4uYXJncyk9PlxuZm4oLi4uYXJncyk7JGjigI1fb25jZS5pZ25vcmVDb250ZXh0KGlnbm9yZUNvbnRleHQpO1xuaGFyZGVuKGlnbm9yZUNvbnRleHQpO1xuXG4vKiBUT0RPOiBGaW5kIGEgZ29vZCBob21lIGZvciB0aGlzIGZ1bmN0aW9uIHVzZWQgYnkgQGFnb3JpYy92YXQtZGF0YSBhbmQgdGVzdGluZyBjb2RlKi9cbmNvbnN0ICAgICAgICBtYWtlRXhvVXRpbHM9KFZhdERhdGEpPT57XG5jb25zdHtcbmRlZmluZUtpbmQsXG5kZWZpbmVLaW5kTXVsdGksXG5kZWZpbmVEdXJhYmxlS2luZCxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGksXG5tYWtlS2luZEhhbmRsZX09XG5WYXREYXRhO1xuXG4vKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcmV0dXJucyB7RHVyYWJsZUtpbmRIYW5kbGV9XG4gKi9cbmNvbnN0IHByb3ZpZGVLaW5kSGFuZGxlPShiYWdnYWdlLGtpbmROYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwoKT0+bWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTtcbmhhcmRlbihwcm92aWRlS2luZEhhbmRsZSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG9DbGFzcyBpbnN0ZWFkXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByZXBhcmVLaW5kfVxuICovXG5jb25zdCBwcmVwYXJlS2luZD0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZChcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlS2luZCk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG9DbGFzc0tpdCBpbnN0ZWFkXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByZXBhcmVLaW5kTXVsdGl9XG4gKi9cbmNvbnN0IHByZXBhcmVLaW5kTXVsdGk9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlS2luZE11bHRpKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSBUIGJlaGF2aW9yXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3M9KHRhZyxpbnRlcmZhY2VHdWFyZCxpbml0LG1ldGhvZHMsb3B0aW9ucyk9PlxuZGVmaW5lS2luZCh0YWcsaW5pdCxtZXRob2RzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxuaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IGZhY2V0czogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQ9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk9PlxuXG5kZWZpbmVLaW5kTXVsdGkodGFnLGluaXQsZmFjZXRzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmQ6aW50ZXJmYWNlR3VhcmRLaXR9KTtcblxuaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzcz0oXG5raW5kSGFuZGxlLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmQoa2luZEhhbmRsZSxpbml0LG1ldGhvZHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZH0pO1xuXG5oYXJkZW4oZGVmaW5lRHVyYWJsZUV4b0NsYXNzKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtEdXJhYmxlS2luZEhhbmRsZX0ga2luZEhhbmRsZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgZmFjZXRzOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPn0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgZmFjZXRzOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPn0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQ9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShraW5kSGFuZGxlLGluaXQsZmFjZXRzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmQ6aW50ZXJmYWNlR3VhcmRLaXR9KTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBwcmVwYXJlRXhvQ2xhc3M9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVFeG9DbGFzcyhcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpO1xuXG5oYXJkZW4ocHJlcGFyZUV4b0NsYXNzKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IGZhY2V0czogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBwcmVwYXJlRXhvQ2xhc3NLaXQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKTtcblxuaGFyZGVuKHByZXBhcmVFeG9DbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7TX0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IE0gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMge00gJiBSZW1vdGFibGVCcmFuZDx7fSwgTT59XG4gKi9cbmNvbnN0IHByZXBhcmVFeG89KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbmNvbnN0IG1ha2VTaW5nbGV0b249cHJlcGFyZUV4b0NsYXNzKFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cblxucmV0dXJuIHByb3ZpZGUoYmFnZ2FnZSwgYCR7a2luZE5hbWV9X3NpbmdsZXRvbmAsKCk9Pm1ha2VTaW5nbGV0b24oKSk7XG4gfTtcbmhhcmRlbihwcmVwYXJlRXhvKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBNIG1ldGhvZHNcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvIGluc3RlYWQuXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtNfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogTSB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7TSAmIFJlbW90YWJsZUJyYW5kPHt9LCBNPn1cbiAqL1xuY29uc3QgcHJlcGFyZVNpbmdsZXRvbj0oYmFnZ2FnZSxraW5kTmFtZSxtZXRob2RzLG9wdGlvbnM9dW5kZWZpbmVkKT0+XG5wcmVwYXJlRXhvKGJhZ2dhZ2Usa2luZE5hbWUsdW5kZWZpbmVkLG1ldGhvZHMsb3B0aW9ucyk7XG5oYXJkZW4ocHJlcGFyZVNpbmdsZXRvbik7XG5cbnJldHVybiBoYXJkZW4oe1xuZGVmaW5lVmlydHVhbEV4b0NsYXNzLFxuZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0LFxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0LFxucHJlcGFyZUV4b0NsYXNzLFxucHJlcGFyZUV4b0NsYXNzS2l0LFxucHJlcGFyZUV4byxcbnByZXBhcmVTaW5nbGV0b24sXG5cbnByb3ZpZGVLaW5kSGFuZGxlLFxucHJlcGFyZUtpbmQsXG5wcmVwYXJlS2luZE11bHRpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUV4b1V0aWxzKG1ha2VFeG9VdGlscyk7XG5cbmNvbnN0IGdsb2JhbEV4b1V0aWxzPW1ha2VFeG9VdGlscyhnbG9iYWxWYXREYXRhKTtcblxuY29uc3QgICAgICAge1xuZGVmaW5lVmlydHVhbEV4b0NsYXNzLFxuZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0LFxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0LFxucHJlcGFyZUV4b0NsYXNzLFxucHJlcGFyZUV4b0NsYXNzS2l0LFxucHJlcGFyZUV4byxcbnByZXBhcmVTaW5nbGV0b259PVxuZ2xvYmFsRXhvVXRpbHM7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIEV4b3MvRXhvQ2xhc3NlcyBpbnN0ZWFkIG9mIEtpbmRzXG4gKi8kaOKAjV9vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzcyhkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpOyRo4oCNX29uY2UuZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MoZGVmaW5lRHVyYWJsZUV4b0NsYXNzKTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpOyRo4oCNX29uY2UucHJlcGFyZUV4b0NsYXNzKHByZXBhcmVFeG9DbGFzcyk7JGjigI1fb25jZS5wcmVwYXJlRXhvQ2xhc3NLaXQocHJlcGFyZUV4b0NsYXNzS2l0KTskaOKAjV9vbmNlLnByZXBhcmVFeG8ocHJlcGFyZUV4byk7JGjigI1fb25jZS5wcmVwYXJlU2luZ2xldG9uKHByZXBhcmVTaW5nbGV0b24pO1xuY29uc3QgICAgICAge3Byb3ZpZGVLaW5kSGFuZGxlLHByZXBhcmVLaW5kLHByZXBhcmVLaW5kTXVsdGl9PVxuZ2xvYmFsRXhvVXRpbHM7JGjigI1fb25jZS5wcm92aWRlS2luZEhhbmRsZShwcm92aWRlS2luZEhhbmRsZSk7JGjigI1fb25jZS5wcmVwYXJlS2luZChwcmVwYXJlS2luZCk7JGjigI1fb25jZS5wcmVwYXJlS2luZE11bHRpKHByZXBhcmVLaW5kTXVsdGkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCJdLCJtYWtlRXhvVXRpbHMiOlsibWFrZUV4b1V0aWxzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSwicHJlcGFyZUV4b0NsYXNzIjpbInByZXBhcmVFeG9DbGFzcyJdLCJwcmVwYXJlRXhvQ2xhc3NLaXQiOlsicHJlcGFyZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG8iOlsicHJlcGFyZUV4byJdLCJwcmVwYXJlU2luZ2xldG9uIjpbInByZXBhcmVTaW5nbGV0b24iXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwicHJlcGFyZUtpbmQiOlsicHJlcGFyZUtpbmQiXSwicHJlcGFyZUtpbmRNdWx0aSI6WyJwcmVwYXJlS2luZE11bHRpIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADvjPYiSCAAAkggAACQAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMS9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9leG8tdXRpbHMuanMiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW11dLFtcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW11dLFtcIi4vZXhvLXV0aWxzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvc3RvcmUiOltbIk0iLCJNIl0sWyJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjpbWyJtYWtlS2luZEhhbmRsZSIsIm1ha2VLaW5kSGFuZGxlIl0sWyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSxbIndhdGNoUHJvbWlzZSIsIndhdGNoUHJvbWlzZSJdLFsibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLFsiY2FuQmVEdXJhYmxlIiwiY2FuQmVEdXJhYmxlIl0sWyJwaWNrRmFjZXQiLCJwaWNrRmFjZXQiXSxbInBhcnRpYWxBc3NpZ24iLCJwYXJ0aWFsQXNzaWduIl0sWyJwcm92aWRlIiwicHJvdmlkZSJdLFsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl0sWyJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZCJdLFsiZGVmaW5lS2luZE11bHRpIiwiZGVmaW5lS2luZE11bHRpIl0sWyJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kIl0sWyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdXSwiLi9leG8tdXRpbHMuanMiOltbImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyJdLFsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0Il0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiXSxbImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCJdLFsicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzIl0sWyJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvIl0sWyJwcmVwYXJlU2luZ2xldG9uIiwicHJlcGFyZVNpbmdsZXRvbiJdLFsiaWdub3JlQ29udGV4dCIsImlnbm9yZUNvbnRleHQiXSxbInByb3ZpZGVLaW5kSGFuZGxlIiwicHJvdmlkZUtpbmRIYW5kbGUiXSxbInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmQiXSxbInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlS2luZE11bHRpIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADe9I8gUygAAFMoAAAwAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjEvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIlZhdERhdGEiLCJjYW5CZUR1cmFibGUiLCJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kTXVsdGkiLCJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZE11bHRpIiwibWFrZUtpbmRIYW5kbGUiLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsIm1ha2VTdG9yZVV0aWxzIiwicGFydGlhbEFzc2lnbiIsInBpY2tGYWNldCIsInByb3ZpZGUiLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJ3YXRjaFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFpbCxwcm92aWRlTGF6eTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzJykuVmF0RGF0YX0gKi9cbmxldCBWYXREYXRhR2xvYmFsO1xuaWYoJ1ZhdERhdGEnaW4gZ2xvYmFsVGhpcyl7XG5nbG9iYWxUaGlzLlZhdERhdGF8fEZhaWwgYFZhdERhdGEgZGVmaW5lZCBpbiBnbG9iYWwgYXMgbnVsbCBvciB1bmRlZmluZWRgO1xuVmF0RGF0YUdsb2JhbD1nbG9iYWxUaGlzLlZhdERhdGE7XG4gfWVsc2V7XG4vKiBYWFggdGhpcyBtb2R1bGUgaGFzIGJlZW4ga25vd24gdG8gZ2V0IGltcG9ydGVkICh0cmFuc2l0aXZlbHkpIGluIGNhc2VzIHRoYXQqL1xuLyogbmV2ZXIgdXNlIGl0IHNvIHdlIG1ha2UgYSB2ZXJzaW9uIHRoYXQgd2lsbCBzYXRpc2Z5IG1vZHVsZSByZXNvbHV0aW9uIGJ1dCovXG4vKiBmYWlsIGF0IHJ1bnRpbWUuKi9cbmNvbnN0IHVudmFpbGFibGU9KCk9PkZhaWwgYFZhdERhdGEgdW5hdmFpbGFibGVgO1xuVmF0RGF0YUdsb2JhbD17XG5kZWZpbmVLaW5kOnVudmFpbGFibGUsXG5kZWZpbmVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kOnVudmFpbGFibGUsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpOnVudmFpbGFibGUsXG5tYWtlS2luZEhhbmRsZTp1bnZhaWxhYmxlLFxucHJvdmlkZVByb21pc2VXYXRjaGVyOnVudmFpbGFibGUsXG53YXRjaFByb21pc2U6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ1NldFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlOnVudmFpbGFibGUsXG5jYW5CZUR1cmFibGU6dW52YWlsYWJsZX07XG5cbiB9XG5cbmNvbnN0IFZhdERhdGFFeHBvcnQ9VmF0RGF0YUdsb2JhbDskaOKAjV9vbmNlLlZhdERhdGFFeHBvcnQoVmF0RGF0YUV4cG9ydCk7XG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRXhvcy9FeG9DbGFzc2VzIGluc3RlYWQgb2YgS2luZHNcbiAqL1xuY29uc3QgICAgICAge1xuZGVmaW5lS2luZCxcbmRlZmluZUtpbmRNdWx0aSxcbmRlZmluZUR1cmFibGVLaW5kLFxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aX09XG5WYXREYXRhR2xvYmFsOyRo4oCNX29uY2UuZGVmaW5lS2luZChkZWZpbmVLaW5kKTskaOKAjV9vbmNlLmRlZmluZUtpbmRNdWx0aShkZWZpbmVLaW5kTXVsdGkpOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUtpbmQoZGVmaW5lRHVyYWJsZUtpbmQpOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShkZWZpbmVEdXJhYmxlS2luZE11bHRpKTtcblxuY29uc3QgICAgICAge1xubWFrZUtpbmRIYW5kbGUsXG5wcm92aWRlUHJvbWlzZVdhdGNoZXIsXG53YXRjaFByb21pc2UsXG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxubWFrZVNjYWxhckJpZ1NldFN0b3JlLFxubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSxcbmNhbkJlRHVyYWJsZX09XG5WYXREYXRhR2xvYmFsO1xuXG4vKipcbiAqIFdoZW4gbWFraW5nIGEgbXVsdGktZmFjZXQga2luZCwgaXQncyBjb21tb24gdG8gcGljayBvbmUgZmFjZXQgdG8gZXhwb3NlLiBFLmcuLFxuICpcbiAqICAgICBjb25zdCBtYWtlRm9vID0gKGEsIGIsIGMsIGQpID0+IG1ha2VGb29CYXNlKGEsIGIsIGMsIGQpLnNlbGY7XG4gKlxuICogVGhpcyBoZWxwZXIgcmVkdWNlcyB0aGUgZHVwbGljYXRpb246XG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSBwaWNrRmFjZXQobWFrZUZvb0Jhc2UsICdzZWxmJyk7XG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMnKS5QaWNrRmFjZXR9XG4gKi8kaOKAjV9vbmNlLm1ha2VLaW5kSGFuZGxlKG1ha2VLaW5kSGFuZGxlKTskaOKAjV9vbmNlLnByb3ZpZGVQcm9taXNlV2F0Y2hlcihwcm92aWRlUHJvbWlzZVdhdGNoZXIpOyRo4oCNX29uY2Uud2F0Y2hQcm9taXNlKHdhdGNoUHJvbWlzZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnTWFwU3RvcmUobWFrZVNjYWxhckJpZ01hcFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnU2V0U3RvcmUobWFrZVNjYWxhckJpZ1NldFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUobWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSk7JGjigI1fb25jZS5jYW5CZUR1cmFibGUoY2FuQmVEdXJhYmxlKTtcbmNvbnN0ICAgICAgICBwaWNrRmFjZXQ9XG4obWFrZXIsZmFjZXROYW1lKT0+XG4oLi4uYXJncyk9PlxubWFrZXIoLi4uYXJncylbZmFjZXROYW1lXTskaOKAjV9vbmNlLnBpY2tGYWNldChwaWNrRmFjZXQpO1xuaGFyZGVuKHBpY2tGYWNldCk7XG5cbi8qKlxuICogQXNzaWduIHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZVxuICogb2JqZWN0IHRvIHRoZWlyIGtleXMgaW4gdGhlIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UGFydGlhbDxUPn0gc291cmNlXG4gKi9cbmNvbnN0ICAgICAgICBwYXJ0aWFsQXNzaWduPSh0YXJnZXQsc291cmNlKT0+e1xuT2JqZWN0LmFzc2lnbih0YXJnZXQsc291cmNlKTtcbiB9OyRo4oCNX29uY2UucGFydGlhbEFzc2lnbihwYXJ0aWFsQXNzaWduKTtcbmhhcmRlbihwYXJ0aWFsQXNzaWduKTtcblxuLyogWFhYIGNvcGllZCBmcm9tIEBhZ29yaWMvc3RvcmUgdHlwZXMqL1xuLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NTYwKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVPcHRpb25zXG4gKiBPZiB0aGUgZGltZW5zaW9ucyBvbiB3aGljaCBLZXllZFN0b3JlcyBjYW4gZGlmZmVyLCB3ZSBvbmx5IHJlcHJlc2VudCBhIGZld1xuICogb2YgdGhlbSBhcyBzdGFuZGFyZCBvcHRpb25zLiBBIGdpdmVuIHN0b3JlIG1ha2VyIHNob3VsZCBkb2N1bWVudCB3aGljaFxuICogb3B0aW9ucyBpdCBzdXBwb3J0cywgYXMgd2VsbCBhcyBpdHMgcG9zaXRpb25zIG9uIGRpbWVuc2lvbnMgZm9yIHdoaWNoIGl0XG4gKiBkb2VzIG5vdCBzdXBwb3J0IG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb25nTGl2ZWQ9dHJ1ZV0gV2hpY2ggd2F5IHRvIG9wdGltaXplIGEgd2VhayBzdG9yZS4gVHJ1ZSBtZWFuc1xuICogdGhhdCB3ZSBleHBlY3QgdGhpcyB3ZWFrIHN0b3JlIHRvIG91dGxpdmUgbW9zdCBvZiBpdHMga2V5cywgaW4gd2hpY2hcbiAqIGNhc2Ugd2UgaW50ZXJuYWxseSBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgV2Vha01hcGAuIE90aGVyd2lzZSB3ZSBpbnRlcm5hbGx5XG4gKiBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgTWFwYC5cbiAqIERlZmF1bHRzIHRvIHRydWUsIHNvIHBsZWFzZSBtYXJrIHNob3J0IGxpdmVkIHN0b3JlcyBleHBsaWNpdGx5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZHVyYWJsZT1mYWxzZV0gIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0b3JlIHN1cnZpdmUgdGVybWluYXRpb25cbiAqICAgb2YgaXRzIGNvbnRhaW5pbmcgcHJvY2VzcywgYWxsb3dpbmcgZm9yIHJlc3RhcnQgb3IgdXBncmFkZSBidXQgYXQgdGhlIGNvc3RcbiAqICAgb2YgZm9yYmlkZGluZyBzdG9yYWdlIG9mIHJlZmVyZW5jZXMgdG8gZXBoZW1lcmFsIGRhdGEuICBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Zha2VEdXJhYmxlPWZhbHNlXSAgVGhpcyBzdG9yZSBwcmV0ZW5kcyB0byBiZSBhIGR1cmFibGUgc3RvcmVcbiAqICAgYnV0IGRvZXMgbm90IGVuZm9yY2UgdGhhdCB0aGUgdGhpbmdzIHN0b3JlZCBpbiBpdCBhY3R1YWxseSBiZSB0aGVtc2VsdmVzXG4gKiAgIGR1cmFibGUgKHdoZXJlYXMgYW4gYWN0dWFsIGR1cmFibGUgc3RvcmUgd291bGQgZm9yYmlkIHN0b3JhZ2Ugb2Ygc3VjaFxuICogICBpdGVtcykuICBUaGlzIGlzIGluIHNlcnZpY2Ugb2YgYWxsb3dpbmcgaW5jcmVtZW50YWwgdHJhbnNpdGlvbiB0byB1c2Ugb2ZcbiAqICAgZHVyYWJsZSBzdG9yZXMsIHRvIGVuYWJsZSBub3JtYWwgb3BlcmF0aW9uIGFuZCB0ZXN0aW5nIHdoZW4gc29tZSBzdHVmZlxuICogICBpbnRlbmRlZCB0byBldmVudHVhbGx5IGJlIGR1cmFibGUgaGFzIG5vdCB5ZXQgYmVlbiBtYWRlIGR1cmFibGUuICBBIHN0b3JlXG4gKiAgIG1hcmtlZCBhcyBmYWtlRHVyYWJsZSB3aWxsIGFwcGVhciB0byBvcGVyYXRlIG5vcm1hbGx5IGJ1dCBhbnkgYXR0ZW1wdCB0b1xuICogICB1cGdyYWRlIGl0cyBjb250YWluaW5nIHZhdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi90eXBlcycpLlBhdHRlcm59IFtrZXlTaGFwZV1cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi90eXBlcycpLlBhdHRlcm59IFt2YWx1ZVNoYXBlXVxuICovXG4vKipcbiAqIFVubGlrZSBgcHJvdmlkZUxhenlgLCBgcHJvdmlkZWAgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2VcbiAqIHdpdGhpbiBhbnkgdmF0IGluY2FybmF0aW9uIHdpdGggYSBnaXZlbiBgYmFnZ2FnZWAsYGtleWAgcGFpci5cbiAqXG4gKiBgcHJvdmlkZWAgc2hvdWxkIG9ubHkgdG8gYmUgdXNlZCB0byBwb3B1bGF0ZSBiYWdnYWdlLFxuICogd2hlcmUgdGhlIHRvdGFsIG51bWJlciBvZiBjYWxscyB0byBgcHJvdmlkZWAgbXVzdCBiZVxuICogbG93IGNhcmRpbmFsaXR5LCBzaW5jZSB3ZSBrZWVwIHRoZSBib29ra2VlcGluZyB0byBkZXRlY3QgY29sbGlzaW9uc1xuICogaW4gbm9ybWFsIGxhbmd1YWdlLWhlYXAgbWVtb3J5LiBBbGwgdGhlIG90aGVyIGJhZ2dhZ2Utb3JpZW50ZWRcbiAqIGBwcm92aWRlKmAgYW5kIGBwcmVwYXJlKmAgZnVuY3Rpb25zIGNhbGwgYHByb3ZpZGVgLFxuICogYW5kIHNvIGltcG9zZSB0aGUgc2FtZSBjb25zdHJhaW50cy4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGhcbiAqIG91ciBleHBlY3RlZCBkdXJhYmlsaXR5IHBhdHRlcm5zOiBXaGF0IHdlIHN0b3JlIGluIGJhZ2dhZ2UgYXJlXG4gKiAgICAqIGtpbmRIYW5kbGVzLCB3aGljaCBhcmUgcGVyIGtpbmQsIHdoaWNoIG11c3QgYmUgbG93IGNhcmRpbmFsaXR5XG4gKiAgICAqIGRhdGEgXCJ2YXJpYWJsZXNcIiBmb3IgcmVlc3RhYmxpc2hpbmcgdGhlIGxleGljYWwgc2NvcGUsIGVzcGVjaWFsbHlcbiAqICAgICAgb2Ygc2luZ2xldG9uc1xuICogICAgKiBuYW1lZCBub24tYmFnZ2FnZSBjb2xsZWN0aW9ucyBhdCB0aGUgbGVhdmVzIG9mIHRoZSBiYWdnYWdlIHRyZWUuXG4gKlxuICogV2hhdCBpcyBleHBlY3RlZCB0byBiZSBoaWdoIGNhcmRpbmFsaXR5IGFyZSB0aGUgaW5zdGFuY2VzIG9mIHRoZSBraW5kcyxcbiAqIGFuZCB0aGUgbWVtYmVycyBvZiB0aGUgbm9uLWJhZ2dnYWdlIGNvbGxlY3Rpb25zLlxuICpcbiAqIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTg3NSA6XG4gKiBJbXBsZW1lbnQgZGV2ZWxvcG1lbnQtdGltZSBpbnN0cnVtZW50YXRpb24gdG8gZGV0ZWN0IHdoZW5cbiAqIGBwcm92aWRlYCB2aW9sYXRlcyB0aGUgYWJvdmUgcHJlc2NyaXB0aW9uLCBhbmQgaXMgY2FsbGVkIG1vcmVcbiAqIHRoYW4gb25jZSBpbiB0aGUgc2FtZSB2YXQgaW5jYXJuYXRpb24gd2l0aCB0aGUgc2FtZVxuICogYmFnZ2FnZSxrZXkgcGFpci5cbiAqL1xuXG5jb25zdCAgICAgICAgcHJvdmlkZT1cbi8qIFhYWCBjYXN0IGJlY2F1c2UgcHJvdmlkZUxhenkgaXMgYGFueWAgZHVlIHRvIGJyb2tlbiB0eXBlIGltcG9ydCovXG4vKiogQHR5cGUgezxLLCBWPihiYWdnYWdlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZSwga2V5OiBLLCBtYWtlVmFsdWU6IChrZXk6IEspID0+IFYpID0+IFZ9ICovXG5wcm92aWRlTGF6eTtcblxuXG4vKiBUT0RPOiBGaW5kIGEgZ29vZCBob21lIGZvciB0aGlzIGZ1bmN0aW9uIHVzZWQgYnkgQGFnb3JpYy92YXQtZGF0YSBhbmQgdGVzdGluZyBjb2RlKi9cbi8qKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEvc3JjL3R5cGVzJykuVmF0RGF0YX0gVmF0RGF0YSAqLyRo4oCNX29uY2UucHJvdmlkZShwcm92aWRlKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVVdGlscz0oVmF0RGF0YSk9PntcbmNvbnN0e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbm1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlfT1cblZhdERhdGE7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lLG9wdGlvbnM9e30pPT5cbnByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT5cbm1ha2VTY2FsYXJCaWdNYXBTdG9yZShuYW1lLHtkdXJhYmxlOnRydWUsLi4ub3B0aW9uc30pKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUpO1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShuYW1lLHtkdXJhYmxlOnRydWUsLi4ub3B0aW9uc30pKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPbWl0PFN0b3JlT3B0aW9ucywgJ2R1cmFibGUnPn0gb3B0aW9uc1xuICovXG5jb25zdCBwcm92aWRlRHVyYWJsZVNldFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ1NldFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZVV0aWxzKG1ha2VTdG9yZVV0aWxzKTtcblxuY29uc3QgZ2xvYmFsU3RvcmVVdGlscz1tYWtlU3RvcmVVdGlscyhWYXREYXRhR2xvYmFsKTtcbmNvbnN0ICAgICAgIHtcbnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZX09XG5nbG9iYWxTdG9yZVV0aWxzOyRo4oCNX29uY2UucHJvdmlkZUR1cmFibGVNYXBTdG9yZShwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVmF0RGF0YSI6WyJWYXREYXRhRXhwb3J0Il0sImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCJdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIl0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIl0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdLCJtYWtlS2luZEhhbmRsZSI6WyJtYWtlS2luZEhhbmRsZSJdLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiOlsicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXSwibWFrZVNjYWxhckJpZ01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSwiY2FuQmVEdXJhYmxlIjpbImNhbkJlRHVyYWJsZSJdLCJwaWNrRmFjZXQiOlsicGlja0ZhY2V0Il0sInBhcnRpYWxBc3NpZ24iOlsicGFydGlhbEFzc2lnbiJdLCJwcm92aWRlIjpbInByb3ZpZGUiXSwibWFrZVN0b3JlVXRpbHMiOlsibWFrZVN0b3JlVXRpbHMiXSwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADlsQnM20MAANtDAAAlAAAAQGFnb3JpYy96b2UtdjAuMjYuMS9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdGltZSJdLCJleHBvcnRzIjpbIkFkbWluRmFjZXRJIiwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIiwiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSIsIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIiwiQnVuZGxlQ2FwU2hhcGUiLCJCdW5kbGVTaGFwZSIsIkV4aXRPYmplY3RJIiwiRXhpdE9iamVjdFNoYXBlIiwiRmVlTWludEFjY2Vzc1NoYXBlIiwiRnVsbFByb3Bvc2FsU2hhcGUiLCJIYW5kbGVJIiwiSGFuZGxlT2ZmZXJJIiwiSW5zdGFsbGF0aW9uU2hhcGUiLCJJbnN0YW5jZUFkbWluSSIsIkluc3RhbmNlQWRtaW5TaGFwZSIsIkluc3RhbmNlSGFuZGxlU2hhcGUiLCJJbnN0YW5jZVJlY29yZFNoYXBlIiwiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIiwiSW52aXRhdGlvbkhhbmRsZVNoYXBlIiwiSW52aXRhdGlvblNoYXBlIiwiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSIsIklzc3VlclJlY29yZFNoYXBlIiwiS2V5d29yZFNoYXBlIiwiT2ZmZXJIYW5kbGVySSIsIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIiwiUHJpY2VRdW90ZVNoYXBlIiwiUHJvcG9zYWxTaGFwZSIsIlNlYXREYXRhU2hhcGUiLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSIsIlNlYXRTaGFwZSIsIlRlcm1zU2hhcGUiLCJUaW1lclNoYXBlIiwiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiLCJaY2ZNaW50SSIsIlpvZU1pbnRJIiwiWm9lTWludFNoYXBlIiwiWm9lU2VydmljZUkiLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSIsImlzT25EZW1hbmRFeGl0UnVsZSIsImlzV2FpdmVkRXhpdFJ1bGUiLCJtYWtlSGFuZGxlU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50U2hhcGUsQXNzZXRLaW5kU2hhcGUsQnJhbmRTaGFwZSxEaXNwbGF5SW5mb1NoYXBlLElzc3VlcktpdFNoYXBlLElzc3VlclNoYXBlLFBheW1lbnRTaGFwZSxTdWJzY3JpYmVyU2hhcGUsTSxUaW1lc3RhbXBTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudFNoYXBlXCIsIFskaOKAjV9hID0+IChBbW91bnRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiQXNzZXRLaW5kU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZFNoYXBlID0gJGjigI1fYSldXSxbXCJCcmFuZFNoYXBlXCIsIFskaOKAjV9hID0+IChCcmFuZFNoYXBlID0gJGjigI1fYSldXSxbXCJEaXNwbGF5SW5mb1NoYXBlXCIsIFskaOKAjV9hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjigI1fYSldXSxbXCJJc3N1ZXJLaXRTaGFwZVwiLCBbJGjigI1fYSA9PiAoSXNzdWVyS2l0U2hhcGUgPSAkaOKAjV9hKV1dLFtcIklzc3VlclNoYXBlXCIsIFskaOKAjV9hID0+IChJc3N1ZXJTaGFwZSA9ICRo4oCNX2EpXV0sW1wiUGF5bWVudFNoYXBlXCIsIFskaOKAjV9hID0+IChQYXltZW50U2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsIFskaOKAjV9hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlRpbWVzdGFtcFNoYXBlXCIsIFskaOKAjV9hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIGtleXdvcmRzIGhhdmUgYW4gaW5pdGlhbCBjYXAqL1xuY29uc3QgICAgICAgIEtleXdvcmRTaGFwZT1NLnN0cmluZygpOyRo4oCNX29uY2UuS2V5d29yZFNoYXBlKEtleXdvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uSGFuZGxlU2hhcGU9TS5yZW1vdGFibGUoJ0ludml0YXRpb25IYW5kbGUnKTskaOKAjV9vbmNlLkludml0YXRpb25IYW5kbGVTaGFwZShJbnZpdGF0aW9uSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIEludml0YXRpb25TaGFwZT1NLnJlbW90YWJsZSgnSW52aXRhdGlvbicpOyRo4oCNX29uY2UuSW52aXRhdGlvblNoYXBlKEludml0YXRpb25TaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VIYW5kbGVTaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFuY2VIYW5kbGUnKTskaOKAjV9vbmNlLkluc3RhbmNlSGFuZGxlU2hhcGUoSW5zdGFuY2VIYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFsbGF0aW9uU2hhcGU9TS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpOyRo4oCNX29uY2UuSW5zdGFsbGF0aW9uU2hhcGUoSW5zdGFsbGF0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIFNlYXRTaGFwZT1NLnJlbW90YWJsZSgnU2VhdCcpOyRo4oCNX29uY2UuU2VhdFNoYXBlKFNlYXRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsQW1vdW50U2hhcGUpOyRo4oCNX29uY2UuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSk7XG5jb25zdCAgICAgICAgQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKFxuS2V5d29yZFNoYXBlLFxuTS5wYXR0ZXJuKCkpOyRo4oCNX29uY2UuQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZShBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoXG5LZXl3b3JkU2hhcGUsXG5NLmVyZWYoUGF5bWVudFNoYXBlKSk7JGjigI1fb25jZS5QYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZShQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsSXNzdWVyU2hhcGUpOyRo4oCNX29uY2UuSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSk7XG5jb25zdCAgICAgICAgSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKFxuS2V5d29yZFNoYXBlLFxuTS5lcmVmKElzc3VlclNoYXBlKSk7JGjigI1fb25jZS5Jc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlKElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsQnJhbmRTaGFwZSk7JGjigI1fb25jZS5CcmFuZEtleXdvcmRSZWNvcmRTaGFwZShCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBJc3N1ZXJSZWNvcmRTaGFwZT1NLnNwbGl0UmVjb3JkKFxue1xuYnJhbmQ6QnJhbmRTaGFwZSxcbmlzc3VlcjpJc3N1ZXJTaGFwZSxcbmFzc2V0S2luZDpBc3NldEtpbmRTaGFwZX0sXG5cbntkaXNwbGF5SW5mbzpEaXNwbGF5SW5mb1NoYXBlfSk7JGjigI1fb25jZS5Jc3N1ZXJSZWNvcmRTaGFwZShJc3N1ZXJSZWNvcmRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFRlcm1zU2hhcGU9aGFyZGVuKHtcbmlzc3VlcnM6SXNzdWVyS2V5d29yZFJlY29yZFNoYXBlLFxuYnJhbmRzOkJyYW5kS2V5d29yZFJlY29yZFNoYXBlfSk7JGjigI1fb25jZS5UZXJtc1NoYXBlKFRlcm1zU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBJbnN0YW5jZVJlY29yZFNoYXBlPWhhcmRlbih7XG5pbnN0YWxsYXRpb246SW5zdGFsbGF0aW9uU2hhcGUsXG5pbnN0YW5jZTpJbnN0YW5jZUhhbmRsZVNoYXBlLFxudGVybXM6TS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKX0pOyRo4oCNX29uY2UuSW5zdGFuY2VSZWNvcmRTaGFwZShJbnN0YW5jZVJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgSGFuZGxlST1NLmludGVyZmFjZSgnSGFuZGxlJyx7fSk7JGjigI1fb25jZS5IYW5kbGVJKEhhbmRsZUkpO1xuXG5jb25zdCAgICAgICAgbWFrZUhhbmRsZVNoYXBlPShuYW1lKT0+TS5yZW1vdGFibGUoIGAke25hbWV9SGFuZGxlYCk7JGjigI1fb25jZS5tYWtlSGFuZGxlU2hhcGUobWFrZUhhbmRsZVNoYXBlKTtcbmNvbnN0ICAgICAgICBUaW1lclNoYXBlPW1ha2VIYW5kbGVTaGFwZSgndGltZXInKTtcblxuLyoqXG4gKiBBZnRlciBkZWZhdWx0cyBhcmUgZmlsbGVkIGluXG4gKlxuICogQHNlZSB7UHJvcG9zYWxSZWNvcmR9IHR5cGVcbiAqLyRo4oCNX29uY2UuVGltZXJTaGFwZShUaW1lclNoYXBlKTtcbmNvbnN0ICAgICAgICBGdWxsUHJvcG9zYWxTaGFwZT1oYXJkZW4oe1xud2FudDpBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlLFxuZ2l2ZTpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG4vKiBUbyBhY2NlcHQgb25seSBvbmUsIHdlIGNvdWxkIHVzZSBNLm9yIHJhdGhlciB0aGFuIE0uc3BsaXRSZWNvcmQsKi9cbi8qIGJ1dCB0aGUgZXJyb3IgbWVzc2FnZXMgd291bGQgaGF2ZSBiZWVuIHdvcnNlLiBSYXRoZXIsKi9cbi8qIGNsZWFuUHJvcG9zYWwncyBhc3NlcnRFeGl0IGNoZWNrcyB0aGF0IHRoZXJlJ3MgZXhhY3RseSBvbmUuKi9cbmV4aXQ6TS5zcGxpdFJlY29yZChcbnt9LFxue1xub25EZW1hbmQ6bnVsbCxcbndhaXZlZDpudWxsLFxuYWZ0ZXJEZWFkbGluZTp7XG50aW1lcjpNLmVyZWYoVGltZXJTaGFwZSksXG5kZWFkbGluZTpUaW1lc3RhbXBTaGFwZX19LFxuXG5cbnt9KX0pO1xuXG5cbi8qKiBAc2VlIHtQcm9wb3NhbH0gdHlwZSAqLyRo4oCNX29uY2UuRnVsbFByb3Bvc2FsU2hhcGUoRnVsbFByb3Bvc2FsU2hhcGUpO1xuY29uc3QgICAgICAgIFByb3Bvc2FsU2hhcGU9TS5zcGxpdFJlY29yZCh7fSxGdWxsUHJvcG9zYWxTaGFwZSx7fSk7JGjigI1fb25jZS5Qcm9wb3NhbFNoYXBlKFByb3Bvc2FsU2hhcGUpO1xuXG5jb25zdCAgICAgICAgaXNPbkRlbWFuZEV4aXRSdWxlPShleGl0KT0+e1xuY29uc3RbZXhpdEtleV09T2JqZWN0LmtleXMoZXhpdCk7XG5yZXR1cm4gZXhpdEtleT09PSdvbkRlbWFuZCc7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKiBAcmV0dXJucyB7ZXhpdCBpcyBXYWl2ZWRFeGl0UnVsZX1cbiAqLyRo4oCNX29uY2UuaXNPbkRlbWFuZEV4aXRSdWxlKGlzT25EZW1hbmRFeGl0UnVsZSk7XG5jb25zdCAgICAgICAgaXNXYWl2ZWRFeGl0UnVsZT0oZXhpdCk9PntcbmNvbnN0W2V4aXRLZXldPU9iamVjdC5rZXlzKGV4aXQpO1xucmV0dXJuIGV4aXRLZXk9PT0nd2FpdmVkJztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqIEByZXR1cm5zIHtleGl0IGlzIEFmdGVyRGVhZGxpbmVFeGl0UnVsZX1cbiAqLyRo4oCNX29uY2UuaXNXYWl2ZWRFeGl0UnVsZShpc1dhaXZlZEV4aXRSdWxlKTtcbmNvbnN0ICAgICAgICBpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZT0oZXhpdCk9PntcbmNvbnN0W2V4aXRLZXldPU9iamVjdC5rZXlzKGV4aXQpO1xucmV0dXJuIGV4aXRLZXk9PT0nYWZ0ZXJEZWFkbGluZSc7XG4gfTskaOKAjV9vbmNlLmlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKTtcblxuY29uc3QgICAgICAgIEludml0YXRpb25FbGVtZW50U2hhcGU9TS5zcGxpdFJlY29yZCh7XG5kZXNjcmlwdGlvbjpNLnN0cmluZygpLFxuaGFuZGxlOkludml0YXRpb25IYW5kbGVTaGFwZSxcbmluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGUsXG5pbnN0YWxsYXRpb246SW5zdGFsbGF0aW9uU2hhcGV9KTskaOKAjV9vbmNlLkludml0YXRpb25FbGVtZW50U2hhcGUoSW52aXRhdGlvbkVsZW1lbnRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIE9mZmVySGFuZGxlckk9TS5pbnRlcmZhY2UoJ09mZmVySGFuZGxlcicse1xuaGFuZGxlOk0uY2FsbChTZWF0U2hhcGUpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5zdHJpbmcoKSl9KTskaOKAjV9vbmNlLk9mZmVySGFuZGxlckkoT2ZmZXJIYW5kbGVySSk7XG5cblxuY29uc3QgICAgICAgIFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlPU0uYXJyYXlPZihcbmhhcmRlbih7XG5zZWF0SGFuZGxlOlNlYXRTaGFwZSxcbmFsbG9jYXRpb246QW1vdW50S2V5d29yZFJlY29yZFNoYXBlfSkpOyRo4oCNX29uY2UuU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpO1xuXG5cblxuY29uc3QgICAgICAgIFpvZU1pbnRTaGFwZT1NLnJlbW90YWJsZSgnWm9lTWludCcpOyRo4oCNX29uY2UuWm9lTWludFNoYXBlKFpvZU1pbnRTaGFwZSk7XG5jb25zdCAgICAgICAgWm9lTWludEk9TS5pbnRlcmZhY2UoJ1pvZU1pbnQnLHtcbmdldElzc3VlclJlY29yZDpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclJlY29yZFNoYXBlKSxcbm1pbnRBbmRFc2Nyb3c6TS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCksXG53aXRoZHJhd0FuZEJ1cm46TS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLlpvZU1pbnRJKFpvZU1pbnRJKTtcblxuXG5jb25zdCAgICAgICAgWmNmTWludEk9TS5pbnRlcmZhY2UoJ1pjZk1pbnQnLHtcbmdldElzc3VlclJlY29yZDpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclJlY29yZFNoYXBlKSxcbm1pbnRHYWluczpNLmNhbGwoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKS5cbm9wdGlvbmFsKE0ucmVtb3RhYmxlKCd6Y2ZTZWF0JykpLlxucmV0dXJucyhNLnJlbW90YWJsZSgnemNmU2VhdCcpKSxcbmJ1cm5Mb3NzZXM6TS5jYWxsKFxuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuTS5yZW1vdGFibGUoJ3pjZlNlYXQnKSkuXG5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLlpjZk1pbnRJKFpjZk1pbnRJKTtcblxuXG5jb25zdCAgICAgICAgRmVlTWludEFjY2Vzc1NoYXBlPU0ucmVtb3RhYmxlKCdGZWVNaW50QWNjZXNzJyk7JGjigI1fb25jZS5GZWVNaW50QWNjZXNzU2hhcGUoRmVlTWludEFjY2Vzc1NoYXBlKTtcblxuY29uc3QgICAgICAgIEV4aXRPYmplY3RJPU0uaW50ZXJmYWNlKCdFeGl0IE9iamVjdCcse1xuZXhpdDpNLmNhbGwoKS5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLkV4aXRPYmplY3RJKEV4aXRPYmplY3RJKTtcblxuXG5jb25zdCAgICAgICAgRXhpdE9iamVjdFNoYXBlPU0ucmVtb3RhYmxlKCdFeGl0T2JqJyk7JGjigI1fb25jZS5FeGl0T2JqZWN0U2hhcGUoRXhpdE9iamVjdFNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnN0YW5jZUFkbWluU2hhcGU9TS5yZW1vdGFibGUoJ0luc3RhbmNlQWRtaW4nKTskaOKAjV9vbmNlLkluc3RhbmNlQWRtaW5TaGFwZShJbnN0YW5jZUFkbWluU2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbmNlQWRtaW5JPU0uaW50ZXJmYWNlKCdJbnN0YW5jZUFkbWluJyx7XG5tYWtlSW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLE0uc3RyaW5nKCkpLlxub3B0aW9uYWwoTS5yZWNvcmQoKSxNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKEludml0YXRpb25TaGFwZSksXG5zYXZlSXNzdWVyOk0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSksS2V5d29yZFNoYXBlKS5yZXR1cm5zKFxuSXNzdWVyUmVjb3JkU2hhcGUpLFxuXG5tYWtlTm9Fc2Nyb3dTZWF0Ok0uY2FsbChcbkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcblByb3Bvc2FsU2hhcGUsXG5FeGl0T2JqZWN0U2hhcGUsXG5TZWF0U2hhcGUpLlxucmV0dXJucyhTZWF0U2hhcGUpLFxuZXhpdEFsbFNlYXRzOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsQWxsU2VhdHM6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmV4aXRTZWF0Ok0uY2FsbChTZWF0U2hhcGUsTS5hbnkoKSkucmV0dXJucygpLFxuZmFpbFNlYXQ6TS5jYWxsKFNlYXRTaGFwZSxNLmFueSgpKS5yZXR1cm5zKCksXG5tYWtlWm9lTWludDpNLmNhbGwoS2V5d29yZFNoYXBlKS5cbm9wdGlvbmFsKFxuQXNzZXRLaW5kU2hhcGUsXG5EaXNwbGF5SW5mb1NoYXBlLFxuTS5zcGxpdFJlY29yZChoYXJkZW4oe30pLGhhcmRlbih7ZWxlbWVudFNoYXBlOk0ucGF0dGVybigpfSkpKS5cblxucmV0dXJucyhNLnJlbW90YWJsZSgnem9lTWludCcpKSxcbnJlZ2lzdGVyRmVlTWludDpNLmNhbGwoS2V5d29yZFNoYXBlLEZlZU1pbnRBY2Nlc3NTaGFwZSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdmZWVNaW50JykpLFxuXG5yZXBsYWNlQWxsb2NhdGlvbnM6TS5jYWxsKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKS5yZXR1cm5zKCksXG5zdG9wQWNjZXB0aW5nT2ZmZXJzOk0uY2FsbCgpLnJldHVybnMoKSxcbnNldE9mZmVyRmlsdGVyOk0uY2FsbChNLmFycmF5T2YoTS5zdHJpbmcoKSkpLnJldHVybnMoKSxcbmdldE9mZmVyRmlsdGVyOk0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbmdldEV4aXRTdWJzY3JpYmVyOk0uY2FsbChTZWF0U2hhcGUpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbmlzQmxvY2tlZDpNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLmJvb2xlYW4oKSl9KTskaOKAjV9vbmNlLkluc3RhbmNlQWRtaW5JKEluc3RhbmNlQWRtaW5JKTtcblxuXG5jb25zdCAgICAgICAgSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQ9aGFyZGVuKHtcbmluc3RhbmNlU3RvcmFnZU1hbmFnZXI6TS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXInLHtcbmdldFRlcm1zOk0uY2FsbCgpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG5nZXRJc3N1ZXJzOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEJyYW5kczpNLmNhbGwoKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEluc3RhbGxhdGlvbjpNLmNhbGwoKS5yZXR1cm5zKEluc3RhbGxhdGlvblNoYXBlKSxcbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5cbnNhdmVJc3N1ZXI6TS5jYWxsKElzc3VlclNoYXBlLEtleXdvcmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG5tYWtlWm9lTWludDpNLmNhbGwoS2V5d29yZFNoYXBlKS5cbm9wdGlvbmFsKFxuQXNzZXRLaW5kU2hhcGUsXG5EaXNwbGF5SW5mb1NoYXBlLFxuTS5zcGxpdFJlY29yZChoYXJkZW4oe30pLGhhcmRlbih7ZWxlbWVudFNoYXBlOk0ucGF0dGVybigpfSkpKS5cblxucmV0dXJucyhNLmVyZWYoWm9lTWludFNoYXBlKSksXG5yZWdpc3RlckZlZU1pbnQ6TS5jYWxsKEtleXdvcmRTaGFwZSxGZWVNaW50QWNjZXNzU2hhcGUpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnZmVlTWludCcpKSxcblxuZ2V0SW5zdGFuY2VSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZVJlY29yZFNoYXBlKSxcbmdldElzc3VlclJlY29yZHM6TS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoSXNzdWVyUmVjb3JkU2hhcGUpKSxcbmdldFdpdGhkcmF3RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnV2l0aGRyYXdGYWNldCcpKSxcbmluaXRJbnN0YW5jZUFkbWluOk0uY2FsbChcbkluc3RhbmNlSGFuZGxlU2hhcGUsXG5NLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxuZGVsZXRlSW5zdGFuY2VBZG1pbjpNLmNhbGwoSW5zdGFuY2VBZG1pbkkpLnJldHVybnMoKSxcbm1ha2VJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnJlY29yZCgpLE0ucGF0dGVybigpKS5cbnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmdldFJvb3Q6TS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSxcbmdldEFkbWluTm9kZTpNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdhZG1pbk5vZGUnKSl9KSxcblxud2l0aGRyYXdGYWNldDpNLmludGVyZmFjZSgnV2l0aGRyYXdGYWNldCcse1xud2l0aGRyYXdQYXltZW50czpNLmNhbGwoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKS5yZXR1cm5zKFxuUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpfSksXG5cblxuaGVscGVyczpNLmludGVyZmFjZSgnSW5zdGFuY2VTdG9yYWdlTWFuYWdlciBoZWxwZXInLHtcbndyYXBJc3N1ZXJLaXRXaXRoWm9lTWludDpNLmNhbGwoXG5LZXl3b3JkU2hhcGUsXG5Jc3N1ZXJLaXRTaGFwZSxcbk0ucmVtb3RhYmxlKCdhZG1pbk5vZGUnKSkuXG5yZXR1cm5zKFpvZU1pbnRTaGFwZSl9KX0pOyRo4oCNX29uY2UuSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQoSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuXG5cblxuY29uc3QgICAgICAgIEJ1bmRsZUNhcFNoYXBlPU0ucmVtb3RhYmxlKCdidW5kbGVDYXAnKTskaOKAjV9vbmNlLkJ1bmRsZUNhcFNoYXBlKEJ1bmRsZUNhcFNoYXBlKTtcbmNvbnN0ICAgICAgICBCdW5kbGVTaGFwZT1NLmFuZChcbk0uc3BsaXRSZWNvcmQoe21vZHVsZUZvcm1hdDpNLmFueSgpfSksXG5NLnJlY29yZE9mKE0uc3RyaW5nKCksTS5zdHJpbmcoe3N0cmluZ0xlbmd0aExpbWl0OkluZmluaXR5fSkpKTskaOKAjV9vbmNlLkJ1bmRsZVNoYXBlKEJ1bmRsZVNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGU9TS5zcGxpdFJlY29yZChcbmhhcmRlbih7XG5pbnN0YWxsYXRpb246SW5zdGFsbGF0aW9uU2hhcGV9KSxcblxuaGFyZGVuKHtcbmJ1bmRsZTpNLnJlY29yZE9mKE0uc3RyaW5nKCksTS5zdHJpbmcoe3N0cmluZ0xlbmd0aExpbWl0OkluZmluaXR5fSkpLFxuYnVuZGxlQ2FwOkJ1bmRsZUNhcFNoYXBlLFxuYnVuZGxlSUQ6TS5zdHJpbmcoKX0pLFxuXG5oYXJkZW4oe30pKTskaOKAjV9vbmNlLlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlKFVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgWm9lU3RvcmFnZU1hbmFnZXJJS2l0PWhhcmRlbih7XG56b2VTZXJ2aWNlRGF0YUFjY2VzczpNLmludGVyZmFjZSgnWm9lU2VydmljZSBkYXRhQWNjZXNzJyx7XG5nZXRUZXJtczpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpKSxcbmdldElzc3VlcnM6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEJyYW5kczpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG5nZXRJbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSksXG5cbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5cbmdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjpNLmNhbGwoSW5zdGFsbGF0aW9uU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5zdHJpbmcoKSkpLFxuXG5pbnN0YWxsQnVuZGxlOk0uY2FsbChNLm9yKEluc3RhbmNlSGFuZGxlU2hhcGUsQnVuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5wcm9taXNlKCkpLFxuXG5pbnN0YWxsQnVuZGxlSUQ6TS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuXG5nZXRQdWJsaWNGYWNldDpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbk0uZXJlZihNLnJlbW90YWJsZSgnUHVibGljRmFjZXQnKSkpLFxuXG5nZXRPZmZlckZpbHRlcjpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ub3B0KE0ucGF0dGVybigpKSl9KSxcblxuXG5tYWtlT2ZmZXJBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgbWFrZU9mZmVyIGFjY2Vzcycse1xuZ2V0QXNzZXRLaW5kQnlCcmFuZDpNLmNhbGwoQnJhbmRTaGFwZSkucmV0dXJucyhBc3NldEtpbmRTaGFwZSksXG5nZXRJbnN0YW5jZUFkbWluOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKSksXG5cbmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLm9wdChNLnBhdHRlcm4oKSkpLFxuXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuZGVwb3NpdFBheW1lbnRzOk0uY2FsbChQcm9wb3NhbFNoYXBlLFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKS5yZXR1cm5zKFxuTS5wcm9taXNlKCkpfSksXG5cblxuc3RhcnRJbnN0YW5jZUFjY2VzczpNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBzdGFydEluc3RhbmNlIGFjY2Vzcycse1xubWFrZVpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXI6TS5jYWxsKFxuTS5hbnkoKSxcbkluc3RhbGxhdGlvblNoYXBlLFxuTS5hbnkoKSxcbklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUsXG5NLm9yKEluc3RhbmNlSGFuZGxlU2hhcGUsQnVuZGxlU2hhcGUpLFxuTS5vcihCdW5kbGVDYXBTaGFwZSxCdW5kbGVTaGFwZSkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG51bndyYXBJbnN0YWxsYXRpb246TS5jYWxsV2hlbihNLmVyZWYoSW5zdGFsbGF0aW9uU2hhcGUpKS5yZXR1cm5zKFxuVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUpfSksXG5cblxuaW52aXRhdGlvbklzc3VlckFjY2VzczpNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBpbnZpdGF0aW9uSXNzdWVyJyx7XG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpfSl9KTskaOKAjV9vbmNlLlpvZVN0b3JhZ2VNYW5hZ2VySUtpdChab2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuXG5cblxuY29uc3QgICAgICAgIFpvZVNlcnZpY2VJPU0uaW50ZXJmYWNlKCdab2VTZXJ2aWNlJyx7XG5pbnN0YWxsOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmluc3RhbGxCdW5kbGVJRDpNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5zdGFydEluc3RhbmNlOk0uY2FsbChNLmVyZWYoSW5zdGFsbGF0aW9uU2hhcGUpKS5cbm9wdGlvbmFsKElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUsTS5hbnkoKSxNLmFueSgpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxub2ZmZXI6TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5cbm9wdGlvbmFsKFByb3Bvc2FsU2hhcGUsUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUsTS5hbnkoKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblxuZ2V0T2ZmZXJGaWx0ZXI6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcblxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEZlZUlzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEJyYW5kczpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5CcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG5cbmdldElzc3VlcnM6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcblxuZ2V0UHVibGljRmFjZXQ6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JykpLFxuXG5nZXRUZXJtczpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG5nZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZTpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5NLmVyZWYoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSksXG5cbmdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjpNLmNhbGwoSW5zdGFsbGF0aW9uU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5zdHJpbmcoKSkpLFxuXG5cbmdldEluc3RhbGxhdGlvbjpNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0SW5zdGFuY2U6TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldENvbmZpZ3VyYXRpb246TS5jYWxsKCkucmV0dXJucyh7XG5mZWVJc3N1ZXJDb25maWc6e1xubmFtZTpNLnN0cmluZygpLFxuYXNzZXRLaW5kOiduYXQnLFxuZGlzcGxheUluZm86RGlzcGxheUluZm9TaGFwZX19KSxcblxuXG5nZXRJbnZpdGF0aW9uRGV0YWlsczpNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG5nZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5vcHQoUHJvcG9zYWxTaGFwZSkpfSk7JGjigI1fb25jZS5ab2VTZXJ2aWNlSShab2VTZXJ2aWNlSSk7XG5cblxuXG5jb25zdCAgICAgICAgQWRtaW5GYWNldEk9TS5pbnRlcmZhY2UoJ1pjZkFkbWluRmFjZXQnLHtcbmdldFZhdFNodXRkb3duUHJvbWlzZTpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnJlc3RhcnRDb250cmFjdDpNLmNhbGwoKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnVwZ3JhZGVDb250cmFjdDpNLmNhbGwoTS5zdHJpbmcoKSkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSl9KTskaOKAjV9vbmNlLkFkbWluRmFjZXRJKEFkbWluRmFjZXRJKTtcblxuXG5jb25zdCAgICAgICAgU2VhdERhdGFTaGFwZT1NLnNwbGl0UmVjb3JkKFxue1xucHJvcG9zYWw6UHJvcG9zYWxTaGFwZSxcbmluaXRpYWxBbGxvY2F0aW9uOkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbnNlYXRIYW5kbGU6U2VhdFNoYXBlfSxcblxue1xub2ZmZXJBcmdzOk0uYW55KCl9KTskaOKAjV9vbmNlLlNlYXREYXRhU2hhcGUoU2VhdERhdGFTaGFwZSk7XG5cblxuXG5jb25zdCAgICAgICAgSGFuZGxlT2ZmZXJJPU0uaW50ZXJmYWNlKCdIYW5kbGVPZmZlcicse1xuaGFuZGxlT2ZmZXI6TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSxTZWF0RGF0YVNoYXBlKS5yZXR1cm5zKHtcbm9mZmVyUmVzdWx0UHJvbWlzZTpNLnByb21pc2UoKSxcbmV4aXRPYmo6RXhpdE9iamVjdFNoYXBlfSl9KTskaOKAjV9vbmNlLkhhbmRsZU9mZmVySShIYW5kbGVPZmZlckkpO1xuXG5cblxuY29uc3QgICAgICAgIFByaWNlUXVvdGVTaGFwZT1oYXJkZW4oe1xucXVvdGVBbW91bnQ6QW1vdW50U2hhcGUsXG5xdW90ZVBheW1lbnQ6TS5lcmVmKFBheW1lbnRTaGFwZSl9KTskaOKAjV9vbmNlLlByaWNlUXVvdGVTaGFwZShQcmljZVF1b3RlU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IktleXdvcmRTaGFwZSI6WyJLZXl3b3JkU2hhcGUiXSwiSW52aXRhdGlvbkhhbmRsZVNoYXBlIjpbIkludml0YXRpb25IYW5kbGVTaGFwZSJdLCJJbnZpdGF0aW9uU2hhcGUiOlsiSW52aXRhdGlvblNoYXBlIl0sIkluc3RhbmNlSGFuZGxlU2hhcGUiOlsiSW5zdGFuY2VIYW5kbGVTaGFwZSJdLCJJbnN0YWxsYXRpb25TaGFwZSI6WyJJbnN0YWxsYXRpb25TaGFwZSJdLCJTZWF0U2hhcGUiOlsiU2VhdFNoYXBlIl0sIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSI6WyJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiXSwiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSI6WyJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIl0sIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIjpbIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSI6WyJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSI6WyJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIl0sIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIjpbIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclJlY29yZFNoYXBlIjpbIklzc3VlclJlY29yZFNoYXBlIl0sIlRlcm1zU2hhcGUiOlsiVGVybXNTaGFwZSJdLCJJbnN0YW5jZVJlY29yZFNoYXBlIjpbIkluc3RhbmNlUmVjb3JkU2hhcGUiXSwiSGFuZGxlSSI6WyJIYW5kbGVJIl0sIm1ha2VIYW5kbGVTaGFwZSI6WyJtYWtlSGFuZGxlU2hhcGUiXSwiVGltZXJTaGFwZSI6WyJUaW1lclNoYXBlIl0sIkZ1bGxQcm9wb3NhbFNoYXBlIjpbIkZ1bGxQcm9wb3NhbFNoYXBlIl0sIlByb3Bvc2FsU2hhcGUiOlsiUHJvcG9zYWxTaGFwZSJdLCJpc09uRGVtYW5kRXhpdFJ1bGUiOlsiaXNPbkRlbWFuZEV4aXRSdWxlIl0sImlzV2FpdmVkRXhpdFJ1bGUiOlsiaXNXYWl2ZWRFeGl0UnVsZSJdLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSI6WyJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSJdLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIjpbIkludml0YXRpb25FbGVtZW50U2hhcGUiXSwiT2ZmZXJIYW5kbGVySSI6WyJPZmZlckhhbmRsZXJJIl0sIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIjpbIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIl0sIlpvZU1pbnRTaGFwZSI6WyJab2VNaW50U2hhcGUiXSwiWm9lTWludEkiOlsiWm9lTWludEkiXSwiWmNmTWludEkiOlsiWmNmTWludEkiXSwiRmVlTWludEFjY2Vzc1NoYXBlIjpbIkZlZU1pbnRBY2Nlc3NTaGFwZSJdLCJFeGl0T2JqZWN0SSI6WyJFeGl0T2JqZWN0SSJdLCJFeGl0T2JqZWN0U2hhcGUiOlsiRXhpdE9iamVjdFNoYXBlIl0sIkluc3RhbmNlQWRtaW5TaGFwZSI6WyJJbnN0YW5jZUFkbWluU2hhcGUiXSwiSW5zdGFuY2VBZG1pbkkiOlsiSW5zdGFuY2VBZG1pbkkiXSwiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiXSwiQnVuZGxlQ2FwU2hhcGUiOlsiQnVuZGxlQ2FwU2hhcGUiXSwiQnVuZGxlU2hhcGUiOlsiQnVuZGxlU2hhcGUiXSwiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiOlsiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiXSwiWm9lU3RvcmFnZU1hbmFnZXJJS2l0IjpbIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJab2VTZXJ2aWNlSSI6WyJab2VTZXJ2aWNlSSJdLCJBZG1pbkZhY2V0SSI6WyJBZG1pbkZhY2V0SSJdLCJTZWF0RGF0YVNoYXBlIjpbIlNlYXREYXRhU2hhcGUiXSwiSGFuZGxlT2ZmZXJJIjpbIkhhbmRsZU9mZmVySSJdLCJQcmljZVF1b3RlU2hhcGUiOlsiUHJpY2VRdW90ZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALfCvHviBgAA4gYAAB8AAABAYWdvcmljL3pvbmUtdjAuMi4xL3NyYy9oZWFwLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJNIiwiaGVhcFpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUV4byxkZWZpbmVFeG9DbGFzcyxkZWZpbmVFeG9DbGFzc0tpdCxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhclNldFN0b3JlLG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxNLEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlRXhvXCIsIFskaOKAjV9hID0+IChtYWtlRXhvID0gJGjigI1fYSldXSxbXCJkZWZpbmVFeG9DbGFzc1wiLCBbJGjigI1fYSA9PiAoZGVmaW5lRXhvQ2xhc3MgPSAkaOKAjV9hKV1dLFtcImRlZmluZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChkZWZpbmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcIm1ha2VTY2FsYXJTZXRTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhclNldFN0b3JlID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyV2Vha1NldFN0b3JlID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSksJGjigI1fbGl2ZVtcIk1cIl1dXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0eXBlIHtYaW1wb3J0KCcuJykuU3RvcmVzfVxuICovXG5jb25zdCBoZWFwU3RvcmVzPUZhcignaGVhcFN0b3Jlcycse1xuZGV0YWNoZWQ6KCk9PmhlYXBTdG9yZXMsXG5pc1N0b3JhYmxlOihfc3BlY2ltZW4pPT50cnVlLFxuXG5zZXRTdG9yZTptYWtlU2NhbGFyU2V0U3RvcmUsXG5tYXBTdG9yZTptYWtlU2NhbGFyTWFwU3RvcmUsXG53ZWFrTWFwU3RvcmU6bWFrZVNjYWxhcldlYWtNYXBTdG9yZSxcbndlYWtTZXRTdG9yZTptYWtlU2NhbGFyV2Vha1NldFN0b3JlfSk7XG5cblxuLyoqXG4gKiBBIGhlYXAgKGluLW1lbW9yeSkgem9uZSB0aGF0IHVzZXMgdGhlIGRlZmF1bHQgZXhvIGFuZCBzdG9yZSBpbXBsZW1lbnRhdGlvbnMuXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4nKS5ab25lfVxuICovXG5jb25zdCAgICAgICAgaGVhcFpvbmU9RmFyKCdoZWFwWm9uZScse1xuZXhvQ2xhc3M6ZGVmaW5lRXhvQ2xhc3MsXG5leG9DbGFzc0tpdDpkZWZpbmVFeG9DbGFzc0tpdCxcbmV4bzptYWtlRXhvLFxuc3ViWm9uZTooX2xhYmVsLF9vcHRpb25zKT0+aGVhcFpvbmUsXG4uLi5oZWFwU3RvcmVzfSk7JGjigI1fb25jZS5oZWFwWm9uZShoZWFwWm9uZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiTSI6WyJNIixmYWxzZV19LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGVhcFpvbmUiOlsiaGVhcFpvbmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2PQZMI8JAACPCQAAIAAAAEBhZ29yaWMvem9uZS12MC4yLjEvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vaGVhcC5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2hlYXAuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUV4byxkZWZpbmVFeG9DbGFzcyxkZWZpbmVFeG9DbGFzc0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlRXhvXCIsIFskaOKAjV9hID0+IChtYWtlRXhvID0gJGjigI1fYSldXSxbXCJkZWZpbmVFeG9DbGFzc1wiLCBbJGjigI1fYSA9PiAoZGVmaW5lRXhvQ2xhc3MgPSAkaOKAjV9hKV1dLFtcImRlZmluZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChkZWZpbmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlYXAuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuLyogUmVmZXJlbmNlcyB0byBhbGxvdyB0aGUgYmVsb3cgdHlwZW9mcyB0byBzdWNjZWVkLiovXG5tYWtlRXhvO1xuZGVmaW5lRXhvQ2xhc3M7XG5kZWZpbmVFeG9DbGFzc0tpdDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7RXhvWm9uZSAmIFN0b3Jlc30gWm9uZSBBIGJhZyBvZiBtZXRob2RzIGZvciBjcmVhdGluZyBkZWZlbnNpYmxlIG9iamVjdHMgYW5kXG4gKiBjb2xsZWN0aW9ucyB3aXRoIHRoZSBzYW1lIGFsbG9jYXRpb24gc2VtYW50aWNzIChlcGhlbWVyYWwsIHBlcnNpc3RlbnQsIGV0YylcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEV4b1pvbmVcbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIG1ha2VFeG99IGV4byBjcmVhdGUgYSBzaW5nbGV0b24gZXhvLW9iamVjdCBpbnN0YW5jZSBib3VuZCB0byB0aGlzIHpvbmVcbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGRlZmluZUV4b0NsYXNzfSBleG9DbGFzcyBjcmVhdGUgYSBtYWtlciBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBleG8tb2JqZWN0cyBib3VuZCB0byB0aGlzIHpvbmVcbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGRlZmluZUV4b0NsYXNzS2l0fSBleG9DbGFzc0tpdCBjcmVhdGUgYSBcImtpdFwiIG1ha2VyIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgcmVjb3JkIG9mIGV4by1vYmplY3RzIHNoYXJpbmcgdGhlIHNhbWUgc3RhdGVcbiAqIEBwcm9wZXJ0eSB7KGxhYmVsOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yZU9wdGlvbnMpID0+IFpvbmV9IHN1YlpvbmUgY3JlYXRlIGEgbmV3IFpvbmUgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHVudHJ1c3RlZCBjb25zdW1lcnMgd2l0aG91dCBleHBvc2luZyB0aGUgc3RvcmFnZSBvZiB0aGUgcGFyZW50IHpvbmVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3Jlc1xuICogQHByb3BlcnR5IHsoKSA9PiBTdG9yZXN9IGRldGFjaGVkIG9idGFpbiBzdG9yZSBwcm92aWRlcnMgd2hpY2ggYXJlIGRldGFjaGVkICh0aGUgc3RvcmVzIGFyZSBhbm9ueW1vdXMgcmF0aGVyIHRoYW4gYm91bmQgdG8gYGxhYmVsYCBpbiB0aGUgem9uZSlcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiB1bmtub3duKSA9PiBib29sZWFufSBpc1N0b3JhYmxlIHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaW1lbiBjYW4gYmUgc3RvcmVkIGluIHRoZSB6b25lLCB3aGV0aGVyIGFzIGV4by1vYmplY3Qgc3RhdGUgb3IgaW4gYSBzdG9yZVxuICogQHByb3BlcnR5IHs8SyxWPihsYWJlbDogc3RyaW5nLCBvcHRpb25zPzogU3RvcmVPcHRpb25zKSA9PiBNYXBTdG9yZTxLLCBWPn0gbWFwU3RvcmUgcHJvdmlkZSBhIE1hcC1saWtlIHN0b3JlIG5hbWVkIGBsYWJlbGAgaW4gdGhlIHpvbmVcbiAqIEBwcm9wZXJ0eSB7PEs+KGxhYmVsOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yZU9wdGlvbnMpID0+IFNldFN0b3JlPEs+fSBzZXRTdG9yZSBwcm92aWRlIGEgU2V0LWxpa2Ugc3RvcmUgbmFtZWQgYGxhYmVsYCBpbiB0aGUgem9uZVxuICogQHByb3BlcnR5IHs8SyxWPihcbiAqICAgbGFiZWw6IHN0cmluZywgb3B0aW9ucz86IFN0b3JlT3B0aW9ucykgPT4gV2Vha01hcFN0b3JlPEssIFY+XG4gKiB9IHdlYWtNYXBTdG9yZSBwcm92aWRlIGEgV2Vha01hcC1saWtlIHN0b3JlIG5hbWVkIGBsYWJlbGAgaW4gdGhlIHpvbmVcbiAqIEBwcm9wZXJ0eSB7PEs+KFxuICogICBsYWJlbDogc3RyaW5nLCBvcHRpb25zPzogU3RvcmVPcHRpb25zKSA9PiBXZWFrU2V0U3RvcmU8Sz5cbiAqIH0gd2Vha1NldFN0b3JlIHByb3ZpZGUgYSBXZWFrU2V0LWxpa2Ugc3RvcmUgbmFtZWQgYGxhYmVsYCBpbiB0aGUgem9uZVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH4kbi3SEQAA0hEAACQAAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIvc3JjL0UuanN7ImltcG9ydHMiOlsiLi90cmFjay10dXJucy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgdHJhY2tUdXJuczskaOKAjV9pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsIFskaOKAjV9hID0+ICh0cmFja1R1cm5zID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtQcm94eUhhbmRsZXI8YW55Pn0gKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXI9e1xuc2V0KF90YXJnZXQsX3Byb3AsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuaXNFeHRlbnNpYmxlKF90YXJnZXQpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5zZXRQcm90b3R5cGVPZihfdGFyZ2V0LF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmRlbGV0ZVByb3BlcnR5KF90YXJnZXQsX3Byb3Ape1xucmV0dXJuIGZhbHNlO1xuIH19O1xuXG5cbi8qIEUgUHJveHkgaGFuZGxlcnMgcHJldGVuZCB0aGF0IGFueSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIHRhcmdldCBhbmQgcmV0dXJucyovXG4vKiBhIGZ1bmN0aW9uIGZvciB0aGVpciB2YWx1ZS4gV2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBcImJvdW5kXCIgYnkgY29udGV4dCwgaXQgaXMqL1xuLyogbWVhbnQgdG8gYmUgY2FsbGVkIGFzIGEgbWV0aG9kLiBGb3IgdGhhdCByZWFzb24sIHRoZSByZXR1cm5lZCBmdW5jdGlvbiovXG4vKiBpbmNsdWRlcyBhIGNoZWNrIHRoYXQgdGhlIGB0aGlzYCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCovXG4vKiByZWNlaXZlciB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmV0cmlldmVkLiovXG4vKiBFIFByb3h5IGhhbmRsZXJzIGFsc28gZm9yd2FyZCBkaXJlY3QgY2FsbHMgdG8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSByZW1vdGUqL1xuLyogaXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFuIG9iamVjdC4gTm8gc3VjaCByZWNlaXZlciBjaGVja3MgYXJlIG5lY2Vzc2FyeSBpbiovXG4vKiB0aGF0IGNhc2UuKi9cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUoeCkuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSl7XG5yZXR1cm4gaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQoX3RhcmdldCxwLHJlY2VpdmVyKXtcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbmlmKHRoaXMhPT1yZWNlaXZlcil7XG4vKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbmFzc2VydC5lcnJvcihcblggYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtwfVwiIG1ldGhvZCBvZiBFKCR7cSh4KX0pYCkpO1xuXG5cbiB9XG5cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZCh4LHAsYXJncyk7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnQXJyYXk9W10pe1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24oeCxhcmdBcnJheSk7XG4gfSxcbmhhcyhfdGFyZ2V0LF9wKXtcbi8qIFdlIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVzZW5kT25seVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKXtcbnJldHVybiBoYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldChfdGFyZ2V0LHAscmVjZWl2ZXIpe1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3BdKC4uLmFyZ3Mpe1xuLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG50aGlzPT09cmVjZWl2ZXJ8fFxuRmFpbCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocCl9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKFxueClcbiB9KWA7XG5IYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHgscCxhcmdzKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKXtcbkhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seSh4LGFyZ3NBcnJheSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0sXG5oYXMoX3RhcmdldCxfcCl7XG4vKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9pbmRleCcpLkVQcm94eX1cbiAqL1xuZnVuY3Rpb24gICAgICAgICAgICAgICAgbWFrZUUoSGFuZGxlZFByb21pc2Upe1xuZnVuY3Rpb24gRSh4KXtcbmNvbnN0IGhhbmRsZXI9RVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKTtcbnJldHVybiBoYXJkZW4obmV3IFByb3h5KCgpPT57IH0saGFuZGxlcikpO1xuIH1cblxuY29uc3QgbWFrZUVHZXR0ZXJQcm94eT0oeCk9PlxubmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCkse1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhcyhfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiB0cnVlO1xuIH0sXG5nZXQoX3RhcmdldCxwcm9wKXtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5nZXQoeCxwcm9wKTtcbiB9fSk7XG5cblxuRS5nZXQ9bWFrZUVHZXR0ZXJQcm94eTtcbkUucmVzb2x2ZT1IYW5kbGVkUHJvbWlzZS5yZXNvbHZlO1xuRS5zZW5kT25seT0oeCk9PntcbmNvbnN0IGhhbmRsZXI9RXNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpO1xucmV0dXJuIGhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxoYW5kbGVyKSk7XG4gfTtcblxuRS53aGVuPSh4LG9uZnVsZmlsbGVkLG9ucmVqZWN0ZWQpPT57XG5jb25zdFtvbnN1Y2Nlc3Msb25mYWlsdXJlXT10cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSk7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKG9uc3VjY2VzcyxvbmZhaWx1cmUpO1xuIH07XG5cbnJldHVybiBoYXJkZW4oRSk7XG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIG1ha2VFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANwvtTx8CAAAfAgAAKgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoSGFuZGxlZFByb21pc2UpOyRo4oCNX29uY2UuRShFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoVgjP48QAACPEAAALgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQHRzLW5vY2hlY2sqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyogTk9URTogV2UgY2FuJ3QgaW1wb3J0IHRoZXNlIGJlY2F1c2UgdGhleSdyZSBub3QgaW4gc2NvcGUgYmVmb3JlIGxvY2tkb3duLiovXG4vKiBpbXBvcnQgeyBhc3NlcnQsIGRldGFpbHMgYXMgWCwgRmFpbCB9IGZyb20gJ0BhZ29yaWMvYXNzZXJ0JzsqL1xuXG4vKiBXQVJOSU5HOiBHbG9iYWwgTXV0YWJsZSBTdGF0ZSEqL1xuLyogVGhpcyBzdGF0ZSBpcyBjb21tdW5pY2F0ZWQgdG8gYGFzc2VydGAgdGhhdCBtYWtlcyBpdCBhdmFpbGFibGUgdG8gdGhlKi9cbi8qIGNhdXNhbCBjb25zb2xlLCB3aGljaCBhZmZlY3RzIHRoZSBjb25zb2xlIGxvZyBvdXRwdXQuIE5vcm1hbGx5IHdlKi9cbi8qIHJlZ2FyZCB0aGUgYWJpbGl0eSB0byBzZWUgY29uc29sZSBsb2cgb3V0cHV0IGFzIGEgbWV0YS1sZXZlbCBwcml2aWxlZ2UqL1xuLyogYW5hbG9nb3VzIHRvIHRoZSBhYmlsaXR5IHRvIGRlYnVnLiBBc2lkZSBmcm9tIHRoYXQsIHRoaXMgbW9kdWxlIHNob3VsZCovXG4vKiBub3QgaGF2ZSBhbnkgb2JzZXJ2YWJseSBtdXRhYmxlIHN0YXRlLiovXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuPTA7XG5sZXQgaGlkZGVuQ3VycmVudEV2ZW50PTA7XG5cbi8qIFRPRE8gVXNlIGVudmlyb25tZW50LW9wdGlvbnMuanMgY3VycmVudGx5IGluIHNlcy9zcmMgYWZ0ZXIgZmFjdG9yaW5nIGl0IG91dCovXG4vKiB0byBhIG5ldyBwYWNrYWdlLiovXG5jb25zdCBlbnY9KGdsb2JhbFRoaXMucHJvY2Vzc3x8e30pLmVudnx8e307XG5cbi8qIFR1cm4gb24gaWYgeW91IHNlZW0gdG8gYmUgbG9zaW5nIGVycm9yIGxvZ2dpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbG9vcCovXG5jb25zdCBWRVJCT1NFPShlbnYuREVCVUd8fCcnKS5zcGxpdCgnOicpLmluY2x1ZGVzKCd0cmFjay10dXJucycpO1xuXG5jb25zdCB2YWxpZE9wdGlvblZhbHVlcz1mcmVlemUoW3VuZGVmaW5lZCwnZW5hYmxlZCcsJ2Rpc2FibGVkJ10pO1xuXG4vKiBUcmFjay10dXJucyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBkaXNhYmxlZCBieSBhbiBlbnZpcm9ubWVudCovXG4vKiBvcHRpb24uKi9cbmNvbnN0IGVudk9wdGlvblZhbHVlPWVudi5UUkFDS19UVVJOUztcbmlmKCF2YWxpZE9wdGlvblZhbHVlcy5pbmNsdWRlcyhlbnZPcHRpb25WYWx1ZSkpe1xudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgdW5yZWNvZ25pemVkIFRSQUNLX1RVUk5TICR7SlNPTi5zdHJpbmdpZnkoZW52T3B0aW9uVmFsdWUpfWApO1xuXG4gfVxuY29uc3QgRU5BQkxFRD0oZW52T3B0aW9uVmFsdWV8fCdkaXNhYmxlZCcpPT09J2VuYWJsZWQnO1xuXG4vKiBXZSBob2lzdCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBvdXQgb2YgdHJhY2tUdXJucygpIHRvIGRpc2NvdXJhZ2UgdGhlKi9cbi8qIGNsb3N1cmVzIGZyb20gaG9sZGluZyBvbnRvICdhcmdzJyBvciAnZnVuYycgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LCovXG4vKiB3aGljaCB3ZSd2ZSBzZWVuIGNhdXNlIEhhbmRsZWRQcm9taXNlIGFyZ3VtZW50cyB0byBiZSByZXRhaW5lZCBmb3IqL1xuLyogYSBzdXJwcmlzaW5nbHkgbG9uZyB0aW1lLiovXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGU9KGRldGFpbHNOb3RlKT0+KHJlYXNvbik9PntcbmlmKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKHJlYXNvbixkZXRhaWxzTm90ZSk7XG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLHJlYXNvbik7XG4gfVxuIH07XG5cbmNvbnN0IHdyYXBGdW5jdGlvbj1cbihmdW5jLHNlbmRpbmdFcnJvcixYKT0+XG4oLi4uYXJncyk9PntcbmhpZGRlblByaW9yRXJyb3I9c2VuZGluZ0Vycm9yO1xuaGlkZGVuQ3VycmVudFR1cm4rPTE7XG5oaWRkZW5DdXJyZW50RXZlbnQ9MDtcbnRyeXtcbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbmlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLGVycik7XG4gfVxudGhyb3cgZXJyO1xuIH1cbi8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG5jb25zdCBkZXRhaWxzTm90ZT1YIGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xucmV0dXJuIHJlc3VsdDtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9bmV3IEVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuIGZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSk7XG4gfTskaOKAjV9vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADpSrU0cAgAAHAIAABkAAABAZW5kby9leG8tdjAuMi4yL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2V4by1tYWtlcnMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZXhvLW1ha2Vycy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9leG8tbWFrZXJzLmpzIjpbWyJpbml0RW1wdHkiLCJpbml0RW1wdHkiXSxbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiXSxbImRlZmluZUV4b0NsYXNzS2l0IiwiZGVmaW5lRXhvQ2xhc3NLaXQiXSxbIm1ha2VFeG8iLCJtYWtlRXhvIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADGt+tWYxgAAGMYAAAiAAAAQGVuZG8vZXhvLXYwLjIuMi9zcmMvZXhvLW1ha2Vycy5qc3siaW1wb3J0cyI6WyIuL2V4by10b29scy5qcyIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzc0tpdCIsImluaXRFbXB0eSIsIm1ha2VFeG8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgb2JqZWN0TWFwLGRlZmVuZFByb3RvdHlwZSxkZWZlbmRQcm90b3R5cGVLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm9iamVjdE1hcFwiLCBbJGjigI1fYSA9PiAob2JqZWN0TWFwID0gJGjigI1fYSldXV1dLFtcIi4vZXhvLXRvb2xzLmpzXCIsIFtbXCJkZWZlbmRQcm90b3R5cGVcIiwgWyRo4oCNX2EgPT4gKGRlZmVuZFByb3RvdHlwZSA9ICRo4oCNX2EpXV0sW1wiZGVmZW5kUHJvdG90eXBlS2l0XCIsIFskaOKAjV9hID0+IChkZWZlbmRQcm90b3R5cGVLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtjcmVhdGUsc2VhbCxmcmVlemUsZGVmaW5lUHJvcGVydHl9PU9iamVjdDtcblxuLyogVE9ETyBVc2UgZW52aXJvbm1lbnQtb3B0aW9ucy5qcyBjdXJyZW50bHkgaW4gc2VzL3NyYyBhZnRlciBmYWN0b3JpbmcgaXQgb3V0Ki9cbi8qIHRvIGEgbmV3IHBhY2thZ2UuKi9cbmNvbnN0IGVudj0oZ2xvYmFsVGhpcy5wcm9jZXNzfHx7fSkuZW52fHx7fTtcblxuLyogVHVybiBvbiB0byBnaXZlIGVhY2ggZXhvIGluc3RhbmNlIGl0cyBvd24gdG9TdHJpbmdUYWcgdmFsdWUuKi9cbmNvbnN0IExBQkVMX0lOU1RBTkNFUz0oZW52LkRFQlVHfHwnJykuXG5zcGxpdCgnLCcpLlxuaW5jbHVkZXMoJ2xhYmVsLWluc3RhbmNlcycpO1xuXG5jb25zdCBtYWtlU2VsZj0ocHJvdG8saW5zdGFuY2VDb3VudCk9PntcbmNvbnN0IHNlbGY9Y3JlYXRlKHByb3RvKTtcbmlmKExBQkVMX0lOU1RBTkNFUyl7XG5kZWZpbmVQcm9wZXJ0eShzZWxmLFN5bWJvbC50b1N0cmluZ1RhZyx7XG52YWx1ZTogYCR7cHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXX0jJHtpbnN0YW5jZUNvdW50fWAsXG53cml0YWJsZTpmYWxzZSxcbmVudW1lcmFibGU6ZmFsc2UsXG5jb25maWd1cmFibGU6ZmFsc2V9KTtcblxuIH1cbnJldHVybiBoYXJkZW4oc2VsZik7XG4gfTtcblxuY29uc3QgZW1wdHlSZWNvcmQ9aGFyZGVuKHt9KTtcblxuLyoqXG4gKiBXaGVuIGNhbGxpbmcgYGRlZmluZUR1cmFibGVLaW5kYCBhbmRcbiAqIGl0cyBzaWJsaW5ncywgdXNlZCBhcyB0aGUgYGluaXRgIGZ1bmN0aW9uIGFyZ3VtZW50IHRvIGluZGljYXRlIHRoYXQgdGhlXG4gKiBzdGF0ZSByZWNvcmQgb2YgdGhlICh2aXJ0dWFsL2R1cmFibGUpIGluc3RhbmNlcyBvZiB0aGUga2luZC9leG9DbGFzc1xuICogc2hvdWxkIGJlIGVtcHR5LCBhbmQgdGhhdCB0aGUgcmV0dXJuZWQgbWFrZXIgZnVuY3Rpb24gc2hvdWxkIGhhdmUgemVyb1xuICogcGFyYW1ldGVycy5cbiAqXG4gKiBAcmV0dXJucyB7e319XG4gKi9cbmNvbnN0ICAgICAgICBpbml0RW1wdHk9KCk9PmVtcHR5UmVjb3JkO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2V4by10b29scy5qcycpLkZhY2V0TmFtZX0gRmFjZXROYW1lXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9leG8tdG9vbHMuanMnKS5NZXRob2RzfSBNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1MgPSBhbnldXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IFtNID0gYW55XVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vZXhvLXRvb2xzLmpzJykuQ2xhc3NDb250ZXh0fSBDbGFzc0NvbnRleHRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUyA9IGFueV1cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPEZhY2V0TmFtZSwgTWV0aG9kcz59IFtGID0gYW55XVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vZXhvLXRvb2xzLmpzJykuS2l0Q29udGV4dH0gS2l0Q29udGV4dFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tbbmFtZTogc3RyaW5nXTogWGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5QYXR0ZXJufX0gU3RhdGVTaGFwZVxuICogSXQgbG9va3MgbGlrZSBhIGNvcHlSZWNvcmQgcGF0dGVybiwgYnV0IHRoZSBpbnRlcnByZXRhdGlvbiBpcyBkaWZmZXJlbnQuXG4gKiBFYWNoIHByb3BlcnR5IGlzIGRpc3RpbmN0LCBpcyBjaGVja2VkIGFuZCBjaGFuZ2VkIHNlcGFyYXRlbHkuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgQ1xuICogQHR5cGVkZWYge29iamVjdH0gRmFyQ2xhc3NPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhjb250ZXh0OiBDKSA9PiB2b2lkfSBbZmluaXNoXVxuICogQHByb3BlcnR5IHtTdGF0ZVNoYXBlfSBbc3RhdGVTaGFwZV1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEkgaW5pdCBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge00gJiBUaGlzVHlwZTx7IHNlbGY6IE0sIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxDbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPiwgTT4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKE0gJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIE0+KX1cbiAqLyRo4oCNX29uY2UuaW5pdEVtcHR5KGluaXRFbXB0eSk7XG5jb25zdCAgICAgICAgZGVmaW5lRXhvQ2xhc3M9KHRhZyxpbnRlcmZhY2VHdWFyZCxpbml0LG1ldGhvZHMsb3B0aW9ucyk9PntcbmNvbnN0e2ZpbmlzaD11bmRlZmluZWR9PW9wdGlvbnN8fHt9O1xuLyoqIEB0eXBlIHtXZWFrTWFwPE0sQ2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sIE0+Pn0gKi9cbmNvbnN0IGNvbnRleHRNYXA9bmV3IFdlYWtNYXAoKTtcbmNvbnN0IHByb3RvPWRlZmVuZFByb3RvdHlwZShcbnRhZyxcbihzZWxmKT0+LyoqIEB0eXBlIHthbnl9ICovY29udGV4dE1hcC5nZXQoc2VsZiksXG5tZXRob2RzLFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkKTtcblxubGV0IGluc3RhbmNlQ291bnQ9MDtcbi8qKlxuICogQHBhcmFtICB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICovXG5jb25zdCBtYWtlSW5zdGFuY2U9KC4uLmFyZ3MpPT57XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuaW5zdGFuY2VDb3VudCs9MTtcbi8qKiBAdHlwZSB7TX0gKi9cbmNvbnN0IHNlbGY9bWFrZVNlbGYocHJvdG8saW5zdGFuY2VDb3VudCk7XG5cbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbi8qKiBAdHlwZSB7Q2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sTT59ICovXG5jb25zdCBjb250ZXh0PWZyZWV6ZSh7c3RhdGUsc2VsZn0pO1xuY29udGV4dE1hcC5zZXQoc2VsZixjb250ZXh0KTtcbmlmKGZpbmlzaCl7XG5maW5pc2goY29udGV4dCk7XG4gfVxucmV0dXJuICgvKiogQHR5cGUge00gJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIE0+fSAqL1xuc2VsZik7XG5cbiB9O1xucmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2UpO1xuIH07JGjigI1fb25jZS5kZWZpbmVFeG9DbGFzcyhkZWZpbmVFeG9DbGFzcyk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3MpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEkgaW5pdCBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gRiBmYWNldCBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtGICYgVGhpc1R5cGU8eyBmYWNldHM6IEYsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+IH0gbWV0aG9kc0tpdFxuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8S2l0Q29udGV4dDxSZXR1cm5UeXBlPEk+LEY+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEZ9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVFeG9DbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5tZXRob2RzS2l0LFxub3B0aW9ucyk9Plxue1xuY29uc3R7ZmluaXNoPXVuZGVmaW5lZH09b3B0aW9uc3x8e307XG5jb25zdCBjb250ZXh0TWFwS2l0PW9iamVjdE1hcChtZXRob2RzS2l0LCgpPT5uZXcgV2Vha01hcCgpKTtcbmNvbnN0IGdldENvbnRleHRLaXQ9b2JqZWN0TWFwKFxubWV0aG9kc0tpdCxcbihfdixuYW1lKT0+KGZhY2V0KT0+Y29udGV4dE1hcEtpdFtuYW1lXS5nZXQoZmFjZXQpKTtcblxuY29uc3QgcHJvdG90eXBlS2l0PWRlZmVuZFByb3RvdHlwZUtpdChcbnRhZyxcbmdldENvbnRleHRLaXQsXG5tZXRob2RzS2l0LFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0KTtcblxubGV0IGluc3RhbmNlQ291bnQ9MDtcbi8qKlxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKi9cbmNvbnN0IG1ha2VJbnN0YW5jZUtpdD0oLi4uYXJncyk9Pntcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbmNvbnN0IHN0YXRlPXNlYWwoaW5pdCguLi5hcmdzKSk7XG4vKiBEb24ndCBmcmVlemUgY29udGV4dCB1bnRpbCB3ZSBhZGQgZmFjZXRzKi9cbi8qKiBAdHlwZSB7S2l0Q29udGV4dDxSZXR1cm5UeXBlPEk+LEY+fSAqL1xuY29uc3QgY29udGV4dD17c3RhdGUsZmFjZXRzOnt9fTtcbmluc3RhbmNlQ291bnQrPTE7XG5jb25zdCBmYWNldHM9b2JqZWN0TWFwKHByb3RvdHlwZUtpdCwocHJvdG8sZmFjZXROYW1lKT0+e1xuY29uc3Qgc2VsZj1tYWtlU2VsZihwcm90byxpbnN0YW5jZUNvdW50KTtcbmNvbnRleHRNYXBLaXRbZmFjZXROYW1lXS5zZXQoc2VsZixjb250ZXh0KTtcbnJldHVybiBzZWxmO1xuIH0pO1xuY29udGV4dC5mYWNldHM9ZmFjZXRzO1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuZnJlZXplKGNvbnRleHQpO1xuaWYoZmluaXNoKXtcbmZpbmlzaChjb250ZXh0KTtcbiB9XG5yZXR1cm4gY29udGV4dC5mYWNldHM7XG4gfTtcbnJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlS2l0KTtcbiB9OyRo4oCNX29uY2UuZGVmaW5lRXhvQ2xhc3NLaXQoZGVmaW5lRXhvQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmQgQ0FWRUFUOiBzdGF0aWMgdHlwaW5nIGRvZXMgbm90IHlldCBzdXBwb3J0IGBjYWxsV2hlbmAgdHJhbnNmb3JtYXRpb25cbiAqIEBwYXJhbSB7VH0gbWV0aG9kc1xuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8Q2xhc3NDb250ZXh0PHt9LFQ+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRXhvPSh0YWcsaW50ZXJmYWNlR3VhcmQsbWV0aG9kcyxvcHRpb25zPXVuZGVmaW5lZCk9PntcbmNvbnN0IG1ha2VJbnN0YW5jZT1kZWZpbmVFeG9DbGFzcyhcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuaW5pdEVtcHR5LFxubWV0aG9kcyxcbm9wdGlvbnMpO1xuXG5yZXR1cm4gbWFrZUluc3RhbmNlKCk7XG4gfTskaOKAjV9vbmNlLm1ha2VFeG8obWFrZUV4byk7XG5oYXJkZW4obWFrZUV4byk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaW5pdEVtcHR5IjpbImluaXRFbXB0eSJdLCJkZWZpbmVFeG9DbGFzcyI6WyJkZWZpbmVFeG9DbGFzcyJdLCJkZWZpbmVFeG9DbGFzc0tpdCI6WyJkZWZpbmVFeG9DbGFzc0tpdCJdLCJtYWtlRXhvIjpbIm1ha2VFeG8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMbCt8nEmAABxJgAAIQAAAEBlbmRvL2V4by12MC4yLjIvc3JjL2V4by10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImRlZmVuZFByb3RvdHlwZSIsImRlZmVuZFByb3RvdHlwZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixsaXN0RGlmZmVyZW5jZSxvYmplY3RNYXAsbXVzdE1hdGNoLE07JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibGlzdERpZmZlcmVuY2VcIiwgWyRo4oCNX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjigI1fYSldXSxbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuTWV0aG9kfSBNZXRob2QgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5NZXRob2RHdWFyZH0gTWV0aG9kR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZH0gSW50ZXJmYWNlR3VhcmQgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHthcHBseSxvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZGVmaW5lUHJvcGVydGllc309T2JqZWN0O1xuXG4vKipcbiAqIEEgbWV0aG9kIGd1YXJkLCBmb3IgaW5jbHVzaW9uIGluIGFuIGludGVyZmFjZSBndWFyZCwgdGhhdCBlbmZvcmNlcyBvbmx5IHRoYXRcbiAqIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NhYmxlIGFuZCB0aGF0IHRoZSByZXN1bHQgaXMgcGFzc2FibGUuIChJbiBmYXIgY2xhc3NlcyxcbiAqIFwiYW55XCIgbWVhbnMgYW55ICpwYXNzYWJsZSouKSBUaGlzIGlzIHRoZSBsZWFzdCBwb3NzaWJsZSBlbmZvcmNlbWVudCBmb3IgYVxuICogbWV0aG9kIGd1YXJkLCBhbmQgaXMgaW1wbGllZCBieSBhbGwgb3RoZXIgbWV0aG9kIGd1YXJkcy5cbiAqL1xuY29uc3QgTWluTWV0aG9kR3VhcmQ9TS5jYWxsKCkucmVzdChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpO1xuXG5jb25zdCBkZWZlbmRTeW5jQXJncz0oYXJncyxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e2FyZ0d1YXJkcyxvcHRpb25hbEFyZ0d1YXJkcyxyZXN0QXJnR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3QgcGFyYW1zUGF0dGVybj1NLnNwbGl0QXJyYXkoXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJlc3RBcmdHdWFyZCk7XG5cbm11c3RNYXRjaChoYXJkZW4oYXJncykscGFyYW1zUGF0dGVybixsYWJlbCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge01ldGhvZH0gbWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcmV0dXJucyB7TWV0aG9kfVxuICovXG5jb25zdCBkZWZlbmRTeW5jTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtyZXR1cm5HdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdHtzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbnN5bmNNZXRob2QoLi4uYXJncyl7XG5kZWZlbmRTeW5jQXJncyhoYXJkZW4oYXJncyksbWV0aG9kR3VhcmQsbGFiZWwpO1xuY29uc3QgcmVzdWx0PWFwcGx5KG1ldGhvZCx0aGlzLGFyZ3MpO1xubXVzdE1hdGNoKGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xucmV0dXJuIHJlc3VsdDtcbiB9fTtcblxucmV0dXJuIHN5bmNNZXRob2Q7XG4gfTtcblxuY29uc3QgaXNBd2FpdEFyZ0d1YXJkPShhcmdHdWFyZCk9PlxuYXJnR3VhcmQmJnR5cGVvZiBhcmdHdWFyZD09PSdvYmplY3QnJiZhcmdHdWFyZC5rbGFzcz09PSdhd2FpdEFyZyc7XG5cbmNvbnN0IGRlc3luYz0obWV0aG9kR3VhcmQpPT57XG5jb25zdHthcmdHdWFyZHMsb3B0aW9uYWxBcmdHdWFyZHM9W10scmVzdEFyZ0d1YXJkfT1tZXRob2RHdWFyZDtcbiFpc0F3YWl0QXJnR3VhcmQocmVzdEFyZ0d1YXJkKXx8XG5GYWlsIGBSZXN0IGFyZ3MgbWF5IG5vdCBiZSBhd2FpdGVkOiAke3Jlc3RBcmdHdWFyZH1gO1xuY29uc3QgcmF3QXJnR3VhcmRzPVsuLi5hcmdHdWFyZHMsLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG5jb25zdCBhd2FpdEluZGV4ZXM9W107XG5mb3IobGV0IGk9MDtpPHJhd0FyZ0d1YXJkcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBhcmdHdWFyZD1yYXdBcmdHdWFyZHNbaV07XG5pZihpc0F3YWl0QXJnR3VhcmQoYXJnR3VhcmQpKXtcbnJhd0FyZ0d1YXJkc1tpXT1hcmdHdWFyZC5hcmdHdWFyZDtcbmF3YWl0SW5kZXhlcy5wdXNoKGkpO1xuIH1cbiB9XG5yZXR1cm57XG5hd2FpdEluZGV4ZXMsXG5yYXdNZXRob2RHdWFyZDp7XG5hcmdHdWFyZHM6cmF3QXJnR3VhcmRzLnNsaWNlKDAsYXJnR3VhcmRzLmxlbmd0aCksXG5vcHRpb25hbEFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCksXG5yZXN0QXJnR3VhcmR9fTtcblxuXG4gfTtcblxuY29uc3QgZGVmZW5kQXN5bmNNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e3JldHVybkd1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0e2F3YWl0SW5kZXhlcyxyYXdNZXRob2RHdWFyZH09ZGVzeW5jKG1ldGhvZEd1YXJkKTtcbmNvbnN0e2FzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbmFzeW5jTWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgYXdhaXRMaXN0PWF3YWl0SW5kZXhlcy5tYXAoKGkpPT5hcmdzW2ldKTtcbmNvbnN0IHA9UHJvbWlzZS5hbGwoYXdhaXRMaXN0KTtcbmNvbnN0IHJhd0FyZ3M9Wy4uLmFyZ3NdO1xuY29uc3QgcmVzdWx0UD1FLndoZW4ocCwoYXdhaXRlZEFyZ3MpPT57XG5mb3IobGV0IGo9MDtqPGF3YWl0SW5kZXhlcy5sZW5ndGg7ais9MSl7XG5yYXdBcmdzW2F3YWl0SW5kZXhlc1tqXV09YXdhaXRlZEFyZ3Nbal07XG4gfVxuZGVmZW5kU3luY0FyZ3MocmF3QXJncyxyYXdNZXRob2RHdWFyZCxsYWJlbCk7XG5yZXR1cm4gYXBwbHkobWV0aG9kLHRoaXMscmF3QXJncyk7XG4gfSk7XG5yZXR1cm4gRS53aGVuKHJlc3VsdFAsKHJlc3VsdCk9Pntcbm11c3RNYXRjaChoYXJkZW4ocmVzdWx0KSxyZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbnJldHVybiByZXN1bHQ7XG4gfSk7XG4gfX07XG5cbnJldHVybiBhc3luY01ldGhvZDtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge01ldGhvZH0gbWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKi9cbmNvbnN0IGRlZmVuZE1ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7a2xhc3MsY2FsbEtpbmR9PW1ldGhvZEd1YXJkO1xuYXNzZXJ0KGtsYXNzPT09J21ldGhvZEd1YXJkJyk7XG5pZihjYWxsS2luZD09PSdzeW5jJyl7XG5yZXR1cm4gZGVmZW5kU3luY01ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpO1xuIH1lbHNle1xuYXNzZXJ0KGNhbGxLaW5kPT09J2FzeW5jJyk7XG5yZXR1cm4gZGVmZW5kQXN5bmNNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBGYWNldE5hbWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBbTSA9IGFueV1cbiAqIEB0eXBlZGVmIHt7IHN0YXRlOiBTLCBzZWxmOiBNIH19IENsYXNzQ29udGV4dFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gW0YgPSBhbnldXG4gKiBAdHlwZWRlZiB7eyBzdGF0ZTogUywgZmFjZXRzOiBGIH19IEtpdENvbnRleHRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoZmFjZXQ6IGFueSkgPT4gS2l0Q29udGV4dH0gS2l0Q29udGV4dFByb3ZpZGVyXG4gKiBAdHlwZWRlZiB7KChyZXByZXNlbnRhdGl2ZTogYW55KSA9PiBDbGFzc0NvbnRleHQpIHwgS2l0Q29udGV4dFByb3ZpZGVyfSBDb250ZXh0UHJvdmlkZXJcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RUYWdcbiAqIEBwYXJhbSB7Q29udGV4dFByb3ZpZGVyfSBjb250ZXh0UHJvdmlkZXJcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gW21ldGhvZEd1YXJkXVxuICovXG5jb25zdCBiaW5kTWV0aG9kPShcbm1ldGhvZFRhZyxcbmNvbnRleHRQcm92aWRlcixcbmJlaGF2aW9yTWV0aG9kLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5tZXRob2RHdWFyZD11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YoYmVoYXZpb3JNZXRob2QsJ2Z1bmN0aW9uJyk7XG5cbmNvbnN0IGdldENvbnRleHQ9KHNlbGYpPT57XG5jb25zdCBjb250ZXh0PWNvbnRleHRQcm92aWRlcihzZWxmKTtcbmNvbnRleHR8fFxuRmFpbCBgJHtxKG1ldGhvZFRhZyl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtzZWxmfWA7XG5yZXR1cm4gY29udGV4dDtcbiB9O1xuXG4vKiBWaW9sYXRpbmcgYWxsIEplc3NpZSBydWxlcyB0byBjcmVhdGUgcmVwcmVzZW50YXRpdmVzIHRoYXQgaW5oZXJpdCovXG4vKiBtZXRob2RzIGZyb20gYSBzaGFyZWQgcHJvdG90eXBlLiBUaGUgYm91bmQgbWV0aG9kIHRoZXJlZm9yZSBuZWVkcyovXG4vKiB0byBtZW50aW9uIGB0aGlzYC4gV2UgZGVmaW5lIGl0IHVzaW5nIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4vKiBzbyB0aGF0IGl0IHdpbGwgYmUgYHRoaXNgIHNlbnNpdGl2ZSBidXQgbm90IGNvbnN0cnVjdGFibGUuKi9cbi8qKi9cbi8qIFdlIG5vcm1hbGx5IGNvbnNpZGVyIGB0aGlzYCB1bnNhZmUgYmVjYXVzZSBvZiB0aGUgaGF6YXJkIG9mIGEqL1xuLyogbWV0aG9kIG9mIG9uZSBhYnN0cmFjdGlvbiBiZWluZyBhcHBsaWVkIHRvIGFuIGluc3RhbmNlIG9mKi9cbi8qIGFub3RoZXIgYWJzdHJhY3Rpb24uIFRvIHByZXZlbnQgdGhhdCBhdHRhY2ssIHRoZSBib3VuZCBtZXRob2QqL1xuLyogY2hlY2tzIHRoYXQgaXRzIGB0aGlzYCBpcyBpbiB0aGUgbWFwIGluIHdoaWNoIGl0cyByZXByZXNlbnRhdGl2ZXMqL1xuLyogYXJlIHJlZ2lzdGVyZWQuKi9cbmxldHttZXRob2R9PXRoaXNmdWxNZXRob2RzP1xue1xubWV0aG9kKC4uLmFyZ3Mpe1xudGhpc3x8XG5GYWlsIGB0aGlzZnVsIG1ldGhvZCAke21ldGhvZFRhZ30gY2FsbGVkIHdpdGhvdXQgJ3RoaXMnIG9iamVjdGA7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsY29udGV4dCxhcmdzKTtcbiB9fTpcblxue1xubWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgY29udGV4dD1nZXRDb250ZXh0KHRoaXMpO1xucmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLG51bGwsW2NvbnRleHQsLi4uYXJnc10pO1xuIH19O1xuXG5pZihtZXRob2RHdWFyZCl7XG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1lbHNlIGlmKHRoaXNmdWxNZXRob2RzKXtcbi8qIEZvciBmYXIgY2xhc3NlcyBlbnN1cmUgdGhhdCBpbnB1dHMgYW5kIG91dHB1dHMgYXJlIHBhc3NhYmxlLiovXG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxNaW5NZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1cbmRlZmluZVByb3BlcnRpZXMobWV0aG9kLHtcbm5hbWU6e3ZhbHVlOm1ldGhvZFRhZ30sXG5sZW5ndGg6e1xudmFsdWU6dGhpc2Z1bE1ldGhvZHM/YmVoYXZpb3JNZXRob2QubGVuZ3RoOmJlaGF2aW9yTWV0aG9kLmxlbmd0aC0xfX0pO1xuXG5cbnJldHVybiBtZXRob2Q7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0NvbnRleHRQcm92aWRlcn0gY29udGV4dFByb3ZpZGVyXG4gKiBAcGFyYW0ge1R9IGJlaGF2aW9yTWV0aG9kc1xuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBbaW50ZXJmYWNlR3VhcmRdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBkZWZlbmRQcm90b3R5cGU9KFxudGFnLFxuY29udGV4dFByb3ZpZGVyLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5pbnRlcmZhY2VHdWFyZD11bmRlZmluZWQpPT5cbntcbmNvbnN0IHByb3RvdHlwZT17fTtcbmNvbnN0IG1ldGhvZE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzKS5maWx0ZXIoXG4vKiBCeSBpZ25vcmluZyBhbnkgbWV0aG9kIG5hbWVkIFwiY29uc3RydWN0b3JcIiwgd2UgY2FuIHVzZSBhKi9cbi8qIGNsYXNzLnByb3RvdHlwZSBhcyBhIGJlaGF2aW9yTWV0aG9kcy4qL1xuKG5hbWUpPT5uYW1lIT09J2NvbnN0cnVjdG9yJyk7XG5cbmxldCBtZXRob2RHdWFyZHM7XG5pZihpbnRlcmZhY2VHdWFyZCl7XG5jb25zdHtcbmtsYXNzLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkczptZyxcbnNsb3BweT1mYWxzZX09XG5pbnRlcmZhY2VHdWFyZDtcbm1ldGhvZEd1YXJkcz1tZztcbmFzc2VydC5lcXVhbChrbGFzcywnSW50ZXJmYWNlJyk7XG5hc3NlcnQudHlwZW9mKGludGVyZmFjZU5hbWUsJ3N0cmluZycpO1xue1xuY29uc3QgbWV0aG9kR3VhcmROYW1lcz1vd25LZXlzKG1ldGhvZEd1YXJkcyk7XG5jb25zdCB1bmltcGxlbWVudGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZEd1YXJkTmFtZXMsbWV0aG9kTmFtZXMpO1xudW5pbXBsZW1lbnRlZC5sZW5ndGg9PT0wfHxcbkZhaWwgYG1ldGhvZHMgJHtxKHVuaW1wbGVtZW50ZWQpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmlmKCFzbG9wcHkpe1xuY29uc3QgdW5ndWFyZGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZE5hbWVzLG1ldGhvZEd1YXJkTmFtZXMpO1xudW5ndWFyZGVkLmxlbmd0aD09PTB8fFxuRmFpbCBgbWV0aG9kcyAke3EodW5ndWFyZGVkKX0gbm90IGd1YXJkZWQgYnkgJHtxKGludGVyZmFjZU5hbWUpfWA7XG4gfVxuIH1cbiB9XG5mb3IoY29uc3QgcHJvcCBvZiBtZXRob2ROYW1lcyl7XG5wcm90b3R5cGVbcHJvcF09YmluZE1ldGhvZChcbiBgSW4gJHtxKHByb3ApfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuY29udGV4dFByb3ZpZGVyLFxuYmVoYXZpb3JNZXRob2RzW3Byb3BdLFxudGhpc2Z1bE1ldGhvZHMsXG4vKiBUT0RPIHNvbWUgdG9vbCBkb2VzIG5vdCB5ZXQgdW5kZXJzdGFuZCB0aGUgYD8uW2Agc3ludGF4Ki9cbm1ldGhvZEd1YXJkcyYmbWV0aG9kR3VhcmRzW3Byb3BdKTtcblxuIH1cblxucmV0dXJuIEZhcih0YWcsLyoqIEB0eXBlIHtUfSAqL3Byb3RvdHlwZSk7XG4gfTskaOKAjV9vbmNlLmRlZmVuZFByb3RvdHlwZShkZWZlbmRQcm90b3R5cGUpO1xuaGFyZGVuKGRlZmVuZFByb3RvdHlwZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtSZWNvcmQ8RmFjZXROYW1lLCBLaXRDb250ZXh0UHJvdmlkZXI+fSBjb250ZXh0UHJvdmlkZXJLaXRcbiAqIEBwYXJhbSB7UmVjb3JkPEZhY2V0TmFtZSwgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBiZWhhdmlvck1ldGhvZHNLaXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBJbnRlcmZhY2VHdWFyZD59IFtpbnRlcmZhY2VHdWFyZEtpdF1cbiAqL1xuY29uc3QgICAgICAgIGRlZmVuZFByb3RvdHlwZUtpdD0oXG50YWcsXG5jb250ZXh0UHJvdmlkZXJLaXQsXG5iZWhhdmlvck1ldGhvZHNLaXQsXG50aGlzZnVsTWV0aG9kcz1mYWxzZSxcbmludGVyZmFjZUd1YXJkS2l0PXVuZGVmaW5lZCk9Plxue1xuY29uc3QgZmFjZXROYW1lcz1vd25LZXlzKGJlaGF2aW9yTWV0aG9kc0tpdCkuc29ydCgpO1xuZmFjZXROYW1lcy5sZW5ndGg+MXx8RmFpbCBgQSBtdWx0aS1mYWNldCBvYmplY3QgbXVzdCBoYXZlIG11bHRpcGxlIGZhY2V0c2A7XG5pZihpbnRlcmZhY2VHdWFyZEtpdCl7XG5jb25zdCBpbnRlcmZhY2VOYW1lcz1vd25LZXlzKGludGVyZmFjZUd1YXJkS2l0KTtcbmNvbnN0IGV4dHJhSW50ZXJmYWNlTmFtZXM9bGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcyxpbnRlcmZhY2VOYW1lcyk7XG5leHRyYUludGVyZmFjZU5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgSW50ZXJmYWNlcyAke3EoZXh0cmFJbnRlcmZhY2VOYW1lcyl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuY29uc3QgZXh0cmFGYWNldE5hbWVzPWxpc3REaWZmZXJlbmNlKGludGVyZmFjZU5hbWVzLGZhY2V0TmFtZXMpO1xuZXh0cmFGYWNldE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbm90IGd1YXJkZWQgYnkgaW50ZXJmYWNlc2A7XG4gfVxuY29uc3QgY29udGV4dE1hcE5hbWVzPW93bktleXMoY29udGV4dFByb3ZpZGVyS2l0KTtcbmNvbnN0IGV4dHJhQ29udGV4dE5hbWVzPWxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsY29udGV4dE1hcE5hbWVzKTtcbmV4dHJhQ29udGV4dE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgQ29udGV4dHMgJHtxKGV4dHJhQ29udGV4dE5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoY29udGV4dE1hcE5hbWVzLGZhY2V0TmFtZXMpO1xuZXh0cmFGYWNldE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbWlzc2luZyBjb250ZXh0c2A7XG5yZXR1cm4gb2JqZWN0TWFwKGJlaGF2aW9yTWV0aG9kc0tpdCwoYmVoYXZpb3JNZXRob2RzLGZhY2V0TmFtZSk9PlxuZGVmZW5kUHJvdG90eXBlKFxuIGAke3RhZ30gJHtmYWNldE5hbWV9YCxcbmNvbnRleHRQcm92aWRlcktpdFtmYWNldE5hbWVdLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHMsXG5pbnRlcmZhY2VHdWFyZEtpdCYmaW50ZXJmYWNlR3VhcmRLaXRbZmFjZXROYW1lXSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuZGVmZW5kUHJvdG90eXBlS2l0KGRlZmVuZFByb3RvdHlwZUtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSJdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEEMM5RAAgAAQAIAAB4AAABAZW5kby9mYXItdjAuMi4xOC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIixudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBlbmRvL2V2ZW50dWFsLXNlbmQiOltbIkUiLCJFIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJGYXIiLCJGYXIiXSxbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXSxbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKWPOvdKBwAASgcAAB0AAABAZW5kby9tYXJzaGFsLXYwLjguNS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiY29tcGFyZVJhbmsiLCJjb21wYXJlUmFuayIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsInBhcnNlIiwicGFyc2UiLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3JhbmtPcmRlci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjpbWyJkZWVwbHlGdWxmaWxsZWQiLCJkZWVwbHlGdWxmaWxsZWQiXV0sIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6W1siUUNMQVNTIiwiUUNMQVNTIl1dLCIuL3NyYy9tYXJzaGFsLmpzIjpbWyJtYWtlTWFyc2hhbCIsIm1ha2VNYXJzaGFsIl1dLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6W1sic3RyaW5naWZ5Iiwic3RyaW5naWZ5Il0sWyJwYXJzZSIsInBhcnNlIl1dLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6W1siZGVjb2RlVG9KdXN0aW4iLCJkZWNvZGVUb0p1c3RpbiJdXSwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOltbIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSJdLFsibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIl0sWyJpc0VuY29kZWRSZW1vdGFibGUiLCJpc0VuY29kZWRSZW1vdGFibGUiXSxbInplcm9QYWQiLCJ6ZXJvUGFkIl0sWyJyZWNvcmROYW1lcyIsInJlY29yZE5hbWVzIl0sWyJyZWNvcmRWYWx1ZXMiLCJyZWNvcmRWYWx1ZXMiXV0sIi4vc3JjL3JhbmtPcmRlci5qcyI6W1siYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiXSxbImNvbXBhcmVSYW5rIiwiY29tcGFyZVJhbmsiXSxbImlzUmFua1NvcnRlZCIsImlzUmFua1NvcnRlZCJdLFsic29ydEJ5UmFuayIsInNvcnRCeVJhbmsiXSxbImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVBbnRpUmFuayJdLFsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdLFsiZ2V0UGFzc1N0eWxlQ292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciJdLFsiaW50ZXJzZWN0UmFua0NvdmVycyIsImludGVyc2VjdFJhbmtDb3ZlcnMiXSxbInVuaW9uUmFua0NvdmVycyIsInVuaW9uUmFua0NvdmVycyJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADQgme5QNAACUDQAAKwAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9kZWVwbHlGdWxmaWxsZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLGlzUHJvbWlzZSxnZXRUYWcsaXNPYmplY3QsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWYgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtmcm9tRW50cmllc309T2JqZWN0O1xuXG4vKipcbiAqIEdpdmVuIGEgUGFzc2FibGUgYHZhbGAgd2hvc2UgcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBtYXkgY29udGFpbiBsZWFmXG4gKiBwcm9taXNlcywgcmV0dXJuIGEgcHJvbWlzZSBmb3IgYSByZXBsYWNlbWVudCBQYXNzYWJsZSxcbiAqIHdoZXJlIHRoYXQgcmVwbGFjZW1lbnQgaXMgKmRlZXBseSBmdWxmaWxsZWQqLCBpLmUuLCBpdHNcbiAqIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiBhbnkgcHJvbWlzZXMuXG4gKlxuICogVGhpcyBpcyBhIGRlZXAgZm9ybSBvZiBgUHJvbWlzZS5hbGxgIHNwZWNpYWxpemVkIGZvciBQYXNzYWJsZXMuIEZvciBlYWNoXG4gKiBlbmNvdW50ZXJlZCBwcm9taXNlLCByZXBsYWNlIGl0IHdpdGggdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybSBvZlxuICogaXRzIGZ1bGZpbGxtZW50LlxuICogSWYgYW55IG9mIHRoZSBwcm9taXNlcyByZWplY3QsIHRoZW4gdGhlIHByb21pc2UgZm9yIHRoZSByZXBsYWNlbWVudFxuICogcmVqZWN0cy4gSWYgYW55IG9mIHRoZSBwcm9taXNlcyBuZXZlciBzZXR0bGUsIHRoZW4gdGhlIHByb21pc2UgZm9yXG4gKiB0aGUgcmVwbGFjZW1lbnQgbmV2ZXIgc2V0dGxlcy5cbiAqXG4gKiBJZiB0aGUgcmVwbGFjZW1lbnQgd291bGQgbm90IGJlIFBhc3NhYmxlLCBpLmUuLCBpZiBgdmFsYCBpcyBub3RcbiAqIFBhc3NhYmxlLCBvciBpZiBhbnkgb2YgdGhlIHRyYW5zaXRpdmUgcHJvbWlzZXMgZnVsZmlsbCB0byBzb21ldGhpbmdcbiAqIHRoYXQgaXMgbm90IFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIHJlamVjdHMuXG4gKlxuICogSWYgYHZhbGAgb3IgaXRzIHBhcnRzIGFyZSBub24ta2V5IFBhc3NhYmxlcyBvbmx5ICpiZWNhdXNlKiB0aGV5IGNvbnRhaW5zXG4gKiBwcm9taXNlcywgdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybXMgb2YgdmFsIG9yIGl0cyBwYXJ0cyBtYXkgYmUga2V5cy4gVGhpc1xuICogaXMgZm9yIHRoZSBoaWdoZXIgXCJzdG9yZVwiIGxldmVsIG9mIGFic3RyYWN0aW9uIHRvIGRldGVybWluZSwgYmVjYXVzZSBpdFxuICogZGVmaW5lcyB0aGUgXCJrZXlcIiBub3Rpb24gaW4gcXVlc3Rpb24uXG4gKlxuICogLy8gVE9ETzogVGhhdCBoaWdoZXIgbGV2ZWwgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgbWlncmF0ZWQgZnJvbVxuICogLy8gYEBhZ29yaWMvc3RvcmVgIHRvIGBAZW5kby9wYXR0ZXJuc2AuIE9uY2UgdGhhdCBpcyBmYXIgZW5vdWdoIGFsb25nLFxuICogLy8gcmV2aXNlIHRoZSBhYm92ZSBjb21tZW50IHRvIG1hdGNoLlxuICogLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE0NTFcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBhc3NhYmxlPn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZD1hc3luYyh2YWwpPT57XG5pZighaXNPYmplY3QodmFsKSl7XG5yZXR1cm4gdmFsO1xuIH1cbmlmKGlzUHJvbWlzZSh2YWwpKXtcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzp7XG5jb25zdCBuYW1lcz1vd25LZXlzKHZhbCk7XG5jb25zdCB2YWxQcz1uYW1lcy5tYXAoKG5hbWUpPT5kZWVwbHlGdWxmaWxsZWQodmFsW25hbWVdKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PlxuaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLGkpPT5bbmFtZXNbaV0sY10pKSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbmNvbnN0IHZhbFBzPXZhbC5tYXAoKHApPT5kZWVwbHlGdWxmaWxsZWQocCkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5oYXJkZW4odmFscykpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5yZXR1cm4gRS53aGVuKGRlZXBseUZ1bGZpbGxlZCh2YWwucGF5bG9hZCksKHBheWxvYWQpPT5cbm1ha2VUYWdnZWQodGFnLHBheWxvYWQpKTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UnZXJyb3InOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07JGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWQoZGVlcGx5RnVsZmlsbGVkKTtcbmhhcmRlbihkZWVwbHlGdWxmaWxsZWQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAO3LPgOQ/AADkPwAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9lbmNvZGVQYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwicGFzc1N0eWxlUHJlZml4ZXMiLCJyZWNvcmROYW1lcyIsInJlY29yZFZhbHVlcyIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLGlzRXJyb3JMaWtlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SYW5rQ292ZXJ9IFJhbmtDb3ZlciAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e2Zyb21FbnRyaWVzLGlzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkLCB3ZSBoYXZlIG9ubHlcbiAqIHN0cmluZy1uYW1lZCBvd24gcHJvcGVydGllcy4gYHJlY29yZE5hbWVzYCByZXR1cm5zIHRob3NlIG5hbWUgKnJldmVyc2UqXG4gKiBzb3J0ZWQsIGJlY2F1c2UgdGhhdCdzIGhvdyByZWNvcmRzIGFyZSBjb21wYXJlZCwgZW5jb2RlZCwgYW5kIHNvcnRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZE5hbWVzPShyZWNvcmQpPT5cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNjAjZGlzY3Vzc2lvbl9yMTAwMzY1NzI0NCovXG4vKiBjb21wYXJlcyB0d28gd2F5cyBvZiByZXZlcnNlIHNvcnRpbmcsIGFuZCBzaG93cyB0aGF0IGAuc29ydCgpLnJldmVyc2UoKWAqL1xuLyogaXMgY3VycmVudGx5IGZhc3RlciBvbiBNb2RkYWJsZSBYUywgd2hpbGUgdGhlIG90aGVyIHdheSwqL1xuLyogYC5zb3J0KHJldmVyc2VDb21wYXJhdG9yKWAsIGlzIGZhc3RlciBvbiB2OC4gV2UgY3VycmVudGx5IGNhcmUgbW9yZSBhYm91dCovXG4vKiBYUyBwZXJmb3JtYW5jZSwgc28gd2UgcmV2ZXJzZSBzb3J0IHVzaW5nIGAuc29ydCgpLnJldmVyc2UoKWAuKi9cbmhhcmRlbigvKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmVjb3JkKS5zb3J0KCkucmV2ZXJzZSgpKTskaOKAjV9vbmNlLnJlY29yZE5hbWVzKHJlY29yZE5hbWVzKTtcbmhhcmRlbihyZWNvcmROYW1lcyk7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQgYW5kIGBuYW1lc2AgaXMgYHJlY29yZE5hbWVzKHJlY29yZClgLFxuICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkVmFsdWVzPShyZWNvcmQsbmFtZXMpPT5cbmhhcmRlbihuYW1lcy5tYXAoKG5hbWUpPT5yZWNvcmRbbmFtZV0pKTskaOKAjV9vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBuXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIHplcm9QYWQ9KG4sc2l6ZSk9PntcbmNvbnN0IG5TdHI9IGAke259YDtcbmFzc2VydChuU3RyLmxlbmd0aDw9c2l6ZSk7XG5jb25zdCBzdHI9IGAwMDAwMDAwMDAwMDAwMDAwMDAwMCR7blN0cn1gO1xuY29uc3QgcmVzdWx0PXN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aC1zaXplKTtcbmFzc2VydChyZXN1bHQubGVuZ3RoPT09c2l6ZSk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vKiBUaGlzIGlzIHRoZSBKYXZhU2NyaXB0IGFuYWxvZyB0byBhIEMgdW5pb246IGEgd2F5IHRvIG1hcCBiZXR3ZWVuIGEgZmxvYXQgYXMgYSovXG4vKiBudW1iZXIgYW5kIHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBmbG9hdCBhcyBhIGJ1ZmZlciBmdWxsIG9mIGJ5dGVzLiAgTm90ZSovXG4vKiB0aGF0IHRoZSBtdXRhdGlvbiBvZiBzdGF0aWMgc3RhdGUgaGVyZSBtYWtlcyB0aGlzIGludmFsaWQgSmVzc2llIGNvZGUsIGJ1dCovXG4vKiBkb2luZyBpdCB0aGlzIHdheSBzYXZlcyB0aGUgbnVnYXRvcnkgYW5kIGdyYXR1aXRvdXMgYWxsb2NhdGlvbnMgdGhhdCB3b3VsZCovXG4vKiBoYXBwZW4gZXZlcnkgdGltZSB5b3UgZG8gYSBjb252ZXJzaW9uIC0tIGFuZCBpbiBwcmFjdGljYWwgdGVybXMgaXQncyBzYWZlKi9cbi8qIGJlY2F1c2Ugd2UgcHV0IHRoZSB2YWx1ZSBpbiBvbmUgc2lkZSBhbmQgdGhlbiBpbW1lZGlhdGVseSB0YWtlIGl0IG91dCB0aGUqL1xuLyogb3RoZXI7IHRoZXJlIGlzIG5vIGFjdHVhbCBzdGF0ZSByZXRhaW5lZCBpbiB0aGUgY2xhc3NpYyBzZW5zZSBhbmQgdGh1cyBubyovXG4vKiByZS1lbnRyYW5jeSBpc3N1ZS4qL1xuY29uc3QgYXNOdW1iZXI9bmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cz1uZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLyogSmF2YVNjcmlwdCBudW1iZXJzIGFyZSBlbmNvZGVkIGJ5IG91dHB1dHRpbmcgdGhlIGJhc2UtMTYqL1xuLyogcmVwcmVzZW50YXRpb24gb2YgdGhlIGJpbmFyeSB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBJRUVFIGZsb2F0aW5nIHBvaW50Ki9cbi8qIHJlcHJlc2VudGF0aW9uLiAgRm9yIG5lZ2F0aXZlIHZhbHVlcywgYWxsIGJpdHMgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBhcmUqL1xuLyogY29tcGxlbWVudGVkIHByaW9yIHRvIHRoZSBiYXNlLTE2IGNvbnZlcnNpb24sIHdoaWxlIGZvciBwb3NpdGl2ZSB2YWx1ZXMsIHRoZSovXG4vKiBzaWduIGJpdCBpcyBjb21wbGVtZW50ZWQuICBUaGlzIGVuc3VyZXMgYm90aCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGJlZm9yZSovXG4vKiBwb3NpdGl2ZSB2YWx1ZXMgYW5kIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYWNjb3JkaW5nIHRvIHRoZWlyIG5lZ2F0aXZlKi9cbi8qIG1hZ25pdHVkZSByYXRoZXIgdGhhbiB0aGVpciBwb3NpdGl2ZSBtYWduaXR1ZGUuICBUaGlzIHJlc3VsdHMgaW4gYW4gQVNDSUkqL1xuLyogZW5jb2Rpbmcgd2hvc2UgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1lcmljIHNvcnQgb3JkZXIqL1xuLyogb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycy4qL1xuXG4vKiBUT0RPIENob29zZSB0aGUgc2FtZSBjYW5vbmljYWwgTmFOIGVuY29kaW5nIHRoYXQgY29zbVdhc20gYW5kIGV3YXNtIGNob3NlLiovXG5jb25zdCBDYW5vbmljYWxOYU5CaXRzPSdmZmY4MDAwMDAwMDAwMDAwJztcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmluYXJ5NjQ9KG4pPT57XG4vKiBOb3JtYWxpemUgLTAgdG8gMCBhbmQgTmFOIHRvIGEgY2Fub25pY2FsIGVuY29kaW5nKi9cbmlmKGlzKG4sLTApKXtcbm49MDtcbiB9ZWxzZSBpZihpcyhuLE5hTikpe1xucmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gfVxuYXNOdW1iZXJbMF09bjtcbmxldCBiaXRzPWFzQml0c1swXTtcbmlmKG48MCl7XG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5yZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksMTYpfWA7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlQmluYXJ5NjQ9KGVuY29kZWQpPT57XG5lbmNvZGVkLnN0YXJ0c1dpdGgoJ2YnKXx8RmFpbCBgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IGJpdHM9QmlnSW50KCBgMHgke2VuY29kZWQuc3Vic3RyaW5nKDEpfWApO1xuaWYoZW5jb2RlZFsxXTwnOCcpe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxuYXNCaXRzWzBdPWJpdHM7XG5jb25zdCByZXN1bHQ9YXNOdW1iZXJbMF07XG4haXMocmVzdWx0LC0wKXx8RmFpbCBgVW5leHBlY3RlZCBuZWdhdGl2ZSB6ZXJvOiAke2VuY29kZWR9YDtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBFbmNvZGUgYSBKYXZhU2NyaXB0IGJpZ2ludCB1c2luZyBhIHZhcmlhbnQgb2YgRWxpYXMgZGVsdGEgY29kaW5nLCB3aXRoIGFuXG4gKiBpbml0aWFsIGNvbXBvbmVudCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXQgY291bnQgYXMgYSB1bmFyeSBzdHJpbmcsIGFcbiAqIHNlY29uZCBjb21wb25lbnQgZm9yIHRoZSBkZWNpbWFsIGRpZ2l0IGNvdW50LCBhbmQgYSB0aGlyZCBjb21wb25lbnQgZm9yIHRoZVxuICogZGVjaW1hbCBkaWdpdHMgcHJlY2VkZWQgYnkgYSBncmF0dWl0b3VzIHNlcGFyYXRpbmcgY29sb24uXG4gKiBUbyBlbnN1cmUgdGhhdCB0aGUgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIG9mIGVuY29kZWQgdmFsdWVzIG1hdGNoZXMgdGhlXG4gKiBudW1lcmljIHNvcnQgb3JkZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycywgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVuYXJ5XG4gKiBwcmVmaXggYXJlIGRpZmZlcmVudCBmb3IgbmVnYXRpdmUgdmFsdWVzICh0eXBlIFwiblwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2ZcbiAqIFwiI1wicyBbd2hpY2ggc29ydCBiZWZvcmUgZGVjaW1hbCBkaWdpdHNdKSB2cy4gcG9zaXRpdmUgYW5kIHplcm8gdmFsdWVzICh0eXBlXG4gKiBcInBcIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIFwiflwicyBbd2hpY2ggc29ydCBhZnRlciBkZWNpbWFsIGRpZ2l0c10pIGFuZFxuICogZWFjaCBkZWNpbWFsIGRpZ2l0IG9mIHRoZSBlbmNvZGluZyBmb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIGl0c1xuICogdGVuJ3MgY29tcGxlbWVudCAoc28gdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgb2YgdGhlIHNhbWUgc2NhbGUgc29ydCBieVxuICogKmRlc2NlbmRpbmcqIGFic29sdXRlIHZhbHVlKS5cbiAqXG4gKiBAcGFyYW0ge2JpZ2ludH0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmlnSW50PShuKT0+e1xuY29uc3QgYWJzPW48MG4/LW46bjtcbmNvbnN0IG5EaWdpdHM9YWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuY29uc3QgbERpZ2l0cz1uRGlnaXRzLnRvU3RyaW5nKCkubGVuZ3RoO1xuaWYobjwwbil7XG5yZXR1cm4gYG4ke1xuLyogQSBcIiNcIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbicjJy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xuKDEwKipsRGlnaXRzLW5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywnMCcpXG4gfToke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGRpZ2l0cy4qL1xuKDEwbioqQmlnSW50KG5EaWdpdHMpK24pLnRvU3RyaW5nKCkucGFkU3RhcnQobkRpZ2l0cywnMCcpXG4gfWA7XG4gfWVsc2V7XG5yZXR1cm4gYHAke1xuLyogQSBcIn5cIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbid+Jy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xubkRpZ2l0c1xuIH06JHtcbi8qIFRoZSBkaWdpdHMuKi9cbm5cbiB9YDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuY29uc3QgZGVjb2RlQmlnSW50PShlbmNvZGVkKT0+e1xuY29uc3QgdHlwZVByZWZpeD1lbmNvZGVkLmNoYXJBdCgwKTsvKiBmYXN0ZXIgdGhhbiBlbmNvZGVkWzBdKi9cbmxldCByZW09ZW5jb2RlZC5zbGljZSgxKTtcbnR5cGVQcmVmaXg9PT0ncCd8fFxudHlwZVByZWZpeD09PSduJ3x8XG5GYWlsIGBFbmNvZGVkIGJpZ2ludCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbmNvbnN0IGxEaWdpdHM9cmVtLnNlYXJjaCgvWzAtOV0vKSsxO1xubERpZ2l0cz49MXx8RmFpbCBgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xucmVtPXJlbS5zbGljZShsRGlnaXRzLTEpO1xuXG5yZW0ubGVuZ3RoPj1sRGlnaXRzfHxGYWlsIGBDb21wbGV0ZSBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5jb25zdCBzbkRpZ2l0cz1yZW0uc2xpY2UoMCxsRGlnaXRzKTtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cyk7XG4vXlswLTldKyQvLnRlc3Qoc25EaWdpdHMpfHxGYWlsIGBEZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuRGlnaXRzPXBhcnNlSW50KHNuRGlnaXRzLDEwKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuLyogbGlrZSBcIm4wOlwiIGFuZCBcIm4wMDrigKZcIiBhbmQgXCJuOTE64oCmXCIgdGhyb3VnaCBcIm45OTrigKZcIj8qL1xubkRpZ2l0cz0xMCoqbERpZ2l0cy1uRGlnaXRzO1xuIH1cblxucmVtLnN0YXJ0c1dpdGgoJzonKXx8RmFpbCBgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbnJlbT1yZW0uc2xpY2UoMSk7XG5yZW0ubGVuZ3RoPT09bkRpZ2l0c3x8XG5GYWlsIGBGaXhlZC1sZW5ndGggZGlnaXQgc2VxdWVuY2UgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IG49QmlnSW50KHJlbSk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuOTowXCIgYW5kIFwibjg6MDBcIiBhbmQgXCJuODo5MVwiIHRocm91Z2ggXCJuODo5OVwiPyovXG5uPS0oMTBuKipCaWdJbnQobkRpZ2l0cyktbik7XG4gfVxuXG5yZXR1cm4gbjtcbiB9O1xuXG4vKiBgJ1xcdTAwMDAnYCBpcyB0aGUgdGVybWluYXRvciBhZnRlciBlbGVtZW50cy4qL1xuLyogYCdcXHUwMDAxJ2AgaXMgdGhlIGJhY2tzbGFzaC1saWtlIGVzY2FwZSBjaGFyYWN0ZXIsIGZvciovXG4vKiBlc2NhcGluZyBib3RoIG9mIHRoZXNlIGNoYXJhY3RlcnMuKi9cblxuY29uc3QgZW5jb2RlQXJyYXk9KGFycmF5LGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgY2hhcnM9WydbJ107XG5mb3IoY29uc3QgZWxlbWVudCBvZiBhcnJheSl7XG5jb25zdCBlbmM9ZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG5mb3IoY29uc3QgYyBvZiBlbmMpe1xuaWYoYz09PSdcXHUwMDAwJ3x8Yz09PSdcXHUwMDAxJyl7XG5jaGFycy5wdXNoKCdcXHUwMDAxJyk7XG4gfVxuY2hhcnMucHVzaChjKTtcbiB9XG5jaGFycy5wdXNoKCdcXHUwMDAwJyk7XG4gfVxucmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9IGRlY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmNvbnN0IGRlY29kZUFycmF5PShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdbJyl8fEZhaWwgYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuY29uc3QgZWxlbWVudHM9W107XG5jb25zdCBlbGVtQ2hhcnM9W107XG5mb3IobGV0IGk9MTtpPGVuY29kZWQubGVuZ3RoO2krPTEpe1xuY29uc3QgYz1lbmNvZGVkW2ldO1xuaWYoYz09PSdcXHUwMDAwJyl7XG5jb25zdCBlbmNvZGVkRWxlbWVudD1lbGVtQ2hhcnMuam9pbignJyk7XG5lbGVtQ2hhcnMubGVuZ3RoPTA7XG5jb25zdCBlbGVtZW50PWRlY29kZVBhc3NhYmxlKGVuY29kZWRFbGVtZW50KTtcbmVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gfWVsc2UgaWYoYz09PSdcXHUwMDAxJyl7XG5pKz0xO1xuaTxlbmNvZGVkLmxlbmd0aHx8RmFpbCBgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtlbmNvZGVkfWA7XG5jb25zdCBjMj1lbmNvZGVkW2ldO1xuYzI9PT0nXFx1MDAwMCd8fFxuYzI9PT0nXFx1MDAwMSd8fFxuRmFpbCBgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2MyfWA7XG5lbGVtQ2hhcnMucHVzaChjMik7XG4gfWVsc2V7XG5lbGVtQ2hhcnMucHVzaChjKTtcbiB9XG4gfVxuZWxlbUNoYXJzLmxlbmd0aD09PTB8fEZhaWwgYGVuY29kaW5nIHRlcm1pbmF0ZWQgZWFybHk6ICR7ZW5jb2RlZH1gO1xucmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVjb3JkPShyZWNvcmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBuYW1lcz1yZWNvcmROYW1lcyhyZWNvcmQpO1xuY29uc3QgdmFsdWVzPXJlY29yZFZhbHVlcyhyZWNvcmQsbmFtZXMpO1xucmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLHZhbHVlc10pLGVuY29kZVBhc3NhYmxlKX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZVJlY29yZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJygnKSk7XG5jb25zdCBrZXlzdmFscz1kZWNvZGVBcnJheShlbmNvZGVkLnN1YnN0cmluZygxKSxkZWNvZGVQYXNzYWJsZSk7XG5rZXlzdmFscy5sZW5ndGg9PT0yfHxGYWlsIGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2VuY29kZWR9YDtcbmNvbnN0W2tleXMsdmFsc109a2V5c3ZhbHM7XG5cbnBhc3NTdHlsZU9mKGtleXMpPT09J2NvcHlBcnJheScmJlxucGFzc1N0eWxlT2YodmFscyk9PT0nY29weUFycmF5JyYmXG5rZXlzLmxlbmd0aD09PXZhbHMubGVuZ3RoJiZcbmtleXMuZXZlcnkoKGtleSk9PnR5cGVvZiBrZXk9PT0nc3RyaW5nJyl8fFxuRmFpbCBgbm90IGEgdmFsaWQgcmVjb3JkIGVuY29kaW5nOiAke2VuY29kZWR9YDtcbmNvbnN0IG1hcEVudHJpZXM9a2V5cy5tYXAoKGtleSxpKT0+W2tleSx2YWxzW2ldXSk7XG5jb25zdCByZWNvcmQ9aGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbmFzc2VydFJlY29yZChyZWNvcmQsJ2RlY29kZWQgcmVjb3JkJyk7XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0IGVuY29kZVRhZ2dlZD0odGFnZ2VkLGVuY29kZVBhc3NhYmxlKT0+XG4gYDoke2VuY29kZUFycmF5KGhhcmRlbihbZ2V0VGFnKHRhZ2dlZCksdGFnZ2VkLnBheWxvYWRdKSxlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkPShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnOicpKTtcbmNvbnN0IHRhZ3BheWxvYWQ9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xudGFncGF5bG9hZC5sZW5ndGg9PT0yfHxGYWlsIGBleHBlY3RlZCB0YWcscGF5bG9hZCBwYWlyOiAke2VuY29kZWR9YDtcbmNvbnN0W3RhZyxwYXlsb2FkXT10YWdwYXlsb2FkO1xucGFzc1N0eWxlT2YodGFnKT09PSdzdHJpbmcnfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtlbmNvZGVkfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcscGF5bG9hZCk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlRXJyb3JdXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVQYXNzYWJsZT0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlPShyZW0sXyk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gLFxuZW5jb2RlUHJvbWlzZT0ocHJvbSxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YCxcbmVuY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWB9PVxuZW5jb2RlT3B0aW9ucztcblxuY29uc3QgZW5jb2RlUGFzc2FibGU9KHBhc3NhYmxlKT0+e1xuaWYoaXNFcnJvckxpa2UocGFzc2FibGUpKXtcbnJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzp7XG5yZXR1cm4ndic7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybid6JztcbiB9XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kZUJpbmFyeTY0KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xucmV0dXJuIGBzJHtwYXNzYWJsZX1gO1xuIH1cbmNhc2UnYm9vbGVhbic6e1xucmV0dXJuIGBiJHtwYXNzYWJsZX1gO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm4gZW5jb2RlQmlnSW50KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgncicpfHxcbkZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlRXJyb3IocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJyEnKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCc/Jyl8fFxuRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiP1wiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGB5JHtuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpfWA7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBlbmNvZGVBcnJheShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5yZXR1cm4gZW5jb2RlUmVjb3JkKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJuIGVuY29kZVRhZ2dlZChwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBhICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgdXNlZCBhcyBhIGNvbGxlY3Rpb24gcGFzc2FibGVgO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVQYXNzYWJsZShtYWtlRW5jb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVQYXNzYWJsZT0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlPShyZW0sXyk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gLFxuZGVjb2RlUHJvbWlzZT0ocHJvbSxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YCxcbmRlY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWB9PVxuZGVjb2RlT3B0aW9ucztcblxuY29uc3QgZGVjb2RlUGFzc2FibGU9KGVuY29kZWQpPT57XG5zd2l0Y2goZW5jb2RlZC5jaGFyQXQoMCkpe1xuY2FzZSd2Jzp7XG5yZXR1cm4gbnVsbDtcbiB9XG5jYXNlJ3onOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdmJzp7XG5yZXR1cm4gZGVjb2RlQmluYXJ5NjQoZW5jb2RlZCk7XG4gfVxuY2FzZSdzJzp7XG5yZXR1cm4gZW5jb2RlZC5zdWJzdHJpbmcoMSk7XG4gfVxuY2FzZSdiJzp7XG5yZXR1cm4gZW5jb2RlZC5zdWJzdHJpbmcoMSkhPT0nZmFsc2UnO1xuIH1cbmNhc2Unbic6XG5jYXNlJ3AnOntcbnJldHVybiBkZWNvZGVCaWdJbnQoZW5jb2RlZCk7XG4gfVxuY2FzZSdyJzp7XG5yZXR1cm4gZGVjb2RlUmVtb3RhYmxlKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnPyc6e1xucmV0dXJuIGRlY29kZVByb21pc2UoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSchJzp7XG5yZXR1cm4gZGVjb2RlRXJyb3IoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSd5Jzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kZWQuc3Vic3RyaW5nKDEpKTtcbiB9XG5jYXNlJ1snOntcbnJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJygnOntcbnJldHVybiBkZWNvZGVSZWNvcmQoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSc6Jzp7XG5yZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7ZW5jb2RlZH1gO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVQYXNzYWJsZShtYWtlRGVjb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5cbmNvbnN0ICAgICAgICBpc0VuY29kZWRSZW1vdGFibGU9KGVuY29kZWQpPT5lbmNvZGVkLmNoYXJBdCgwKT09PSdyJzskaOKAjV9vbmNlLmlzRW5jb2RlZFJlbW90YWJsZShpc0VuY29kZWRSZW1vdGFibGUpO1xuaGFyZGVuKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZSB7UmVjb3JkPFBhc3NTdHlsZSwgc3RyaW5nPn1cbiAqIFRoZSBzaW5nbGUgcHJlZml4IGNoYXJhY3RlcnMgdG8gYmUgdXNlZCBmb3IgZWFjaCBQYXNzU3R5bGUgY2F0ZWdvcnkuXG4gKiBgYmlnaW50YCBpcyBhIHR3byBjaGFyYWN0ZXIgc3RyaW5nIGJlY2F1c2UgZWFjaCBvZiB0aG9zZSBjaGFyYWN0ZXJzXG4gKiBpbmRpdmlkdWFsbHkgaXMgYSB2YWxpZCBiaWdpbnQgcHJlZml4LiBgbmAgZm9yIFwibmVnYXRpdmVcIiBhbmQgYHBgIGZvclxuICogXCJwb3NpdGl2ZVwiLiBUaGUgb3JkZXJpbmcgb2YgdGhlc2UgcHJlZml4ZXMgaXMgdGhlIHNhbWUgYXMgdGhlXG4gKiByYW5rT3JkZXJpbmcgb2YgdGhlaXIgcmVzcGVjdGl2ZSBQYXNzU3R5bGVzLiBUaGlzIHRhYmxlIGlzIGltcG9ydGVkIGJ5XG4gKiByYW5rT3JkZXIuanMgZm9yIHRoaXMgcHVycG9zZS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgYHxgIGlzIHRoZSByZW1vdGFibGUtPm9yZGluYWwgbWFwcGluZyBwcmVmaXg6XG4gKiBUaGlzIGlzIG5vdCB1c2VkIGluIGNvdmVycyBidXQgaXQgaXNcbiAqIHJlc2VydmVkIGZyb20gdGhlIHNhbWUgc2V0IG9mIHN0cmluZ3MuIE5vdGUgdGhhdCB0aGUgcHJlZml4IGlzID4gYW55XG4gKiBwcmVmaXggdXNlZCBieSBhbnkgY292ZXIgc28gdGhhdCBvcmRpbmFsIG1hcHBpbmcga2V5cyBhcmUgYWx3YXlzIG91dHNpZGVcbiAqIHRoZSByYW5nZSBvZiB2YWxpZCBjb2xsZWN0aW9uIGVudHJ5IGtleXMuXG4gKi9cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVQcmVmaXhlcz17XG5lcnJvcjonIScsXG5jb3B5UmVjb3JkOicoJyxcbnRhZ2dlZDonOicsXG5wcm9taXNlOic/JyxcbmNvcHlBcnJheTonWycsXG5ib29sZWFuOidiJyxcbm51bWJlcjonZicsXG5iaWdpbnQ6J25wJyxcbnJlbW90YWJsZToncicsXG5zdHJpbmc6J3MnLFxubnVsbDondicsXG5zeW1ib2w6J3knLFxudW5kZWZpbmVkOid6J307JGjigI1fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVQcmVmaXhlcyxudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVQcmVmaXhlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVjb3JkTmFtZXMiOlsicmVjb3JkTmFtZXMiXSwicmVjb3JkVmFsdWVzIjpbInJlY29yZFZhbHVlcyJdLCJ6ZXJvUGFkIjpbInplcm9QYWQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXSwicGFzc1N0eWxlUHJlZml4ZXMiOlsicGFzc1N0eWxlUHJlZml4ZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxFOn8Pw/AAD8PwAAKwAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9lbmNvZGVUb0NhcERhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxpc09iamVjdCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nVW5pb259IEVuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxuZGVmaW5lUHJvcGVydGllcyxcbmlzLFxuZW50cmllcyxcbmZyb21FbnRyaWVzLFxuZnJlZXplfT1cbk9iamVjdDtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBTcGVjaWFsIHByb3BlcnR5IG5hbWUgdGhhdCBpbmRpY2F0ZXMgYW4gZW5jb2RpbmcgdGhhdCBuZWVkcyBzcGVjaWFsXG4gKiBkZWNvZGluZy5cbiAqL1xuY29uc3QgUUNMQVNTPSdAcWNsYXNzJzskaOKAjV9vbmNlLlFDTEFTUyhRQ0xBU1MpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2VuY29kZWQgaXMgRW5jb2RpbmdVbmlvbn1cbiAqL1xuY29uc3QgaGFzUUNsYXNzPShlbmNvZGVkKT0+aGFzT3duUHJvcGVydHlPZihlbmNvZGVkLFFDTEFTUyk7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHBhcmFtIHtzdHJpbmd9IHFjbGFzc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHFjbGFzc01hdGNoZXM9KGVuY29kZWQscWNsYXNzKT0+XG5pc09iamVjdChlbmNvZGVkKSYmXG4haXNBcnJheShlbmNvZGVkKSYmXG5oYXNRQ2xhc3MoZW5jb2RlZCkmJlxuZW5jb2RlZFtRQ0xBU1NdPT09cWNsYXNzO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvQ2FwRGF0YU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPShyZW0pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycik9PkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9DYXBEYXRhT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9DYXBEYXRhPShlbmNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9ZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGE9ZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YT1kb250RW5jb2RlRXJyb3JUb0NhcERhdGF9PVxuZW5jb2RlT3B0aW9ucztcblxuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb0NhcERhdGFgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9DYXBEYXRhYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgYXMgW1FDTEFTU10gY29tcG9zaXRlcy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ3N0cmluZyc6e1xuLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm57W1FDTEFTU106J3VuZGVmaW5lZCd9O1xuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybntbUUNMQVNTXTonTmFOJ307XG4gfWVsc2UgaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106J0luZmluaXR5J307XG4gfWVsc2UgaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOictSW5maW5pdHknfTtcbiB9XG4vKiBQYXNzIHRocm91Z2ggZXZlcnl0aGluZyBlbHNlLCByZXBsYWNpbmcgLTAgd2l0aCAwLiovXG5yZXR1cm4gaXMocGFzc2FibGUsLTApPzA6cGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybntcbltRQ0xBU1NdOidiaWdpbnQnLFxuZGlnaXRzOlN0cmluZyhwYXNzYWJsZSl9O1xuXG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybntcbltRQ0xBU1NdOidzeW1ib2wnLFxubmFtZX07XG5cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGhhc093blByb3BlcnR5T2YocGFzc2FibGUsUUNMQVNTKSl7XG4vKiBIaWxiZXJ0IGhvdGVsKi9cbmNvbnN0e1tRQ0xBU1NdOnFjbGFzc1ZhbHVlLC4uLnJlc3R9PXBhc3NhYmxlO1xuLyoqIEB0eXBlIHtFbmNvZGluZ30gKi9cbmNvbnN0IHJlc3VsdD17XG5bUUNMQVNTXTonaGlsYmVydCcsXG5vcmlnaW5hbDplbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSl9O1xuXG5pZihvd25LZXlzKHJlc3QpLmxlbmd0aD49MSl7XG4vKiBXZSBoYXJkZW4gdGhlIGVudGlyZSBjYXBEYXRhIGVuY29kaW5nIGJlZm9yZSB3ZSByZXR1cm4gaXQuKi9cbi8qIGBlbmNvZGVUb0NhcERhdGFgIHJlcXVpcmVzIHRoYXQgaXRzIGlucHV0IGJlIFBhc3NhYmxlLCBhbmQqL1xuLyogdGhlcmVmb3JlIGhhcmRlbmVkLiovXG4vKiBUaGUgYGZyZWV6ZWAgaGVyZSBpcyBuZWVkZWQgYW55d2F5LCBiZWNhdXNlIHRoZSBgcmVzdGAgaXMqL1xuLyogZnJlc2hseSBjb25zdHJ1Y3RlZCBieSB0aGUgYC4uLmAgYWJvdmUsIGFuZCB3ZSdyZSB1c2luZyBpdCovXG4vKiBhcyBpbXB1dCBpbiBhbm90aGVyIGNhbGwgdG8gYGVuY29kZVRvQ2FwRGF0YWAuKi9cbnJlc3VsdC5yZXN0PWVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbltRQ0xBU1NdOid0YWdnZWQnLFxudGFnOmdldFRhZyhwYXNzYWJsZSksXG5wYXlsb2FkOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YShcbnBhc3NhYmxlLFxuZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuXG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTKVxuIH0gJHtxKCdzbG90Jyl9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidzbG90JylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnZXJyb3InKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nZXJyb3InKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xucmV0dXJuIGhhcmRlbihlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cikpO1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9DYXBEYXRhKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlKX0gW2RlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlKX0gW2RlY29kZVByb21pc2VGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbUNhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShzbG90RW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT0oZXJyb3JFbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJvckVuY29kaW5nfWA7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaFxuICogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uXG4gKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZVxuICogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS5cbiAqXG4gKiBUaGlzIHNlZW1zIGxpa2UgdGhlIGJlc3Qgc3RhcnRpbmcgcG9pbnQgdG8gaW5jcmVtZW50YWxseSBldm9sdmUgdG8gYW5cbiAqIEFQSSB3aGVyZSB0aGVzZSBjYW4gcmVsaWFibHkgZGlmZmVyLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNFxuICpcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IEVuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tQ2FwRGF0YT0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGE9ZG9udERlY29kZUVycm9yRnJvbUNhcERhdGF9PVxuZGVjb2RlT3B0aW9ucztcblxuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9PT1kZWNvZGVQcm9taXNlRnJvbUNhcERhdGF8fFxuRmFpbCBgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKVxuIH0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuLyoqXG4gKiBgZGVjb2RlRnJvbUNhcERhdGFgIG1heSByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGpzb25FbmNvZGVkYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9DYXBEYXRhYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tQ2FwRGF0YWAgY2Fubm90IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBqc29uRW5jb2RlZCBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21DYXBEYXRhPShqc29uRW5jb2RlZCk9PntcbmlmKCFpc09iamVjdChqc29uRW5jb2RlZCkpe1xuLyogcHJpbWl0aXZlcyBwYXNzIHRocm91Z2gqL1xucmV0dXJuIGpzb25FbmNvZGVkO1xuIH1cbmlmKGlzQXJyYXkoanNvbkVuY29kZWQpKXtcbnJldHVybiBqc29uRW5jb2RlZC5tYXAoKGVuY29kZWRWYWwpPT5kZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gfWVsc2UgaWYoaGFzUUNsYXNzKGpzb25FbmNvZGVkKSl7XG5jb25zdCBxY2xhc3M9anNvbkVuY29kZWRbUUNMQVNTXTtcbnR5cGVvZiBxY2xhc3M9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG5zd2l0Y2gocWNsYXNzKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZSctSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e2RpZ2l0c309anNvbkVuY29kZWQ7XG50eXBlb2YgZGlnaXRzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xucmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBEZXByZWNhdGVkIHFjbGFzcy4gVE9ETyBtYWtlIGNvbmRpdGlvbmFsKi9cbi8qIG9uIGVudmlyb25tZW50IHZhcmlhYmxlLiBFdmVudHVhbGx5IHJlbW92ZSwgYnV0IGFmdGVyIGNvbmZpZGVudCovXG4vKiB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHN1cHBvcnRlZCBzZW5kZXJzLiovXG4vKiovXG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xucmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7bmFtZX09anNvbkVuY29kZWQ7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7dGFnLHBheWxvYWR9PWpzb25FbmNvZGVkO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLGRlY29kZUZyb21DYXBEYXRhKHBheWxvYWQpKTtcbiB9XG5jYXNlJ3Nsb3QnOntcbi8qIFNlZSBub3RlIGFib3ZlIGFib3V0IGhvdyB0aGUgY3VycmVudCBlbmNvZGluZyBjYW5ub3QgcmVsaWFibHkqL1xuLyogZGlzdGluZ3Vpc2ggd2hpY2ggd2Ugc2hvdWxkIGNhbGwsIHNvIGluIHRoZSBub24tZGVmYXVsdCBjYXNlKi9cbi8qIGJvdGggbXVzdCBiZSB0aGUgc2FtZSBhbmQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggd2UgY2FsbC4qL1xuY29uc3QgZGVjb2RlZD1kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG4vKiBCRVdBUkU6IGNhcGRhdGEgZG9lcyBub3QgY2hlY2sgdGhhdCBgZGVjb2RlZGAgaXMqL1xuLyogYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLCBzaW5jZSB0aGF0IHdvdWxkIGJyZWFrIHNvbWUqL1xuLyogY2FwZGF0YSBjbGllbnRzLiBXZSBhcmUgZGVwcmVjYXRpbmcgY2FwZGF0YSwgYW5kIHRoZXNlIGNsaWVudHMqL1xuLyogd2lsbCBuZWVkIHRvIHVwZGF0ZSBiZWZvcmUgc3dpdGNoaW5nIHRvIHNtYWxsY2Fwcy4qL1xucmV0dXJuIGRlY29kZWQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZGVjb2RlZD1kZWNvZGVFcnJvckZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbmlmKHBhc3NTdHlsZU9mKGRlY29kZWQpPT09J2Vycm9yJyl7XG5yZXR1cm4gZGVjb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7ZGVjb2RlZH1gO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e29yaWdpbmFsLHJlc3R9PWpzb25FbmNvZGVkO1xuaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwnb3JpZ2luYWwnKXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuLyogRG9uJ3QgaGFyZGVuIHNpbmNlIHdlJ3JlIG5vdCBkb25lIG11dGF0aW5nIGl0Ki9cbmNvbnN0IHJlc3VsdD17W1FDTEFTU106ZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpfTtcbmlmKGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ3Jlc3QnKSl7XG5jb25zdCBpc05vbkVtcHR5T2JqZWN0PVxudHlwZW9mIHJlc3Q9PT0nb2JqZWN0JyYmXG5yZXN0IT09bnVsbCYmXG5vd25LZXlzKHJlc3QpLmxlbmd0aD49MTtcbmlmKCFpc05vbkVtcHR5T2JqZWN0KXtcbnRocm93IEZhaWwgYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gO1xuIH1cbmNvbnN0IHJlc3RPYmo9ZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4vKiBUT0RPIHJlYWxseSBzaG91bGQgYXNzZXJ0IHRoYXQgYHBhc3NTdHlsZU9mKHJlc3QpYCBpcyovXG4vKiBgJ2NvcHlSZWNvcmQnYCBidXQgd2UnZCBoYXZlIHRvIGhhcmRlbiBpdCBhbmQgaXQgaXMgdG9vKi9cbi8qIGVhcmx5IHRvIGRvIHRoYXQuKi9cbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RPYmosUUNMQVNTKXx8XG5GYWlsIGBSZXN0IG11c3Qgbm90IGNvbnRhaW4gaXRzIG93biBkZWZpbml0aW9uIG9mICR7cShRQ0xBU1MpfWA7XG5kZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHJlc3RPYmopKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhpcyBpcyB0aGUgZXJyb3IgY2FzZSB3ZSdyZSB0ZXN0aW5nIGZvciovXG5jYXNlJ2liaWQnOntcbnRocm93IEZhaWwgYFRoZSBjYXBEYXRhIHByb3RvY29sIG5vIGxvbmdlciBzdXBwb3J0cyAke3EoUUNMQVNTKX0gJHtxKFxucWNsYXNzKVxuIH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNle1xuYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZD09PSdvYmplY3QnJiZqc29uRW5jb2RlZCE9PW51bGwpO1xuY29uc3QgZGVjb2RlRW50cnk9KFtuYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGpzb25FbmNvZGVkKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbUNhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJRQ0xBU1MiOlsiUUNMQVNTIl0sIm1ha2VFbmNvZGVUb0NhcERhdGEiOlsibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiOlsibWFrZURlY29kZUZyb21DYXBEYXRhIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALNe92vFOwAAxTsAAC0AAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIiwibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG4vKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nfSBTbWFsbGNhcHNFbmNvZGluZyAqWC8qL1xuLyogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ1VuaW9ufSBTbWFsbGNhcHNFbmNvZGluZ1VuaW9uICpYLyovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e2lzLGVudHJpZXMsZnJvbUVudHJpZXN9PU9iamVjdDtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3QgQkFORz0nIScuY2hhckNvZGVBdCgwKTtcbmNvbnN0IERBU0g9Jy0nLmNoYXJDb2RlQXQoMCk7XG5cbi8qKlxuICogQW4gYGVuY29kZVRvU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhIHBhc3NhYmxlIGFuZCByZXR1cm5zIGFcbiAqIEpTT04tcmVwcmVzZW50YWJsZSBvYmplY3QgKGkuZS4sIHJvdW5kLXRyaXBwaW5nIGl0IHRocm91Z2hcbiAqIGBKU09OLnN0cmluZ2lmeWAgYW5kIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlcGxhY2VycyBvciByZXZpdmVyc1xuICogcmV0dXJucyBhbiBlcXVpdmFsZW50IHN0cnVjdHVyZSBleGNlcHQgZm9yIG9iamVjdCBpZGVudGl0eSkuXG4gKiBXZSBjYWxsIHRoaXMgcmVwcmVzZW50YXRpb24gYSBTbWFsbGNhcHMgRW5jb2RpbmcuXG4gKlxuICogQSBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYXMgYXJndW1lbnQgd2hhdCBpdFxuICogKmFzc3VtZXMqIGlzIHRoZSByZXN1bHQgb2YgYSBwbGFpbiBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXNvbHZlci4gSXQgdGhlblxuICogbXVzdCB2YWxpZGF0ZSB0aGF0IGl0IGlzIGEgdmFsaWQgU21hbGxjYXBzIEVuY29kaW5nLCBhbmQgaWYgaXQgaXMsXG4gKiByZXR1cm4gYSBjb3JyZXNwb25kaW5nIHBhc3NhYmxlLlxuICpcbiAqIFNtYWxsY2FwcyBjb25zaWRlcnMgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiBgIWAgKGFzY2lpIGNvZGUgMzMsIEJBTkcpXG4gKiBhbmQgYC1gIChhc2NpaSBjb2RlIDQ1LCBEQVNIKSB0byBiZSBzcGVjaWFsIHByZWZpeGVzIGFsbG93aW5nXG4gKiByZXByZXNlbnRhdGlvbiBvZiBKU09OLWluY29tcGF0aWJsZSBkYXRhIHVzaW5nIHN0cmluZ3MuXG4gKiBUaGVzZSBjaGFyYWN0ZXJzLCBpbiBvcmRlciwgYXJlIGAhXCIjJCUmJygpKissLWBcbiAqIE9mIHRoZXNlLCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgKiBgIWAgLSBlc2NhcGVkIHN0cmluZ1xuICogICogYCtgIC0gbm9uLW5lZ2F0aXZlIGJpZ2ludFxuICogICogYC1gIC0gbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgI2AgLSBtYW5pZmVzdCBjb25zdGFudFxuICogICogYCVgIC0gc3ltYm9sXG4gKiAgKiBgJGAgLSByZW1vdGFibGVcbiAqICAqIGAmYCAtIHByb21pc2VcbiAqXG4gKiBBbGwgb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzIChgXCInKCkqLGApIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS5cbiAqXG4gKiBUaGUgbWFuaWZlc3QgY29uc3RhbnRzIHRoYXQgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIGZvciB2YWx1ZXM6XG4gKiAgKiBgI3VuZGVmaW5lZGBcbiAqICAqIGAjTmFOYFxuICogICogYCNJbmZpbml0eWBcbiAqICAqIGAjLUluZmluaXR5YFxuICpcbiAqIGFuZCBmb3IgcHJvcGVydHkgbmFtZXMgYW5hbG9nb3VzIHRvIGNhcGRhdGEgQHFjbGFzczpcbiAqICAqIGAjdGFnYFxuICogICogYCNlcnJvcmBcbiAqXG4gKiBBbGwgb3RoZXIgZW5jb2RlZCBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGAjYCBhcmUgcmVzZXJ2ZWQgZm9yXG4gKiBmdXR1cmUgdXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkU3RyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc3RhcnRzU3BlY2lhbD0oZW5jb2RlZFN0cik9PntcbmlmKGVuY29kZWRTdHI9PT0nJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuLyogY2hhckNvZGVBdCgwKSBhbmQgbnVtYmVyIGNvbXBhcmUgaXMgYSBiaXQgZmFzdGVyLiovXG5jb25zdCBjb2RlPWVuY29kZWRTdHIuY2hhckNvZGVBdCgwKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB5b2RhKi9cbnJldHVybiBCQU5HPD1jb2RlJiZjb2RlPD1EQVNIO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZUVycm9yVG9TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW0pPT5cbkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9tKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHM9KGVycik9PlxuRmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7cShlcnIpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogZW5jb2RlT3B0aW9ucyBpcyBhY3R1YWxseSBvcHRpb25hbCwgYnV0IG5vdCBtYXJrZWQgYXMgc3VjaCB0byB3b3JrIGFyb3VuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDI4NlxuICpcbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVUb1NtYWxsY2Fwcz0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzPWRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzfT1cbmVuY29kZU9wdGlvbnM7XG5cbmNvbnN0IGFzc2VydEVuY29kZWRFcnJvcj0oZW5jb2RpbmcpPT57XG50eXBlb2YgZW5jb2Rpbmc9PT0nb2JqZWN0JyYmaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG5lbmNvZGluZylcbiB9YDtcbi8qIEFzc2VydCB0aGF0IHRoZSAjZXJyb3IgcHJvcGVydHkgZGVjb2RlcyB0byBhIHN0cmluZy4qL1xuY29uc3QgbWVzc2FnZT1lbmNvZGluZ1snI2Vycm9yJ107XG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnJiYoXG4hc3RhcnRzU3BlY2lhbChtZXNzYWdlKXx8bWVzc2FnZS5zdGFydHNXaXRoKCchJykpfHxcbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gO1xuIH07XG5cbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRlbHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge1NtYWxsY2Fwc0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9TbWFsbGNhcHNgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9TbWFsbGNhcHNgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGludG8gc21hbGxjYXBzIHN0cmluZ3MuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoc3RhcnRzU3BlY2lhbChwYXNzYWJsZSkpe1xuLyogU3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYSBzcGVjaWFsIGNoYXIgYXJlIHF1b3RlZCB3aXRoIGAhYC4qL1xuLyogU2luY2UgYCFgIGlzIGl0c2VsZiBhIHNwZWNpYWwgY2hhcmFjdGVyLCB0aGlzIHRyaXZpYWxseSBkb2VzKi9cbi8qIHRoZSBIaWxiZXJ0IGhvdGVsLiBBbHNvLCBzaW5jZSB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSovXG4vKiBhIGNvbnRpbnVvdXMgc3VicmFuZ2Ugb2YgYXNjaWksIHRoaXMgcXVvdGluZyBpcyBzb3J0LW9yZGVyKi9cbi8qIHByZXNlcnZpbmcuKi9cbnJldHVybiBgISR7cGFzc2FibGV9YDtcbiB9XG4vKiBBbGwgb3RoZXIgc3RyaW5ncyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybicjdW5kZWZpbmVkJztcbiB9XG5jYXNlJ251bWJlcic6e1xuLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm4nI05hTic7XG4gfWVsc2UgaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm4nI0luZmluaXR5JztcbiB9ZWxzZSBpZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm4nIy1JbmZpbml0eSc7XG4gfVxuLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xucmV0dXJuIGlzKHBhc3NhYmxlLC0wKT8wOnBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdCBzdHI9U3RyaW5nKHBhc3NhYmxlKTtcbnJldHVybiAoLyoqIEB0eXBlIHtiaWdpbnR9ICovcGFzc2FibGU8MG4/c3RyOmArJHtzdHJ9YCk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybiBgJSR7bmFtZX1gO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W1xuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuJyN0YWcnOmVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG5wYXlsb2FkOmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyQnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJFwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyYnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbmFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuY29uc3QgcmVzdWx0PWhhcmRlbihcbmVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cikpO1xuXG5hc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9TbWFsbGNhcHMobWFrZUVuY29kZVRvU21hbGxjYXBzKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcz0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfT1cbmRlY29kZU9wdGlvbnM7XG5cbi8qKlxuICogYGRlY29kZUZyb21TbWFsbGNhcHNgIG1heSByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGVuY29kaW5nYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9TbWFsbGNhcHNgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21TbWFsbGNhcHNgIGNhbm5vdCByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge1NtYWxsY2Fwc0VuY29kaW5nfSBlbmNvZGluZyBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+e1xuc3dpdGNoKHR5cGVvZiBlbmNvZGluZyl7XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGluZztcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5jb25zdCBjPWVuY29kaW5nLmNoYXJBdCgwKTtcbnN3aXRjaChjKXtcbmNhc2UnISc6e1xuLyogdW4taGlsYmVydC1pZnkgdGhlIHN0cmluZyovXG5yZXR1cm4gZW5jb2Rpbmcuc2xpY2UoMSk7XG4gfVxuY2FzZSclJzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kaW5nLnNsaWNlKDEpKTtcbiB9XG5jYXNlJyMnOntcbnN3aXRjaChlbmNvZGluZyl7XG5jYXNlJyN1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZScjTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnI0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZScjLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfVxuY2FzZScrJzpcbmNhc2UnLSc6e1xucmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gfVxuY2FzZSckJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbmlmKHBhc3NTdHlsZU9mKHJlc3VsdCkhPT0ncmVtb3RhYmxlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSByZW1vdGFibGU6ICR7cmVzdWx0fWA7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJyYnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbmlmKHBhc3NTdHlsZU9mKHJlc3VsdCkhPT0ncHJvbWlzZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFNwZWNpYWwgY2hhciAke3EoXG5jKVxuIH0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6ICR7ZW5jb2Rpbmd9YDtcbiB9fVxuXG4gfVxuY2FzZSdvYmplY3QnOntcbmlmKGVuY29kaW5nPT09bnVsbCl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuXG5pZihpc0FycmF5KGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2RpbmcubWFwKCh2YWwpPT5kZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI3RhZycpKXtcbmNvbnN0eycjdGFnJzp0YWcscGF5bG9hZCwuLi5yZXN0fT1lbmNvZGluZztcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBWYWx1ZSBvZiBcIiN0YWdcIiwgdGhlIHRhZywgbXVzdCBiZSBhIHN0cmluZzogJHtlbmNvZGluZ31gO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZChcbmRlY29kZUZyb21TbWFsbGNhcHModGFnKSxcbmRlY29kZUZyb21TbWFsbGNhcHMocGF5bG9hZCkpO1xuXG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjZXJyb3InKSl7XG5jb25zdCByZXN1bHQ9ZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxucGFzc1N0eWxlT2YocmVzdWx0KT09PSdlcnJvcid8fFxuRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuY29uc3QgZGVjb2RlRW50cnk9KFtlbmNvZGVkTmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBlbmNvZGVkTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5IG5hbWUgJHtxKFxuZW5jb2RlZE5hbWUpXG4gfSBvZiAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiFlbmNvZGVkTmFtZS5zdGFydHNXaXRoKCcjJyl8fFxuRmFpbCBgVW5yZWNvZ25pemVkIHJlY29yZCB0eXBlICR7cShlbmNvZGVkTmFtZSl9OiAke2VuY29kaW5nfWA7XG5jb25zdCBuYW1lPWRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZE5hbWUpO1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBEZWNvZGVkIHByb3BlcnR5IG5hbWUgJHtuYW1lfSBmcm9tICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkVmFsKV07XG4gfTtcbmNvbnN0IGRlY29kZWRFbnRyaWVzPWVudHJpZXMoZW5jb2RpbmcpLm1hcChkZWNvZGVFbnRyeSk7XG5yZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogdW5yZWNvZ25pemVkIEpTT04gdHlwZW9mICR7cShcbnR5cGVvZiBlbmNvZGluZylcbiB9OiAke2VuY29kaW5nfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVuY29kZVRvU21hbGxjYXBzIjpbIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAIQpL9rCoAAKwqAAAqAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL21hcnNoYWwtanVzdGluLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImRlY29kZVRvSnVzdGluIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxnZXRFcnJvckNvbnN0cnVjdG9yLGlzT2JqZWN0LHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxRQ0xBU1M7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DYXBEYXRhPFQ+fSBDYXBEYXRhICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3N0cmluZ2lmeTpxdW90ZX09SlNPTjtcbmNvbnN0e3F1b3RlOnEsZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbmRlbnRlclxuICogQHByb3BlcnR5IHsob3BlbkJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBvcGVuXG4gKiBAcHJvcGVydHkgeygpID0+IG51bWJlcn0gbGluZVxuICogQHByb3BlcnR5IHsodG9rZW46IHN0cmluZykgPT4gbnVtYmVyfSBuZXh0XG4gKiBAcHJvcGVydHkgeyhjbG9zZUJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBjbG9zZVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGRvbmVcbiAqL1xuXG4vKipcbiAqIEdlbmVyb3VzIHdoaXRlc3BhY2UgZm9yIHJlYWRhYmlsaXR5XG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlWWVzSW5kZW50ZXI9KCk9PntcbmNvbnN0IHN0cmluZ3M9W107XG5sZXQgbGV2ZWw9MDtcbmxldCBuZWVkU3BhY2U9ZmFsc2U7XG5jb25zdCBsaW5lPSgpPT57XG5uZWVkU3BhY2U9ZmFsc2U7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKCdcXG4nLCcgICcucmVwZWF0KGxldmVsKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT57XG5sZXZlbCs9MTtcbmlmKG5lZWRTcGFjZSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG5uZWVkU3BhY2U9ZmFsc2U7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KTtcbiB9LFxubGluZSxcbm5leHQ6KHRva2VuKT0+e1xuaWYobmVlZFNwYWNlJiZ0b2tlbiE9PScsJyl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG5uZWVkU3BhY2U9dHJ1ZTtcbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuYXNzZXJ0KGxldmVsPj0xKTtcbmxldmVsLT0xO1xubGluZSgpO1xucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT57XG5hc3NlcnQuZXF1YWwobGV2ZWwsMCk7XG5yZXR1cm4gc3RyaW5ncy5qb2luKCcnKTtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIElmIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBvbmUgdG9rZW4gdG9nZXRoZXIgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyXG4gKiBvZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoaXMgcGF0dGVybiwgdGhlbiB0aGUgdHdvIHRva2VucyBtdXN0IGJlXG4gKiBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSB0byBwcmVzZXJ2ZSB0aGVpciBtZWFuaW5nLiBPdGhlcndpc2UgdGhlXG4gKiB3aGl0ZXNwYWNlIGluIHVubmVjZXNzYXJ5LlxuICpcbiAqIFRoZSBgPCFgIGFuZCBgLT5gIGNhc2VzIHByZXZlbnQgdGhlIGFjY2lkZW50YWwgZm9ybWF0aW9uIG9mIGFuXG4gKiBodG1sLWxpa2UgY29tbWVudC4gSSBkb24ndCB0aGluayB0aGUgZG91YmxlIGFuZ2xlIGJyYWNrZXRzIGFyZSBhY3R1YWxseVxuICogbmVlZGVkIGJ1dCBJIGhhdmVuJ3QgdGhvdWdodCBhYm91dCBpdCBlbm91Z2ggdG8gcmVtb3ZlIHRoZW0uXG4gKi9cbmNvbnN0IGJhZFBhaXJQYXR0ZXJuPS9eKD86XFx3XFx3fDw8fD4+fFxcK1xcK3wtLXw8IXwtPikkLztcblxuLyoqXG4gKiBNaW5pbXVtIHdoaXRlc3BhY2UgbmVlZGVkIHRvIHByZXNldmUgbWVhbmluZy5cbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyPSgpPT57XG4vKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuY29uc3Qgc3RyaW5ncz1bXTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT5zdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpLFxubGluZTooKT0+c3RyaW5ncy5sZW5ndGgsXG5uZXh0Oih0b2tlbik9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xKXtcbmNvbnN0IGxhc3Q9c3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXTtcbmlmKGxhc3QubGVuZ3RoPj0xJiZ0b2tlbi5sZW5ndGg+PTEpe1xuY29uc3QgcGFpcj0gYCR7bGFzdFtsYXN0Lmxlbmd0aC0xXX0ke3Rva2VuWzBdfWA7XG5pZihiYWRQYWlyUGF0dGVybi50ZXN0KHBhaXIpKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbiB9XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSYmc3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXT09PScsJyl7XG5zdHJpbmdzLnBvcCgpO1xuIH1cbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+c3RyaW5ncy5qb2luKCcnKX0pO1xuXG4gfTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuPS9eW2EtekEtWl1cXHcqJC87XG5oYXJkZW4oaWRlbnRQYXR0ZXJuKTtcbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuPS9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGRJbmRlbnRcbiAqIEBwYXJhbSB7YW55W119IFtzbG90c11cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZVRvSnVzdGluPShlbmNvZGluZyxzaG91bGRJbmRlbnQ9ZmFsc2Usc2xvdHM9W10pPT57XG4vKipcbiAqIFRoZSBmaXJzdCBwYXNzIGRvZXMgc29tZSBpbnB1dCB2YWxpZGF0aW9uLlxuICogSXRzIGNvbnRyb2wgZmxvdyBzaG91bGQgbWlycm9yIGByZWN1cmAgYXMgY2xvc2VseSBhcyBwb3NzaWJsZVxuICogYW5kIHRoZSB0d28gc2hvdWxkIGJlIG1haW50YWluZWQgdG9nZXRoZXIuIFRoZXkgbXVzdCB2aXNpdCBldmVyeXRoaW5nXG4gKiBpbiB0aGUgc2FtZSBvcmRlci5cbiAqXG4gKiBUT0RPIG5vdyB0aGF0IGliaWRzIGFyZSBnb25lLCB3ZSBzaG91bGQgZm9sZCB0aGlzIGJhY2sgdG9nZXRoZXIgaW50b1xuICogb25lIHZhbGlkYXRpbmcgcGFzcy5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgcHJlcGFyZT0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG5yZXR1cm47XG4gfVxuLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG5hc3NlcnQudHlwZW9mKHJhd1RyZWUsJ29iamVjdCcpO1xuYXNzZXJ0KHJhd1RyZWUhPT1udWxsKTtcbmlmKFFDTEFTUyBpbiByYXdUcmVlKXtcbmNvbnN0IHFjbGFzcz1yYXdUcmVlW1FDTEFTU107XG50eXBlb2YgcWNsYXNzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBxY2xhc3MgdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdOYU4nOlxuY2FzZSdJbmZpbml0eSc6XG5jYXNlJy1JbmZpbml0eSc6e1xucmV0dXJuO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG50eXBlb2YgZGlnaXRzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xucmV0dXJuO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG5yZXR1cm47XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbnJldHVybjtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKHRhZywnc3RyaW5nJyk7XG5wcmVwYXJlKHBheWxvYWQpO1xucmV0dXJuO1xuIH1cbmNhc2Unc2xvdCc6e1xuY29uc3R7aW5kZXgsaWZhY2V9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKGluZGV4LCdudW1iZXInKTtcbk5hdChpbmRleCk7XG5pZihpZmFjZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKGlmYWNlLCdzdHJpbmcnKTtcbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1yYXdUcmVlO1xuJ29yaWdpbmFsJ2luIHJhd1RyZWV8fFxuRmFpbCBgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7cmF3VHJlZX1gO1xucHJlcGFyZShvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmlmKHR5cGVvZiByZXN0IT09J29iamVjdCcpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0YDtcbiB9XG5pZihyZXN0PT09bnVsbCl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbGA7XG4gfVxuaWYoaXNBcnJheShyZXN0KSl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgYW4gYXJyYXlgO1xuIH1cbmlmKFFDTEFTUyBpbiByZXN0KXtcbnRocm93IEZhaWwgYFJlc3QgZW5jb2RpbmcgJHtyZXN0fSBtdXN0IG5vdCBjb250YWluICR7cShRQ0xBU1MpfWA7XG4gfVxuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG5wcmVwYXJlKHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgbmFtZSl9YDtcbmdldEVycm9yQ29uc3RydWN0b3IobmFtZSkhPT11bmRlZmluZWR8fFxuRmFpbCBgTXVzdCBiZSB0aGUgbmFtZSBvZiBhbiBFcnJvciBjb25zdHJ1Y3RvciAke25hbWV9YDtcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWA7XG5yZXR1cm47XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xucHJlcGFyZShyYXdUcmVlW2ldKTtcbiB9XG4gfWVsc2V7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJhd1RyZWUpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiB9XG5wcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuIH1cbiB9XG4gfTtcblxuY29uc3QgbWFrZUluZGVudGVyPXNob3VsZEluZGVudD9tYWtlWWVzSW5kZW50ZXI6bWFrZU5vSW5kZW50ZXI7XG5sZXQgb3V0PW1ha2VJbmRlbnRlcigpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIHJlY3Vyc2lvbiBhZnRlciB0aGUgZmlyc3QgcGFzcyBgcHJlcGFyZWAuXG4gKiBUaGUgZmlyc3QgcGFzcyBkaWQgc29tZSBpbnB1dCB2YWxpZGF0aW9uIHNvXG4gKiBoZXJlIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGV2ZXJ5dGhpbmcgdGhvc2UgdGhpbmdzIGFyZSB2YWxpZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlPShyYXdUcmVlKT0+e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiByZWN1cihyYXdUcmVlKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVQcm9wZXJ0eT0obmFtZSx2YWx1ZSk9Pntcbm91dC5saW5lKCk7XG5pZihuYW1lPT09J19fcHJvdG9fXycpe1xuLyogSmF2YVNjcmlwdCBpbnRlcnByZXRzIGB7X19wcm90b19fOiB4LCAuLi59YCovXG4vKiBhcyBtYWtpbmcgYW4gb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgeGAsIHdoZXJlYXMqL1xuLyogaW4gSlNPTiBpdCBpcyBzaW1wbHkgYSBwcm9wZXJ0eSBuYW1lLiBQcmVzZXJ2ZSB0aGUqL1xuLyogSlNPTiBtZWFuaW5nLiovXG5vdXQubmV4dCggYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiB9ZWxzZSBpZihpZGVudFBhdHRlcm4udGVzdChuYW1lKSl7XG5vdXQubmV4dCggYCR7bmFtZX06YCk7XG4gfWVsc2V7XG5vdXQubmV4dCggYCR7cXVvdGUobmFtZSl9OmApO1xuIH1cbmRlY29kZSh2YWx1ZSk7XG5vdXQubmV4dCgnLCcpO1xuIH07XG5cbi8qKlxuICogTW9kZWxlZCBhZnRlciBgZnVsbFJldml2ZWAgaW4gbWFyc2hhbC5qc1xuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJlY3VyPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbi8qIHByaW1pdGl2ZXMgZ2V0IHF1b3RlZCovXG5yZXR1cm4gb3V0Lm5leHQocXVvdGUocmF3VHJlZSkpO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihxY2xhc3MsJ3N0cmluZycpO1xuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbi8qIFN3aXRjaGluZyBvbiBgZW5jb2RlZFtRQ0xBU1NdYCAob3IgYW55dGhpbmcgbGVzcyBkaXJlY3QsIGxpa2UqL1xuLyogYHFjbGFzc2ApIGRvZXMgbm90IGRpc2NyaW1pbmF0ZSByYXdUcmVlIGluIHR5cGVzY3JpcHRANC4yLjMgYW5kKi9cbi8qIGVhcmxpZXIuKi9cbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbi8qIFRoZWlyIHFjbGFzcyBpcyB0aGVpciBleHByZXNzaW9uIHNvdXJjZS4qL1xucmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoZGlnaXRzLCdzdHJpbmcnKTtcbnJldHVybiBvdXQubmV4dCggYCR7QmlnSW50KGRpZ2l0cyl9bmApO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBUT0RPIGRlcHJlY2F0ZWQuIEV2ZW50dWFsbHkgcmVtb3ZlLiovXG5yZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbmNvbnN0IHJlZ2lzdGVyZWROYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKHJlZ2lzdGVyZWROYW1lPT09dW5kZWZpbmVkKXtcbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5hc3NlcnQobWF0Y2ghPT1udWxsKTtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmFzc2VydChTeW1ib2xbc3VmZml4XT09PXN5bSk7XG5hc3NlcnQoaWRlbnRQYXR0ZXJuLnRlc3Qoc3VmZml4KSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gfVxucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLmZvcigke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xub3V0Lm5leHQoIGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX0sYCk7XG5kZWNvZGUocGF5bG9hZCk7XG5yZXR1cm4gb3V0Lm5leHQoJyknKTtcbiB9XG5cbmNhc2Unc2xvdCc6e1xubGV0e2lmYWNlfT1yYXdUcmVlO1xuY29uc3QgaW5kZXg9TnVtYmVyKE5hdChyYXdUcmVlLmluZGV4KSk7XG5jb25zdCBuZXN0ZWRSZW5kZXI9KGFyZyk9PntcbmNvbnN0IG9sZE91dD1vdXQ7XG50cnl7XG5vdXQ9bWFrZU5vSW5kZW50ZXIoKTtcbmRlY29kZShhcmcpO1xucmV0dXJuIG91dC5kb25lKCk7XG4gfWZpbmFsbHl7XG5vdXQ9b2xkT3V0O1xuIH1cbiB9O1xuaWYoaW5kZXg8c2xvdHMubGVuZ3RoKXtcbmNvbnN0IHNsb3Q9bmVzdGVkUmVuZGVyKHNsb3RzW2luZGV4XSk7XG5pZihpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90VG9WYWwoJHtzbG90fSlgKTtcbiB9XG5pZmFjZT1uZXN0ZWRSZW5kZXIoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdFRvVmFsKCR7c2xvdH0sJHtpZmFjZX0pYCk7XG4gfWVsc2UgaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSlgKTtcbiB9XG5pZmFjZT1uZXN0ZWRSZW5kZXIoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSwke2lmYWNlfSlgKTtcbiB9XG5cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbm91dC5vcGVuKCd7Jyk7XG5kZWNvZGVQcm9wZXJ0eShRQ0xBU1Msb3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5hc3NlcnQudHlwZW9mKHJlc3QsJ29iamVjdCcpO1xuYXNzZXJ0KHJlc3QhPT1udWxsKTtcbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYFByb3BlcnR5IG5hbWUgJHtxKFxubmFtZSlcbiB9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gfVxuZGVjb2RlUHJvcGVydHkobmFtZSxyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cblxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xucmV0dXJuIG91dC5uZXh0KCBgJHtuYW1lfSgke3F1b3RlKG1lc3NhZ2UpfSlgKTtcbiB9XG5cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuaWYobGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gfWVsc2V7XG5vdXQub3BlbignWycpO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5vdXQubGluZSgpO1xuZGVjb2RlKHJhd1RyZWVbaV0pO1xub3V0Lm5leHQoJywnKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gfVxuIH1lbHNle1xuLyogcmF3VHJlZSBpcyBhbiBgRW5jb2RpbmdSZWNvcmRgIHdoaWNoIG9ubHkgaGFzIHN0cmluZyBrZXlzLCovXG4vKiBidXQgc2luY2Ugb3duS2V5cyBpcyBub3QgZ2VuZXJpYywgaXQgY2FuJ3QgcHJvcGFnYXRlIHRoYXQqL1xuY29uc3QgbmFtZXM9LyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJhd1RyZWUpO1xuaWYobmFtZXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ3t9Jyk7XG4gfWVsc2V7XG5vdXQub3BlbigneycpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuZGVjb2RlUHJvcGVydHkobmFtZSxyYXdUcmVlW25hbWVdKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuIH1cbiB9O1xucHJlcGFyZShlbmNvZGluZyk7XG5kZWNvZGUoZW5jb2RpbmcpO1xucmV0dXJuIG91dC5kb25lKCk7XG4gfTskaOKAjV9vbmNlLmRlY29kZVRvSnVzdGluKGRlY29kZVRvSnVzdGluKTtcbmhhcmRlbihkZWNvZGVUb0p1c3Rpbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAE9PVG9wGAADcBgAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc3siaW1wb3J0cyI6WyIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJwYXJzZSIsInN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlTWFyc2hhbDskaOKAjV9pbXBvcnRzKFtbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9hID0+IChtYWtlTWFyc2hhbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90PSh2YWwpPT5cbkZhaWwgYE1hcnNoYWwncyBzdHJpbmdpZnkgcmVqZWN0cyBwcmVzZW5jZXMgYW5kIHByb21pc2VzICR7dmFsfWA7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFNsb3RUb1ZhbD0oc2xvdCxfaWZhY2UpPT5cbkZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXI9aGFyZGVuKHtcbmdldDooX3RhcmdldCxuYW1lLF9yZWNlaXZlcik9PntcbmlmKG5hbWU9PT0nbGVuZ3RoJyl7XG5yZXR1cm4gMDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90IHBvc2l0aW9ucyAke25hbWV9YDtcbiB9fSk7XG5cblxuY29uc3QgYmFkQXJyYXk9aGFyZGVuKG5ldyBQcm94eShoYXJkZW4oW10pLGJhZEFycmF5SGFuZGxlcikpO1xuXG5jb25zdHtzZXJpYWxpemUsdW5zZXJpYWxpemV9PW1ha2VNYXJzaGFsKFxuZG9Ob3RDb252ZXJ0VmFsVG9TbG90LFxuZG9Ob3RDb252ZXJ0U2xvdFRvVmFsLFxue1xuZXJyb3JUYWdnaW5nOidvZmYnLFxuLyogVE9ETyBmaXggdGVzdHMgdG8gd29ya3Mgd2l0aCBzbWFsbGNhcHMuKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J2NhcGRhdGEnfSk7XG5cblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc3RyaW5naWZ5PSh2YWwpPT5zZXJpYWxpemUodmFsKS5ib2R5OyRo4oCNX29uY2Uuc3RyaW5naWZ5KHN0cmluZ2lmeSk7XG5oYXJkZW4oc3RyaW5naWZ5KTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IHBhcnNlPShzdHIpPT5cbnVuc2VyaWFsaXplKFxuaGFyZGVuKHtcbmJvZHk6c3RyLFxuc2xvdHM6YmFkQXJyYXl9KSk7JGjigI1fb25jZS5wYXJzZShwYXJzZSk7XG5cblxuaGFyZGVuKHBhcnNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdpZnkiOlsic3RyaW5naWZ5Il0sInBhcnNlIjpbInBhcnNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAL6eaUrsMgAA7DIAACMAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvbWFyc2hhbC5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vZW5jb2RlVG9TbWFsbGNhcHMuanMiLCJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LGFzc2VydFBhc3NhYmxlLGdldEludGVyZmFjZU9mLGdldEVycm9yQ29uc3RydWN0b3IsaGFzT3duUHJvcGVydHlPZixRQ0xBU1MsbWFrZUVuY29kZVRvQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbUNhcERhdGEsbWFrZURlY29kZUZyb21TbWFsbGNhcHMsbWFrZUVuY29kZVRvU21hbGxjYXBzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjigI1fYSldXSxbXCJtYWtlRGVjb2RlRnJvbUNhcERhdGFcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLk1ha2VNYXJzaGFsT3B0aW9uc30gTWFrZU1hcnNoYWxPcHRpb25zICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPFNsb3Q+fSBDb252ZXJ0U2xvdFRvVmFsICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBDb252ZXJ0VmFsVG9TbG90ICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Ub0NhcERhdGE8U2xvdD59IFRvQ2FwRGF0YSAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRnJvbUNhcERhdGE8U2xvdD59IEZyb21DYXBEYXRhICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cblxuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGUge0NvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbj0oeCk9Png7XG4vKiogQHR5cGUge0NvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbj0oeCxfKT0+eDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgU2xvdFxuICogQHBhcmFtIHtDb252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBbY29udmVydFZhbFRvU2xvdF1cbiAqIEBwYXJhbSB7Q29udmVydFNsb3RUb1ZhbDxTbG90Pn0gW2NvbnZlcnRTbG90VG9WYWxdXG4gKiBAcGFyYW0ge01ha2VNYXJzaGFsT3B0aW9uc30gb3B0aW9uc1xuICovXG5jb25zdCAgICAgICAgbWFrZU1hcnNoYWw9KFxuY29udmVydFZhbFRvU2xvdD1kZWZhdWx0VmFsVG9TbG90Rm4sXG5jb252ZXJ0U2xvdFRvVmFsPWRlZmF1bHRTbG90VG9WYWxGbixcbntcbmVycm9yVGFnZ2luZz0nb24nLFxubWFyc2hhbE5hbWU9J2Fub24tbWFyc2hhbCcsXG4vKiBUT0RPIFRlbXBvcmFyeSBoYWNrLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yNzgwKi9cbmVycm9ySWROdW09MTAwMDAsXG4vKiBXZSBwcmVmZXIgdGhhdCB0aGUgY2FsbGVyIGluc3RlYWQgbG9nIHRvIHNvbWV3aGVyZSBoaWRkZW4qL1xuLyogdG8gYmUgcmV2ZWFsZWQgd2hlbiBjb3JyZWxhdGluZyB3aXRoIHRoZSByZWNlaXZlZCBlcnJvci4qL1xubWFyc2hhbFNhdmVFcnJvcj0oZXJyKT0+XG5jb25zb2xlLmxvZygnVGVtcG9yYXJ5IGxvZ2dpbmcgb2Ygc2VudCBlcnJvcicsZXJyKSxcbi8qIERlZmF1bHQgdG8gJ2NhcGRhdGEnIGJlY2F1c2UgaXQgd2FzIGltcGxlbWVudGVkIGZpcnN0LiovXG4vKiBTb21ldGltZXMsIG9udG9nZW55IGRvZXMgcmVjYXBpdHVsYXRlIHBoeWxvZ2VueSA7KSovXG5zZXJpYWxpemVCb2R5Rm9ybWF0PSdjYXBkYXRhJ309XG57fSk9Plxue1xuYXNzZXJ0LnR5cGVvZihtYXJzaGFsTmFtZSwnc3RyaW5nJyk7XG5lcnJvclRhZ2dpbmc9PT0nb24nfHxcbmVycm9yVGFnZ2luZz09PSdvZmYnfHxcbkZhaWwgYFRoZSBlcnJvclRhZ2dpbmcgb3B0aW9uIGNhbiBvbmx5IGJlIFwib25cIiBvciBcIm9mZlwiICR7ZXJyb3JUYWdnaW5nfWA7XG5jb25zdCBuZXh0RXJyb3JJZD0oKT0+e1xuZXJyb3JJZE51bSs9MTtcbnJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7VG9DYXBEYXRhPFNsb3Q+fVxuICovXG5jb25zdCB0b0NhcERhdGE9KHJvb3QpPT57XG5jb25zdCBzbG90cz1bXTtcbi8qIG1hcHMgdmFsIChwcm9taXNlIG9yIHJlbW90YWJsZSkgdG8gaW5kZXggb2Ygc2xvdHNbXSovXG5jb25zdCBzbG90TWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZSB8IFByb21pc2V9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7e2luZGV4OiBudW1iZXIsIHJlcGVhdDogYm9vbGVhbn19XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RDb21tb249KHBhc3NhYmxlKT0+e1xubGV0IGluZGV4PXNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbmlmKGluZGV4IT09dW5kZWZpbmVkKXtcbi8qIFRPRE8gYXNzZXJ0IHRoYXQgaXQncyB0aGUgc2FtZSBpZmFjZSBhcyBiZWZvcmUqL1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6dHJ1ZX0pO1xuIH1cblxuaW5kZXg9c2xvdHMubGVuZ3RoO1xuY29uc3Qgc2xvdD1jb252ZXJ0VmFsVG9TbG90KHBhc3NhYmxlKTtcbnNsb3RzLnB1c2goc2xvdCk7XG5zbG90TWFwLnNldChwYXNzYWJsZSxpbmRleCk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6ZmFsc2V9KTtcbiB9O1xuXG4vKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIGlzRXJyb3JMaWtlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHVua25vd259IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX1cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JDb21tb249KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IG1lc3NhZ2U9ZW5jb2RlUmVjdXIoIGAke2Vyci5tZXNzYWdlfWApO1xuYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCdzdHJpbmcnKTtcbmNvbnN0IG5hbWU9ZW5jb2RlUmVjdXIoIGAke2Vyci5uYW1lfWApO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbi8qIE11c3QgZW5jb2RlIGBjYXVzZWAsIGBlcnJvcnNgLiovXG4vKiBuZXN0ZWQgbm9uLXBhc3NhYmxlIGVycm9ycyBtdXN0IGJlIG9rIGZyb20gaGVyZS4qL1xuaWYoZXJyb3JUYWdnaW5nPT09J29uJyl7XG4vKiBXZSBkZWxpYmVyYXRlbHkgZG8gbm90IHNoYXJlIHRoZSBzdGFjaywgYnV0IGl0IHdvdWxkKi9cbi8qIGJlIHVzZWZ1bCB0byBsb2cgdGhlIHN0YWNrIGxvY2FsbHkgc28gc29tZW9uZSB3aG8gaGFzKi9cbi8qIHByaXZpbGVnZWQgYWNjZXNzIHRvIHRoZSB0aHJvd2luZyBWYXQgY2FuIGNvcnJlbGF0ZSovXG4vKiB0aGUgcHJvYmxlbSB3aXRoIHRoZSByZW1vdGUgVmF0IHRoYXQgZ2V0cyB0aGlzKi9cbi8qIHN1bW1hcnkuIElmIHdlIGRvIHRoYXQsIHdlIGNvdWxkIGFsbG9jYXRlIHNvbWUgcmFuZG9tKi9cbi8qIGlkZW50aWZpZXIgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIG1lc3NhZ2UsIHRvIGhlbHAqL1xuLyogd2l0aCB0aGUgY29ycmVsYXRpb24uKi9cbmNvbnN0IGVycm9ySWQ9ZW5jb2RlUmVjdXIobmV4dEVycm9ySWQoKSk7XG5hc3NlcnQudHlwZW9mKGVycm9ySWQsJ3N0cmluZycpO1xuYXNzZXJ0Lm5vdGUoZXJyLFggYFNlbnQgYXMgJHtlcnJvcklkfWApO1xubWFyc2hhbFNhdmVFcnJvcihlcnIpO1xucmV0dXJuIGhhcmRlbih7ZXJyb3JJZCxtZXNzYWdlLG5hbWV9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe21lc3NhZ2UsbmFtZX0pO1xuIH1cbiB9O1xuXG5pZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J2NhcGRhdGEnKXtcbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9DYXBEYXRhPShwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaW5kZXh9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidzbG90JyxpZmFjZSxpbmRleH0pO1xuIH1cbiB9O1xuXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHZhbCxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEodmFsLGdldEludGVyZmFjZU9mKHZhbCkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YShwcm9taXNlKTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ30gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidlcnJvcicsLi4uZXJyRGF0YX0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT1tYWtlRW5jb2RlVG9DYXBEYXRhKHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9DYXBEYXRhKHJvb3QpO1xuY29uc3QgYm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuYm9keSxcbnNsb3RzfSk7XG5cbiB9ZWxzZSBpZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J3NtYWxsY2Fwcycpe1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9TbWFsbGNhcHM9KHByZWZpeCxwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4vKiBUT0RPIGV4cGxvcmUgcmVtb3ZpbmcgdGhpcyBzcGVjaWFsIGNhc2UqL1xuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gfVxucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbW90YWJsZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcscmVtb3RhYmxlLGdldEludGVyZmFjZU9mKHJlbW90YWJsZSkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyYnLHByb21pc2UpO1xuXG5jb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5jb25zdHttZXNzYWdlLC4uLnJlc3R9PWVyckRhdGE7XG5yZXR1cm4gaGFyZGVuKHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3R9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz1tYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbi8qIFZhbGlkIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYSB2YWxpZCBzaWduYWwqL1xuLyogaW5kaWNhdGluZyBzbWFsbGNhcHMgZm9ybWF0LiovXG5ib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuc2xvdHN9KTtcblxuIH1lbHNle1xuLyogVGhlIGB0aHJvd2AgaXMgYSBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEFkZGVkIGZvciBjb25mdXNlZCBsaW50ZXJzLiovXG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VGdWxsUmV2aXZlPShzbG90cyk9Pntcbi8qKiBAdHlwZSB7TWFwPG51bWJlciwgUGFzc2FibGU+fSAqL1xuY29uc3QgdmFsTWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge3tpZmFjZT86IHN0cmluZywgaW5kZXg6IG51bWJlcn19IHNsb3REYXRhXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlIHwgUHJvbWlzZX1cbiAqL1xuY29uc3QgZGVjb2RlU2xvdENvbW1vbj0oc2xvdERhdGEpPT57XG5jb25zdHtpZmFjZT11bmRlZmluZWQsaW5kZXgsLi4ucmVzdH09c2xvdERhdGE7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIHNsb3QgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbmlmKHZhbE1hcC5oYXMoaW5kZXgpKXtcbnJldHVybiB2YWxNYXAuZ2V0KGluZGV4KTtcbiB9XG4vKiBUT0RPIFNFQ1VSSVRZIEhBWkFSRDogbXVzdCBlbmZvY2UgdGhhdCByZW1vdGFibGUgdnMgcHJvbWlzZSovXG4vKiBpcyBhY2NvcmRpbmcgdG8gdGhlIGVuY29kZWQgc3RyaW5nLiovXG5jb25zdCBzbG90PXNsb3RzW051bWJlcihOYXQoaW5kZXgpKV07XG5jb25zdCB2YWw9Y29udmVydFNsb3RUb1ZhbChzbG90LGlmYWNlKTtcbnZhbE1hcC5zZXQoaW5kZXgsdmFsKTtcbnJldHVybiB2YWw7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319IGVyckRhdGFcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBkZWNvZGVSZWN1clxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5jb25zdCBkZWNvZGVFcnJvckNvbW1vbj0oZXJyRGF0YSxkZWNvZGVSZWN1cik9PntcbmNvbnN0e2Vycm9ySWQ9dW5kZWZpbmVkLG1lc3NhZ2UsbmFtZSwuLi5yZXN0fT1lcnJEYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuLyogVE9ETyBNdXN0IGRlY29kZSBgY2F1c2VgIGFuZCBgZXJyb3JzYCBwcm9wZXJ0aWVzKi9cbi8qIGNhcERhdGEgZG9lcyBub3QgdHJhbnNmb3JtIHN0cmluZ3MuIFRoZSBjYWxscyB0byBgZGVjb2RlUmVjdXJgKi9cbi8qIGFyZSBmb3IgcmV1c2UgYnkgb3RoZXIgZW5jb2RpbmdzIHRoYXQgZG8sIHN1Y2ggYXMgc21hbGxjYXBzLiovXG5jb25zdCBkTmFtZT1kZWNvZGVSZWN1cihuYW1lKTtcbmNvbnN0IGRNZXNzYWdlPWRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuY29uc3QgZEVycm9ySWQ9ZXJyb3JJZCYmZGVjb2RlUmVjdXIoZXJyb3JJZCk7XG50eXBlb2YgZE5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG50eXBlb2YgZE1lc3NhZ2U9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgZE1lc3NhZ2UpfWA7XG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKGROYW1lKXx8RXJyb3I7XG4vKiBlcnJvcklkIGlzIGEgbGF0ZSBhZGRpdGlvbiBzbyBiZSB0b2xlcmFudCBvZiBpdHMgYWJzZW5jZS4qL1xuY29uc3QgZXJyb3JOYW1lPVxuZEVycm9ySWQ9PT11bmRlZmluZWQ/XG4gYFJlbW90ZSR7RUMubmFtZX1gOlxuIGBSZW1vdGUke0VDLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG5jb25zdCBlcnJvcj1hc3NlcnQuZXJyb3IoZE1lc3NhZ2UsRUMse2Vycm9yTmFtZX0pO1xucmV0dXJuIGhhcmRlbihlcnJvcik7XG4gfTtcblxuLyogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaCovXG4vKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb24qL1xuLyogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUqL1xuLyogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNCovXG5jb25zdCBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0ocmF3VHJlZSxfZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLnNsb3REYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oc2xvdERhdGEpO1xuIH07XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbUNhcERhdGE9KHJhd1RyZWUsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLmVyckRhdGF9PXJhd1RyZWU7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oZXJyRGF0YSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbUNhcERhdGE9bWFrZURlY29kZUZyb21DYXBEYXRhKHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2Fwcz0ocHJlZml4KT0+e1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nRW5jb2RpbmdcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBfZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtSZW1vdGFibGUgfCBQcm9taXNlfVxuICovXG5yZXR1cm4oc3RyaW5nRW5jb2RpbmcsX2RlY29kZVJlY3VyKT0+e1xuYXNzZXJ0KHN0cmluZ0VuY29kaW5nLnN0YXJ0c1dpdGgocHJlZml4KSk7XG4vKiBzbG90czogJHNsb3RJbmRleC5pZmFjZSBvciAkc2xvdEluZGV4Ki9cbmNvbnN0IGk9c3RyaW5nRW5jb2RpbmcuaW5kZXhPZignLicpO1xuY29uc3QgaW5kZXg9TnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsaTwwP3VuZGVmaW5lZDppKSk7XG4vKiBpIDwgMCBtZWFucyB0aGVyZSB3YXMgbm8gaWZhY2UgaW5jbHVkZWQuKi9cbmNvbnN0IGlmYWNlPWk8MD91bmRlZmluZWQ6c3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSsxKTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHtpZmFjZSxpbmRleH0pO1xuIH07XG4gfTtcbmNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG5jb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyxkZWNvZGVSZWN1cik9PntcbmNvbnN0eycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdEVyckRhdGF9PWVuY29kaW5nO1xuIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsJ21lc3NhZ2UnKXx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX0sZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZUZyb21TbWFsbGNhcHMoe1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc30pO1xuIH07XG5cbi8qKlxuICogQHR5cGUge0Zyb21DYXBEYXRhPFNsb3Q+fVxuICovXG5jb25zdCBmcm9tQ2FwRGF0YT0oZGF0YSk9PntcbmNvbnN0e2JvZHksc2xvdHN9PWRhdGE7XG50eXBlb2YgYm9keT09PSdzdHJpbmcnfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5ib2R5IGlzICR7Ym9keX0sIG5vdCBzdHJpbmcpYDtcbmlzQXJyYXkoZGF0YS5zbG90cyl8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbmNvbnN0e3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9PW1ha2VGdWxsUmV2aXZlKHNsb3RzKTtcbmxldCByZXN1bHQ7XG4vKiBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGFuIHVuYW1iaWd1b3VzIHNpZ25hbC4qL1xuaWYoYm9keS5zdGFydHNXaXRoKCcjJykpe1xuY29uc3Qgc21hbGxjYXBzQm9keT1ib2R5LnNsaWNlKDEpO1xuY29uc3QgZW5jb2Rpbmc9aGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tU21hbGxjYXBzKGVuY29kaW5nKSk7XG4gfWVsc2V7XG5jb25zdCByYXdUcmVlPWhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbUNhcERhdGEocmF3VHJlZSkpO1xuIH1cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzcqL1xuLyogd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZml4ZWQgb25jZSB3ZSd2ZSBjb21wbGV0ZWQgdGhlIHN3aXRjaCovXG4vKiB0byBzbWFsbGNhcHMuKi9cbmFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbnJldHVybiBoYXJkZW4oe1xudG9DYXBEYXRhLFxuZnJvbUNhcERhdGEsXG5cbi8qIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSovXG4vKiogQGRlcHJlY2F0ZWQgdXNlIHRvQ2FwRGF0YSAqL1xuc2VyaWFsaXplOnRvQ2FwRGF0YSxcbi8qKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUNhcERhdGEgKi9cbnVuc2VyaWFsaXplOmZyb21DYXBEYXRhfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZU1hcnNoYWwobWFrZU1hcnNoYWwpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFdEZAp+QAAAfkAAACUAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlUGFzc2FibGUuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdldFRhZyxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc1N0eWxlUHJlZml4ZXMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmFua0NvdmVyfSBSYW5rQ292ZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb21wYXJpc29ufSBSYW5rQ29tcGFyaXNvbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzLHNldFByb3RvdHlwZU9mLGlzfT1PYmplY3Q7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmFua0NvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGdWxsQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbbnVtYmVyLCBudW1iZXJdfSBJbmRleENvdmVyXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uIHVzZWQgYnkgSmF2YVNjcmlwdCdzIE1hcCBhbmQgU2V0XG4gKiBhYnN0cmFjdGlvbnMsIHdoZXJlIE5hTiBpcyB0aGUgc2FtZSBhcyBOYU4gYW5kIC0wIGlzIHRoZSBzYW1lIGFzXG4gKiAwLiBNYXJzaGFsIHNlcmlhbGl6ZXMgLTAgYXMgemVybywgc28gdGhlIHNlbWFudGljcyBvZiBvdXIgZGlzdHJpYnV0ZWRcbiAqIG9iamVjdCBzeXN0ZW0gZG9lcyBub3QgZGlzdGluZ3Vpc2ggMCBmcm9tIC0wLlxuICpcbiAqIGBzYW1lVmFsdWVaZXJvYCBpcyB0aGUgRWNtYVNjcmlwdCBzcGVjIG5hbWUgZm9yIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbixcbiAqIGJ1dCBUT0RPIHdlIG5lZWQgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIEFQSS5cbiAqXG4gKiBAcGFyYW0ge2FueX0geFxuICogQHBhcmFtIHthbnl9IHlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvPSh4LHkpPT54PT09eXx8aXMoeCx5KTtcblxuY29uc3QgdHJpdmlhbENvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSwgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG5sZWZ0PHJpZ2h0Py0xOmxlZnQ9PT1yaWdodD8wOjE7XG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxQYXNzU3R5bGUsIHsgaW5kZXg6IG51bWJlciwgY292ZXI6IFJhbmtDb3ZlciB9Pn0gUGFzc1N0eWxlUmFua3NSZWNvcmRcbiAqL1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcz0vKiogQHR5cGUge1Bhc3NTdHlsZVJhbmtzUmVjb3JkfSAqL1xuZnJvbUVudHJpZXMoXG5lbnRyaWVzKHBhc3NTdHlsZVByZWZpeGVzKVxuLyogU29ydCBlbnRyaWVzIGJ5IGFzY2VuZGluZyBwcmVmaXguKi8uXG5zb3J0KChbX2xlZnRTdHlsZSxsZWZ0UHJlZml4ZXNdLFtfcmlnaHRTdHlsZSxyaWdodFByZWZpeGVzXSk9PntcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0UHJlZml4ZXMscmlnaHRQcmVmaXhlcyk7XG4gfSkuXG5tYXAoKFtwYXNzU3R5bGUscHJlZml4ZXNdLGluZGV4KT0+e1xuLyogQ292ZXIgYWxsIHN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGFueSBjaGFyYWN0ZXIgaW4gYHByZWZpeGVzYCwqL1xuLyogdmVyaWZ5aW5nIHRoYXQgaXQgaXMgc29ydGVkIHNvIHRoYXQgaXMqL1xuLyogYWxsIHMgc3VjaCB0aGF0IHByZWZpeGVzLmF0KDApIOKJpCBzIDwgc3VjY2Vzc29yKHByZWZpeGVzLmF0KC0xKSkuKi9cbnByZWZpeGVzPT09Wy4uLnByZWZpeGVzXS5zb3J0KCkuam9pbignJyl8fFxuRmFpbCBgdW5zb3J0ZWQgcHJlZml4ZXMgZm9yIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7cShwcmVmaXhlcyl9YDtcbmNvbnN0IGNvdmVyPVtcbnByZWZpeGVzLmNoYXJBdCgwKSxcblN0cmluZy5mcm9tQ2hhckNvZGUocHJlZml4ZXMuY2hhckNvZGVBdChwcmVmaXhlcy5sZW5ndGgtMSkrMSldO1xuXG5yZXR1cm5bcGFzc1N0eWxlLHtpbmRleCxjb3Zlcn1dO1xuIH0pKTtcblxuXG5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVSYW5rcyxudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qKlxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKlxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldFBhc3NTdHlsZUNvdmVyPShwYXNzU3R5bGUpPT5wYXNzU3R5bGVSYW5rc1twYXNzU3R5bGVdLmNvdmVyOyRo4oCNX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxXZWFrU2V0PFBhc3NhYmxlW10+Pn1cbiAqL1xuY29uc3QgbWVtb09mU29ydGVkPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsUmFua0NvbXBhcmU+fVxuICovXG5jb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZT19IGNvbXBhcmVSZW1vdGFibGVzXG4gKiBBbiBvcHRpb24gdG8gY3JlYXRlIGEgY29tcGFyYXRvciBpbiB3aGljaCBhbiBpbnRlcm5hbCBvcmRlciBpc1xuICogYXNzaWduZWQgdG8gcmVtb3RhYmxlcy4gVGhpcyBkZWZhdWx0cyB0byBhIGNvbXBhcmF0b3IgdGhhdFxuICogYWx3YXlzIHJldHVybnMgYDBgLCBtZWFuaW5nIHRoYXQgYWxsIHJlbW90YWJsZXMgYXJlIHRpZWRcbiAqIGZvciB0aGUgc2FtZSByYW5rLlxuICogQHJldHVybnMge1JhbmtDb21wYXJhdG9yS2l0fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvbXBhcmF0b3JLaXQ9KGNvbXBhcmVSZW1vdGFibGVzPShfeCxfeSk9PjApPT57XG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgY29tcGFyYXRvcj0obGVmdCxyaWdodCk9PntcbmlmKHNhbWVWYWx1ZVplcm8obGVmdCxyaWdodCkpe1xucmV0dXJuIDA7XG4gfVxuY29uc3QgbGVmdFN0eWxlPXBhc3NTdHlsZU9mKGxlZnQpO1xuY29uc3QgcmlnaHRTdHlsZT1wYXNzU3R5bGVPZihyaWdodCk7XG5pZihsZWZ0U3R5bGUhPT1yaWdodFN0eWxlKXtcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihcbnBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG5wYXNzU3R5bGVSYW5rc1tyaWdodFN0eWxlXS5pbmRleCk7XG5cbiB9XG4vKiBlc2xpbnQtZGlzYWJsZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzIC0tXG4gKiBXZSBrbm93IGBsZWZ0YCBhbmQgYHJpZ2h0YCBhcmUgY29tcGFyYWJsZS5cbiAqL1xuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xuLyogRm9yIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgYWxsIG1lbWJlcnMgb2YgdGhhdCBwYXNzU3R5bGUgYXJlIHRpZWQqL1xuLyogZm9yIHRoZSBzYW1lIHJhbmsuKi9cbnJldHVybiAwO1xuIH1cbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6e1xuLyogV2l0aGluIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgdGhlIHJhbmsgb3JkZXJpbmcgYWdyZWVzIHdpdGgqL1xuLyogSmF2YVNjcmlwdCdzIHJlbGF0aW9uYWwgb3BlcmF0b3JzIGA8YCBhbmQgYD5gLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gY29tcGFyYXRvcihcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCkpO1xuXG4gfVxuY2FzZSdudW1iZXInOntcbi8qIGBOYU5gJ3MgcmFuayBpcyBhZnRlciBhbGwgb3RoZXIgbnVtYmVycy4qL1xuaWYoTnVtYmVyLmlzTmFOKGxlZnQpKXtcbmFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbnJldHVybi0xO1xuIH1cbi8qIFRoZSByYW5rIG9yZGVyaW5nIG9mIG5vbi1OYU4gbnVtYmVycyBhZ3JlZXMgd2l0aCBKYXZhU2NyaXB0J3MqL1xuLyogcmVsYXRpb25hbCBvcGVyYXRvcnMgJzwnIGFuZCAnPicuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGludmVyc2Ugc29ydGVkIG9yZGVyIG9mIHByb3BlcnR5IG5hbWVzLCB0aGVuKi9cbi8qIGxleGljb2dyYXBoaWMgYnkgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhhdCBzYW1lIGludmVyc2UqL1xuLyogb3JkZXIgb2YgdGhlaXIgcHJvcGVydHkgbmFtZXMuIENvbXBhcmluZyBuYW1lcyBieSB0aGVtc2VsdmVzIGZpcnN0LCovXG4vKiBhbGwgcmVjb3JkcyB3aXRoIHRoZSBleGFjdCBzYW1lIHNldCBvZiBwcm9wZXJ0eSBuYW1lcyBzb3J0IG5leHQgdG8qL1xuLyogZWFjaCBvdGhlciBpbiBhIHJhbmstc29ydCBvZiBjb3B5UmVjb3Jkcy4qL1xuXG4vKiBUaGUgY29weVJlY29yZCBpbnZhcmlhbnRzIGVuZm9yY2VkIGJ5IHBhc3NTdHlsZU9mIGVuc3VyZSB0aGF0Ki9cbi8qIGFsbCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIHN0cmluZ3MuIFdlIG5lZWQgdGhlIHJldmVyc2Ugc29ydGVkIG9yZGVyKi9cbi8qIG9mIHRoZXNlIG5hbWVzLCB3aGljaCB3ZSB0aGVuIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgZW5zdXJlcyovXG4vKiB0aGF0IGlmIHRoZSBuYW1lcyBvZiByZWNvcmQgWCBhcmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHJlY29yZCBZLCovXG4vKiB0aGVuIHJlY29yZCBYIHdpbGwgaGF2ZSBhbiBlYXJsaWVyIHJhbmsgYW5kIHNvcnQgdG8gdGhlIGxlZnQgb2YgWS4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnROYW1lcyxyaWdodE5hbWVzKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihcbnJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyksXG5yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcykpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMqL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgd2VyZSB0aWVkLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBJZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBoYXMgYW4gZWFybGllciByYW5rIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBgW1N5bWJvbC50b1N0cmluZ1RhZ11gIHRoZW4gYC5wYXlsb2FkYC4qL1xuY29uc3QgbGFiZWxDb21wPWNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLGdldFRhZyhyaWdodCkpO1xuaWYobGFiZWxDb21wIT09MCl7XG5yZXR1cm4gbGFiZWxDb21wO1xuIH1cbnJldHVybiBjb21wYXJhdG9yKGxlZnQucGF5bG9hZCxyaWdodC5wYXlsb2FkKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gfX1cblxuLyogZXNsaW50LWVuYWJsZSAqL1xuIH07XG5cbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBhbnRpQ29tcGFyYXRvcj0oeCx5KT0+Y29tcGFyYXRvcih5LHgpO1xuXG5tZW1vT2ZTb3J0ZWQuc2V0KGNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5tZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoY29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcik7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvcixjb21wYXJhdG9yKTtcblxucmV0dXJuIGhhcmRlbih7Y29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcn0pO1xuIH07XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyZT19XG4gKi8kaOKAjV9vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbmNvbnN0ICAgICAgICBjb21wYXJhdG9yTWlycm9ySW1hZ2U9KGNvbXBhcmF0b3IpPT5cbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuY29tcGFyYXRvck1pcnJvckltYWdlKGNvbXBhcmF0b3JNaXJyb3JJbWFnZSk7XG5jb25zdCAgICAgICAgaXNSYW5rU29ydGVkPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5pZihzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpe1xucmV0dXJuIHRydWU7XG4gfVxuYXNzZXJ0KHBhc3NTdHlsZU9mKHBhc3NhYmxlcyk9PT0nY29weUFycmF5Jyk7XG5mb3IobGV0IGk9MTtpPHBhc3NhYmxlcy5sZW5ndGg7aSs9MSl7XG5pZihjb21wYXJlKHBhc3NhYmxlc1tpLTFdLHBhc3NhYmxlc1tpXSk+PTEpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UmFua1NvcnRlZD0oc29ydGVkLGNvbXBhcmUpPT5cbmlzUmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSl8fFxuLyogVE9ETyBhc3NlcnQgb24gYnVnIGNvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLiBGaXguKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5GYWlsIGBNdXN0IGJlIHJhbmsgc29ydGVkOiAke3NvcnRlZH0gdnMgJHtzb3J0QnlSYW5rKHNvcnRlZCxjb21wYXJlKX1gOyRo4oCNX29uY2UuYXNzZXJ0UmFua1NvcnRlZChhc3NlcnRSYW5rU29ydGVkKTtcbmhhcmRlbihhc3NlcnRSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBUT0RPIFNFQ1VSSVRZIEJVRzogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MjYwXG4gKiBzb3J0QnlSYW5rIGN1cnJlbnRseSB1c2VzIGBBcnJheS5wcm90b3R5cGUuc29ydGAgZGlyZWN0bHksIGFuZFxuICogc28gb25seSB3b3JrcyBjb3JyZWN0bHkgd2hlbiBnaXZlbiBhIGBjb21wYXJlYCBmdW5jdGlvbiB0aGF0IGNvbnNpZGVyc1xuICogYHVuZGVmaW5lZGAgc3RyaWN0bHkgYmlnZ2VyIChgPmApIHRoYW4gZXZlcnl0aGluZyBlbHNlLiBUaGlzIGlzXG4gKiBiZWNhdXNlIGBBcnJheS5wcm90b3R5cGUuc29ydGAgYml6YXJyZWx5IG1vdmVzIGFsbCBgdW5kZWZpbmVkYHMgdG9cbiAqIHRoZSBlbmQgb2YgdGhlIGFycmF5IHJlZ2FyZGxlc3MsIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgYGNvbXBhcmVgXG4gKiBmdW5jdGlvbi4gVGhpcyBpcyBhIGdlbnVpbmUgYnVnIGZvciB1cyBOT1cgYmVjYXVzZSBzb21ldGltZXMgd2Ugc29ydFxuICogaW4gcmV2ZXJzZSBvcmRlciBieSBwYXNzaW5nIGEgcmV2ZXJzZWQgcmFuayBjb21wYXJpc29uIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SXRlcmFibGU8UGFzc2FibGU+fSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtQYXNzYWJsZVtdfVxuICovXG5jb25zdCAgICAgICAgc29ydEJ5UmFuaz0ocGFzc2FibGVzLGNvbXBhcmUpPT57XG5pZihBcnJheS5pc0FycmF5KHBhc3NhYmxlcykpe1xuaGFyZGVuKHBhc3NhYmxlcyk7XG4vKiBDYWxsaW5nIGlzUmFua1NvcnRlZCBnaXZlcyBpdCBhIGNoYW5jZSB0byBnZXQgbWVtb2l6ZWQgZm9yKi9cbi8qIHRoaXMgYGNvbXBhcmVgIGZ1bmN0aW9uIGV2ZW4gaWYgaXQgd2FzIGFscmVhZHkgbWVtb2l6ZWQgZm9yIGEgZGlmZmVyZW50Ki9cbi8qIGBjb21wYXJlYCBmdW5jdGlvbi4qL1xuaWYoaXNSYW5rU29ydGVkKHBhc3NhYmxlcyxjb21wYXJlKSl7XG5yZXR1cm4gcGFzc2FibGVzO1xuIH1cbiB9XG5jb25zdCB1bnNvcnRlZD1bLi4ucGFzc2FibGVzXTtcbnVuc29ydGVkLmZvckVhY2goaGFyZGVuKTtcbmNvbnN0IHNvcnRlZD1oYXJkZW4odW5zb3J0ZWQuc29ydChjb21wYXJlKSk7XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuc3ViTWVtb09mU29ydGVkLmFkZChzb3J0ZWQpO1xucmV0dXJuIHNvcnRlZDtcbiB9OyRo4oCNX29uY2Uuc29ydEJ5UmFuayhzb3J0QnlSYW5rKTtcbmhhcmRlbihzb3J0QnlSYW5rKTtcblxuLyoqXG4gKiBTZWVcbiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpbmFyeV9zZWFyY2hfYWxnb3JpdGhtI1Byb2NlZHVyZV9mb3JfZmluZGluZ190aGVfbGVmdG1vc3RfZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBrZXlcbiAqIEBwYXJhbSB7KFwibGVmdE1vc3RcIiB8IFwicmlnaHRNb3N0XCIpPX0gYmlhc1xuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgcmFua1NlYXJjaD0oc29ydGVkLGNvbXBhcmUsa2V5LGJpYXM9J2xlZnRNb3N0Jyk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xubGV0IGxlZnQ9MDtcbmxldCByaWdodD1zb3J0ZWQubGVuZ3RoO1xud2hpbGUobGVmdDxyaWdodCl7XG5jb25zdCBtPU1hdGguZmxvb3IoKGxlZnQrcmlnaHQpLzIpO1xuY29uc3QgY29tcD1jb21wYXJlKHNvcnRlZFttXSxrZXkpO1xuaWYoY29tcDw9LTF8fGNvbXA9PT0wJiZiaWFzPT09J3JpZ2h0TW9zdCcpe1xubGVmdD1tKzE7XG4gfWVsc2V7XG5hc3NlcnQoY29tcD49MXx8Y29tcD09PTAmJmJpYXM9PT0nbGVmdE1vc3QnKTtcbnJpZ2h0PW07XG4gfVxuIH1cbnJldHVybiBiaWFzPT09J2xlZnRNb3N0Jz9sZWZ0OnJpZ2h0LTE7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IHJhbmtDb3ZlclxuICogQHJldHVybnMge0luZGV4Q292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRJbmRleENvdmVyPShzb3J0ZWQsY29tcGFyZSxbbGVmdEtleSxyaWdodEtleV0pPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmNvbnN0IGxlZnRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLGxlZnRLZXksJ2xlZnRNb3N0Jyk7XG5jb25zdCByaWdodEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUscmlnaHRLZXksJ3JpZ2h0TW9zdCcpO1xucmV0dXJuW2xlZnRJbmRleCxyaWdodEluZGV4XTtcbiB9OyRo4oCNX29uY2UuZ2V0SW5kZXhDb3ZlcihnZXRJbmRleENvdmVyKTtcbmhhcmRlbihnZXRJbmRleENvdmVyKTtcblxuLyoqIEB0eXBlIHtSYW5rQ292ZXJ9ICovXG5jb25zdCAgICAgICAgRnVsbFJhbmtDb3Zlcj1oYXJkZW4oWycnLCd7J10pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge0luZGV4Q292ZXJ9IGluZGV4Q292ZXJcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fVxuICovJGjigI1fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuY29uc3QgICAgICAgIGNvdmVyZWRFbnRyaWVzPShzb3J0ZWQsW2xlZnRJbmRleCxyaWdodEluZGV4XSk9Pntcbi8qKiBAdHlwZSB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn0gKi9cbmNvbnN0IGl0ZXJhYmxlPWhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xubGV0IGk9bGVmdEluZGV4O1xucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG5pZihpPD1yaWdodEluZGV4KXtcbmNvbnN0IGVsZW1lbnQ9c29ydGVkW2ldO1xuaSs9MTtcbnJldHVybiBoYXJkZW4oe3ZhbHVlOltpLGVsZW1lbnRdLGRvbmU6ZmFsc2V9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe3ZhbHVlOnVuZGVmaW5lZCxkb25lOnRydWV9KTtcbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLmNvdmVyZWRFbnRyaWVzKGNvdmVyZWRFbnRyaWVzKTtcbmhhcmRlbihjb3ZlcmVkRW50cmllcyk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBtYXhSYW5rPShjb21wYXJlLGEsYik9PmNvbXBhcmUoYSxiKT49MD9hOmI7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBtaW5SYW5rPShjb21wYXJlLGEsYik9PmNvbXBhcmUoYSxiKTw9MD9hOmI7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgdW5pb25SYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCB1bmlvblJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWluUmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1heFJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKHVuaW9uUmFua0NvdmVyUGFpcixbJ3snLCcnXSk7XG4gfTskaOKAjV9vbmNlLnVuaW9uUmFua0NvdmVycyh1bmlvblJhbmtDb3ZlcnMpO1xuaGFyZGVuKHVuaW9uUmFua0NvdmVycyk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgaW50ZXJzZWN0UmFua0NvdmVycz0oY29tcGFyZSxjb3ZlcnMpPT57XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgaW50ZXJzZWN0UmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5tYXhSYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWluUmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UoaW50ZXJzZWN0UmFua0NvdmVyUGFpcixbJycsJ3snXSk7XG4gfTskaOKAjV9vbmNlLmludGVyc2VjdFJhbmtDb3ZlcnMoaW50ZXJzZWN0UmFua0NvdmVycyk7XG5cbmNvbnN0ICAgICAgIHtjb21wYXJhdG9yOmNvbXBhcmVSYW5rLGFudGlDb21wYXJhdG9yOmNvbXBhcmVBbnRpUmFua309XG5tYWtlQ29tcGFyYXRvcktpdCgpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNvbXBhcmF0b3Iga2l0IGluIHdoaWNoIHJlbW90YWJsZXMgYXJlIGZ1bGx5IG9yZGVyZWRcbiAqIGJ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBmaXJzdCBzZWVuIGJ5ICp0aGlzKiBjb21wYXJhdG9yIGtpdC5cbiAqIEJFV0FSRTogVGhpcyBpcyBvYnNlcnZhYmxlIG11dGFibGUgc3RhdGUsIHNvIHN1Y2ggYSBjb21wYXJhdG9yIGtpdFxuICogc2hvdWxkIG5ldmVyIGJlIHNoYXJlZCBhbW9uZyBzdWJzeXN0ZW1zIHRoYXQgc2hvdWxkIG5vdCBiZSBhYmxlXG4gKiB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBvcmRlciBkb2VzIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgZm9yIHN0b3JlXG4gKiBvcmRlcmluZywgc2luY2UgaXQgaGFzIG5vIG1lbW9yeSBvZiBkZWxldGVkIGtleXMuXG4gKlxuICogVGhlc2UgZnVsbCBvcmRlciBjb21wYXJhdG9yIGtpdCBpcyBzdHJpY3RseSBtb3JlIHByZWNpc2UgdGhhdCB0aGVcbiAqIHJhbmsgb3JkZXIgY29tcGFyYXRvciBraXRzIGFib3ZlLiBBcyBhIHJlc3VsdCwgYW55IGFycmF5IHdoaWNoIGlzXG4gKiBzb3J0ZWQgYnkgc3VjaCBhIGZ1bGwgb3JkZXIgd2lsbCBwYXNzIHRoZSBpc1JhbmtTb3J0ZWQgdGVzdCB3aXRoXG4gKiBhIGNvcnJlc3BvbmRpbmcgcmFuayBvcmRlci5cbiAqXG4gKiBBbiBhcnJheSB3aGljaCBpcyBzb3J0ZWQgYnkgYSAqZnJlc2gqIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgaS5lLixcbiAqIG9uZSB0aGF0IGhhcyBub3QgeWV0IHNlZW4gYW55IHJlbW90YWJsZXMsIHdpbGwgb2YgY291cnNlIHJlbWFpblxuICogc29ydGVkIGJ5IGFjY29yZGluZyB0byAqdGhhdCogZnVsbCBvcmRlciBjb21wYXJhdG9yLiBBbiBhcnJheSAqb2ZcbiAqIHNjYWxhcnMqIHNvcnRlZCBieSBhIGZyZXNoIGZ1bGwgb3JkZXIgd2lsbCByZW1haW4gc29ydGVkIGV2ZW5cbiAqIGFjY29yZGluZyB0byBhIG5ldyBmcmVzaCBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIHNpbmNlIGl0IHdpbGwgc2VlXG4gKiB0aGUgcmVtb3RhYmxlcyBpbiB0aGUgc2FtZSBvcmRlciBhZ2Fpbi4gVW5mb3J0dW5hdGVseSwgdGhpcyBpc1xuICogbm90IHRydWUgb2YgYXJyYXlzIG9mIHBhc3NhYmxlcyBpbiBnZW5lcmFsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxvbmdMaXZlZFxuICogQHJldHVybnMge0Z1bGxDb21wYXJhdG9yS2l0fVxuICovJGjigI1fb25jZS5jb21wYXJlUmFuayhjb21wYXJlUmFuayk7JGjigI1fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0ICAgICAgICBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdD0obG9uZ0xpdmVkPWZhbHNlKT0+e1xubGV0IG51bVNlZW49MDtcbi8qIFdoZW4gZHluYW1pY2FsbHkgY3JlYXRlZCB3aXRoIHNob3J0IGxpZmV0aW1lcyAodGhlIGRlZmF1bHQpIGEgV2Vha01hcCovXG4vKiB3b3VsZCBwZXJmb3JtIHBvb3JseSwgYW5kIHRoZSBsZWFrIGNyZWF0ZWQgYnkgYSBNYXAgb25seSBsYXN0cyBhcyBsb25nKi9cbi8qIGFzIHRoZSBNYXAuKi9cbmNvbnN0IE1hcENvbnN0cnVjdG9yPWxvbmdMaXZlZD9XZWFrTWFwOk1hcDtcbmNvbnN0IHNlZW49bmV3IE1hcENvbnN0cnVjdG9yKCk7XG5jb25zdCB0YWc9KHIpPT57XG5pZihzZWVuLmhhcyhyKSl7XG5yZXR1cm4gc2Vlbi5nZXQocik7XG4gfVxubnVtU2Vlbis9MTtcbnNlZW4uc2V0KHIsbnVtU2Vlbik7XG5yZXR1cm4gbnVtU2VlbjtcbiB9O1xuY29uc3QgY29tcGFyZVJlbW90YWJsZXM9KHgseSk9PmNvbXBhcmVSYW5rKHRhZyh4KSx0YWcoeSkpO1xucmV0dXJuIG1ha2VDb21wYXJhdG9yS2l0KGNvbXBhcmVSZW1vdGFibGVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xuaGFyZGVuKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRQYXNzU3R5bGVDb3ZlciI6WyJnZXRQYXNzU3R5bGVDb3ZlciJdLCJtYWtlQ29tcGFyYXRvcktpdCI6WyJtYWtlQ29tcGFyYXRvcktpdCJdLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiOlsiY29tcGFyYXRvck1pcnJvckltYWdlIl0sImlzUmFua1NvcnRlZCI6WyJpc1JhbmtTb3J0ZWQiXSwiYXNzZXJ0UmFua1NvcnRlZCI6WyJhc3NlcnRSYW5rU29ydGVkIl0sInNvcnRCeVJhbmsiOlsic29ydEJ5UmFuayJdLCJnZXRJbmRleENvdmVyIjpbImdldEluZGV4Q292ZXIiXSwiRnVsbFJhbmtDb3ZlciI6WyJGdWxsUmFua0NvdmVyIl0sImNvdmVyZWRFbnRyaWVzIjpbImNvdmVyZWRFbnRyaWVzIl0sInVuaW9uUmFua0NvdmVycyI6WyJ1bmlvblJhbmtDb3ZlcnMiXSwiaW50ZXJzZWN0UmFua0NvdmVycyI6WyJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sImNvbXBhcmVSYW5rIjpbImNvbXBhcmVSYW5rIl0sImNvbXBhcmVBbnRpUmFuayI6WyJjb21wYXJlQW50aVJhbmsiXSwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiOlsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAIQAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAlHpu9zwsAAM8LAAAeAAAAQGVuZG8vbmF0LXY0LjEuMjcvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwgJ25hbWUnLCB7dmFsdWU6IFwiaXNOYXRcIn0pOyRo4oCNX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsICduYW1lJywge3ZhbHVlOiBcIk5hdFwifSk7JGjigI1fb25jZS5OYXQoTmF0KTsgICAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbnJldHVybiBhbGxlZ2VkTnVtPj0wO1xuIH1cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtIT09J251bWJlcicpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxucmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pJiZhbGxlZ2VkTnVtPj0wO1xuIH1cblxuLyoqXG4gKiBJZiBgYWxsZWdlZE51bWJlcmAgcGFzc2VzIHRoZSBgaXNOYXRgIHRlc3QsIHRoZW4gcmV0dXJuIGl0IGFzIGEgYmlnaW50LlxuICogT3RoZXJ3aXNlIHRocm93IGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICpcbiAqIElmIGBhbGxlZ2VkTnVtYCBpcyBuZWl0aGVyIGEgYmlnaW50IG5vciBhIG51bWJlciwgYE5hdGAgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGlmIGl0IGlzIG5vdCBhIFtzYWZlbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBgTmF0YCB0aHJvd3MgYSBgUmFuZ2VFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGl0IGlzIGNvbnZlcnRlZCB0byBhIGJpZ2ludCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIGFsbGVnZWROdW07XG4gfVxuXG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdudW1iZXInKXtcbmlmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG4gfVxuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gfVxuXG50aHJvdyBuZXcgVHlwZUVycm9yKFxuIGAke2FsbGVnZWROdW19IGlzIGEgJHt0eXBlb2YgYWxsZWdlZE51bX0gYnV0IG11c3QgYmUgYSBiaWdpbnQgb3IgYSBudW1iZXJgKTtcblxuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGXyjBp8CAAAfAgAACAAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lcnJvci5qcyIsIi4vc3JjL2l0ZXItaGVscGVycy5qcyIsIi4vc3JjL21ha2UtZmFyLmpzIiwiLi9zcmMvbWFrZVRhZ2dlZC5qcyIsIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9yZW1vdGFibGUuanMiLCIuL3NyYy9zeW1ib2wuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImlzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvaXRlci1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvZXJyb3IuanNcIiwgW11dLFtcIi4vc3JjL3JlbW90YWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvc3ltYm9sLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2l0ZXItaGVscGVycy5qcyI6W1sibWFwSXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLFsiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSJdXSwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOltbIlBBU1NfU1RZTEUiLCJQQVNTX1NUWUxFIl0sWyJpc09iamVjdCIsImlzT2JqZWN0Il0sWyJhc3NlcnRDaGVja2VyIiwiYXNzZXJ0Q2hlY2tlciJdLFsiZ2V0VGFnIiwiZ2V0VGFnIl0sWyJoYXNPd25Qcm9wZXJ0eU9mIiwiaGFzT3duUHJvcGVydHlPZiJdXSwiLi9zcmMvZXJyb3IuanMiOltbImdldEVycm9yQ29uc3RydWN0b3IiLCJnZXRFcnJvckNvbnN0cnVjdG9yIl0sWyJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSxbImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiXV0sIi4vc3JjL3JlbW90YWJsZS5qcyI6W1siZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdXSwiLi9zcmMvc3ltYm9sLmpzIjpbWyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sWyJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCJdLFsibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sWyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXV0sIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjpbWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl0sWyJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIl1dLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIjpbWyJtYWtlVGFnZ2VkIiwibWFrZVRhZ2dlZCJdXSwiLi9zcmMvbWFrZS1mYXIuanMiOltbIlJlbW90YWJsZSIsIlJlbW90YWJsZSJdLFsiRmFyIiwiRmFyIl0sWyJUb0ZhckZ1bmN0aW9uIiwiVG9GYXJGdW5jdGlvbiJdXSwiLi9zcmMvdHlwZUd1YXJkcy5qcyI6W1siYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVjb3JkIl0sWyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiXSxbImFzc2VydFJlbW90YWJsZSIsImFzc2VydFJlbW90YWJsZSJdLFsiaXNSZW1vdGFibGUiLCJpc1JlbW90YWJsZSJdLFsiaXNSZWNvcmQiLCJpc1JlY29yZCJdLFsiaXNDb3B5QXJyYXkiLCJpc0NvcHlBcnJheSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3ka2qpMHAACTBwAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXkscHJvdG90eXBlOmFycmF5UHJvdG90eXBlfT1BcnJheTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNhbkJlVmFsaWQ9KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmlzQXJyYXkoY2FuZGlkYXRlKXx8XG4hIWNoZWNrJiZjaGVjayhmYWxzZSxYIGBBcnJheSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCk7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weUFycmF5SGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlBcnJheScsXG5cbmNhbkJlVmFsaWQsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKT09PWFycmF5UHJvdG90eXBlfHxcbmFzc2VydC5mYWlsKFggYE1hbGZvcm1lZCBhcnJheTogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogU2luY2Ugd2UncmUgYWxyZWFkeSBlbnN1cmVkIGNhbmRpZGF0ZSBpcyBhbiBhcnJheSwgaXQgc2hvdWxkIG5vdCBiZSovXG4vKiBwb3NzaWJsZSBmb3IgdGhlIGZvbGxvd2luZyB0ZXN0IHRvIGZhaWwqL1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ2xlbmd0aCcsZmFsc2UsYXNzZXJ0Q2hlY2tlcik7XG5jb25zdCBsZW49LyoqIEB0eXBlIHt1bmtub3duW119ICovY2FuZGlkYXRlLmxlbmd0aDtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsaSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qICsxIGZvciB0aGUgJ2xlbmd0aCcgcHJvcGVydHkgaXRzZWxmLiovXG5vd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoPT09bGVuKzF8fFxuYXNzZXJ0LmZhaWwoWCBgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmNhbmRpZGF0ZS5ldmVyeSgodik9PiEhcGFzc1N0eWxlT2ZSZWN1cih2KSk7XG4gfX0pOyRo4oCNX29uY2UuQ29weUFycmF5SGVscGVyKENvcHlBcnJheUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACD9dsszwcAAM8HAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlSZWNvcmRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRQcm90b3R5cGVPZix2YWx1ZXMscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlSZWNvcmRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weVJlY29yZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSE9PW9iamVjdFByb3RvdHlwZSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxuXG5yZXR1cm4gb3duS2V5cyhjYW5kaWRhdGUpLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4odHlwZW9mIGtleT09PSdzdHJpbmcnfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcblggYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbiFjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuLyogVE9ETzogVXBkYXRlIG1lc3NhZ2Ugbm93IHRoYXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBcImltcGxpY2l0IFJlbW90YWJsZVwiLiovXG5YIGBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKSk7XG5cblxuIH0pO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbkNvcHlSZWNvcmRIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsbmFtZSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmZvcihjb25zdCB2YWwgb2YgdmFsdWVzKGNhbmRpZGF0ZSkpe1xucGFzc1N0eWxlT2ZSZWN1cih2YWwpO1xuIH1cbiB9fSk7JGjigI1fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADToDhxnREAAJ0RAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2Vycm9yLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJFcnJvckhlbHBlciIsImdldEVycm9yQ29uc3RydWN0b3IiLCJpc0Vycm9yTGlrZSIsInRvUGFzc2FibGVFcnJvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiBUT0RPOiBNYWludGVuYW5jZSBoYXphcmQ6IENvb3JkaW5hdGUgd2l0aCB0aGUgbGlzdCBvZiBlcnJvcnMgaW4gdGhlIFNFUyovXG4vKiB3aGlsZWxpc3QuIEN1cnJlbnRseSwgYm90aCBvbWl0IEFnZ3JlZ2F0ZUVycm9yLCB3aGljaCBpcyBub3cgc3RhbmRhcmQuIEJvdGgqL1xuLyogbXVzdCBldmVudHVhbGx5IGluY2x1ZGUgaXQuKi9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzPW5ldyBNYXAoW1xuWydFcnJvcicsRXJyb3JdLFxuWydFdmFsRXJyb3InLEV2YWxFcnJvcl0sXG5bJ1JhbmdlRXJyb3InLFJhbmdlRXJyb3JdLFxuWydSZWZlcmVuY2VFcnJvcicsUmVmZXJlbmNlRXJyb3JdLFxuWydTeW50YXhFcnJvcicsU3ludGF4RXJyb3JdLFxuWydUeXBlRXJyb3InLFR5cGVFcnJvcl0sXG5bJ1VSSUVycm9yJyxVUklFcnJvcl1dKTtcblxuXG5jb25zdCAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3Rvcj0obmFtZSk9PmVycm9yQ29uc3RydWN0b3JzLmdldChuYW1lKTskaOKAjV9vbmNlLmdldEVycm9yQ29uc3RydWN0b3IoZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5oYXJkZW4oZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrRXJyb3JMaWtlPShjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbi8qIFRPRE86IE5lZWQgYSBiZXR0ZXIgdGVzdCB0aGFuIGluc3RhbmNlb2YqL1xucmV0dXJuKFxuY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3J8fFxucmVqZWN0JiZyZWplY3QoWCBgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH07XG5oYXJkZW4oY2hlY2tFcnJvckxpa2UpO1xuXG4vKipcbiAqIFZhbGlkYXRpbmcgZXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUgcmFpc2VzIGEgdGVuc2lvbiBiZXR3ZWVuIHNlY3VyaXR5XG4gKiB2cyBwcmVzZXJ2aW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIEZvciBlcnJvcnMsIHdlIG5lZWQgdG8gcmVtZW1iZXJcbiAqIHRoZSBlcnJvciBpdHNlbGYgZXhpc3RzIHRvIGhlbHAgdXMgZGlhZ25vc2UgYSBidWcgdGhhdCdzIGxpa2VseSBtb3JlXG4gKiBwcmVzc2luZyB0aGFuIGEgdmFsaWRpdHkgYnVnIGluIHRoZSBlcnJvciBpdHNlbGYuIFRodXMsIHdoZW5ldmVyIGl0IGlzIHNhZmVcbiAqIHRvIGRvIHNvLCB3ZSBwcmVmZXIgdG8gbGV0IHRoZSBlcnJvci1saWtlIHRlc3Qgc3VjY2VlZCBhbmQgdG8gY291Y2ggdGhlc2VcbiAqIGNvbXBsYWludHMgYXMgbm90ZXMgb24gdGhlIGVycm9yLlxuICpcbiAqIFRvIHJlc29sdmUgdGhpcywgc3VjaCBhIG1hbGZvcm1lZCBlcnJvciBvYmplY3Qgd2lsbCBzdGlsbCBwYXNzXG4gKiBgaXNFcnJvckxpa2VgIHNvIG1hcnNoYWwgY2FuIHVzZSB0aGlzIGZvciB0b3AgbGV2ZWwgZXJyb3IgdG8gcmVwb3J0IGZyb20sXG4gKiBldmVuIGlmIGl0IHdvdWxkIG5vdCBhY3R1YWxseSB2YWxpZGF0ZS5cbiAqIEluc3RlYWQsIHRoZSBkaWFnbm9zdGljcyB0aGF0IGBhc3NlcnRFcnJvcmAgd291bGQgaGF2ZSByZXBvcnRlZCBhcmVcbiAqIGF0dGFjaGVkIGFzIG5vdGVzIHRvIHRoZSBtYWxmb3JtZWQgZXJyb3IuIFRodXMsIGEgbWFsZm9ybWVkXG4gKiBlcnJvciBpcyBwYXNzYWJsZSBieSBpdHNlbGYsIGJ1dCBub3QgYXMgcGFydCBvZiBhIHBhc3NhYmxlIHN0cnVjdHVyZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc0Vycm9yTGlrZT0oY2FuZGlkYXRlKT0+Y2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlKTskaOKAjV9vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIEVycm9ySGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2Vycm9yJyxcblxuY2FuQmVWYWxpZDpjaGVja0Vycm9yTGlrZSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PntcbkVycm9ySGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbmNvbnN0e25hbWV9PXByb3RvO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbkVDJiZFQy5wcm90b3R5cGU9PT1wcm90b3x8XG5GYWlsIGBFcnJvcnMgbXVzdCBpbmhlcml0IGZyb20gYW4gZXJyb3IgY2xhc3MgLnByb3RvdHlwZSAke2NhbmRpZGF0ZX1gO1xuXG5jb25zdHtcbi8qIE11c3QgYWxsb3cgYGNhdXNlYCwgYGVycm9yc2AqL1xubWVzc2FnZTptRGVzYyxcbi8qIEFsbG93IGJ1dCBpZ25vcmUgb25seSBleHRyYW5lb3VzIG93biBgc3RhY2tgIHByb3BlcnR5LiovXG5zdGFjazpfb3B0U3RhY2tEZXNjLFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg8MXx8XG5GYWlsIGBQYXNzZWQgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnRpZXMgJHtyZXN0RGVzY3N9YDtcbmlmKG1EZXNjKXtcbnR5cGVvZiBtRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBcIm1lc3NhZ2VcIiAke21EZXNjfSBtdXN0IGJlIGEgc3RyaW5nLXZhbHVlZCBkYXRhIHByb3BlcnR5LmA7XG4hbURlc2MuZW51bWVyYWJsZXx8XG5GYWlsIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBub3QgYmUgZW51bWVyYWJsZWA7XG4gfVxucmV0dXJuIHRydWU7XG4gfX0pO1xuXG5cbi8qKlxuICogUmV0dXJuIGEgbmV3IHBhc3NhYmxlIGVycm9yIHRoYXQgcHJvcGFnYXRlcyB0aGUgZGlhZ25vc3RpYyBpbmZvIG9mIHRoZVxuICogb3JpZ2luYWwsIGFuZCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIGFzIGEgbm90ZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqLyRo4oCNX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xuY29uc3QgICAgICAgIHRvUGFzc2FibGVFcnJvcj0oZXJyKT0+e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1lcnI7XG5cbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoIGAke25hbWV9YCl8fEVycm9yO1xuY29uc3QgbmV3RXJyb3I9aGFyZGVuKG5ldyBFQyggYCR7bWVzc2FnZX1gKSk7XG4vKiBFdmVuIHRoZSBjbGVhbmVkIHVwIGVycm9yIGNvcHksIGlmIHNlbnQgdG8gdGhlIGNvbnNvbGUsIHNob3VsZCovXG4vKiBjYXVzZSBoaWRkZW4gZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBvZiB0aGUgb3JpZ2luYWwgZXJyb3IqL1xuLyogdG8gYmUgbG9nZ2VkLiovXG5hc3NlcnQubm90ZShuZXdFcnJvcixYIGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbnJldHVybiBuZXdFcnJvcjtcbiB9OyRo4oCNX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABKO2aDVQgAAFUIAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2l0ZXItaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiLi9tYWtlLWZhci5qc1wiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCBhbmRcbiAqIGhhdmUgdGhlIHNhbWUgdGVybWluYXRpb24gLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZSBvciBmYWlsdXJlXG4gKiByZWFzb24uIEJ1dCB0aGUgbm9uLWZpbmFsIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgbm9uLWZpbmFsXG4gKiB2YWx1ZXMgZnJvbSBgYmFzZUl0ZXJhdG9yYCBhcyB0cmFuc2Zvcm1lZCBieSBgZnVuY2AuXG4gKlxuICogQHRlbXBsYXRlIFQsVVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gVX0gZnVuY1xuICogQHJldHVybnMge0l0ZXJhYmxlPFU+fVxuICovXG5jb25zdCAgICAgICAgbWFwSXRlcmFibGU9KGJhc2VJdGVyYWJsZSxmdW5jKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdtYXBwZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3R7dmFsdWU6YmFzZVZhbHVlLGRvbmV9PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdCB2YWx1ZT1kb25lP2Jhc2VWYWx1ZTpmdW5jKGJhc2VWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSxkb25lfSk7XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UubWFwSXRlcmFibGUobWFwSXRlcmFibGUpO1xuXG5oYXJkZW4obWFwSXRlcmFibGUpO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGEgc3Vic2V0IG9mIHRoZSBub24tZmluYWwgdmFsdWVzIGZyb20gdGhlXG4gKiBgYmFzZUl0ZXJhdG9yYCAtLS0gdGhvc2UgZm9yIHdoaWNoIGBwcmVkKHZhbHVlKWAgd2FzIHRydXRoeS4gVGhlIHJlc3VsdFxuICogaGFzIHRoZSBzYW1lIHRlcm1pbmF0aW9uIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlXG4gKiBvciBmYWlsdXJlIHJlYXNvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gYm9vbGVhbn0gcHJlZFxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgZmlsdGVySXRlcmFibGU9KGJhc2VJdGVyYWJsZSxwcmVkKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignZmlsdGVyZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmZvcig7Oyl7XG5jb25zdCByZXN1bHQ9YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0e3ZhbHVlLGRvbmV9PXJlc3VsdDtcbmlmKGRvbmV8fHByZWQodmFsdWUpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5cbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYk1nA04aAABOGgAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJSZW1vdGFibGUiLCJUb0ZhckZ1bmN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxhc3NlcnRJZmFjZSxnZXRJbnRlcmZhY2VPZixSZW1vdGFibGVIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydElmYWNlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbnNldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcblxuLyoqXG4gKiBOb3cgdGhhdCB0aGUgcmVtb3RhYmxlUHJvdG8gZG9lcyBub3QgcHJvdmlkZSBpdHMgb3duIGB0b1N0cmluZ2AgbWV0aG9kLFxuICogZW5zdXJlIGl0IGFsd2F5cyBpbmhlcml0cyBmcm9tIHNvbWV0aGluZy4gVGhlIG9yaWdpbmFsIHByb3RvdHlwZSBvZlxuICogYHJlbW90YWJsZWAgaWYgdGhlcmUgd2FzIG9uZSwgb3IgYE9iamVjdC5wcm90b3R5cGVgIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG89KHJlbW90YWJsZSxpZmFjZSk9PntcbmxldCBvbGRQcm90bz1nZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuaWYodHlwZW9mIHJlbW90YWJsZT09PSdvYmplY3QnKXtcbmlmKG9sZFByb3RvPT09bnVsbCl7XG5vbGRQcm90bz1vYmplY3RQcm90b3R5cGU7XG4gfVxub2xkUHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuRmFpbCBgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2UgaWYodHlwZW9mIHJlbW90YWJsZT09PSdmdW5jdGlvbicpe1xub2xkUHJvdG8hPT1udWxsfHxcbkZhaWwgYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xub2xkUHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5nZXRQcm90b3R5cGVPZihvbGRQcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG5GYWlsIGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNle1xuRmFpbCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuIH1cbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2xkUHJvdG8se1xuW1BBU1NfU1RZTEVdOnt2YWx1ZToncmVtb3RhYmxlJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6aWZhY2V9fSkpO1xuXG5cbiB9O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZT0oY2FuZGlkYXRlKT0+XG5SZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIFJlbW90YWJsZS4gIEFmdGVyIHRoaXMsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSlcbiAqIHJldHVybnMgaWZhY2UuXG4gKlxuICogLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy84MDRcbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZT0nUmVtb3RhYmxlJ10gVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvclxuICogdGhlIHJlbW90YWJsZS4gRm9yIG5vdywgYSBzdHJpbmcgaWZhY2UgbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGhcbiAqIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiLCB0byBzZXJ2ZSBhcyB0aGUgYWxsZWdlZCBuYW1lLiBNb3JlXG4gKiBnZW5lcmFsIGlmYWNlcyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZC4gVGhpcyBpcyB0ZW1wb3JhcnkuIFdlIGluY2x1ZGUgdGhlXG4gKiBcIkFsbGVnZWRcIiBvciBcIkRlYnVnTmFtZVwiIGFzIGEgcmVtaW5kZXIgdGhhdCB3ZSBkbyBub3QgeWV0IGhhdmUgU3dpbmdTZXRcbiAqIG9yIENvbW1zIFZhdFxuICogc3VwcG9ydCBmb3IgZW5zdXJpbmcgdGhpcyBpcyBhY2NvcmRpbmcgdG8gdGhlIHZhdCBob3N0aW5nIHRoZSBvYmplY3QuXG4gKiBDdXJyZW50bHksIEFsaWNlIGNhbiB0ZWxsIEJvYiBhYm91dCBDYXJvbCwgd2hlcmUgVmF0QSAob24gQWxpY2UncyBiZWhhbGYpXG4gKiBtaXNyZXByZXNlbnRzIENhcm9sJ3MgYGlmYWNlYC4gVmF0QiBhbmQgdGhlcmVmb3JlIEJvYiB3aWxsIHRoZW4gc2VlXG4gKiBDYXJvbCdzIGBpZmFjZWAgYXMgbWlzcmVwcmVzZW50ZWQgYnkgVmF0QS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSBbcHJvcHM9dW5kZWZpbmVkXSBDdXJyZW50bHkgbWF5IG9ubHkgYmUgdW5kZWZpbmVkLlxuICogVGhhdCBwbGFuIGlzIHRoYXQgb3duLXByb3BlcnRpZXMgYXJlIGNvcGllZCB0byB0aGUgcmVtb3RhYmxlXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGU9e31dIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gcmVtb3RhYmxlLCBtb2RpZmllZCBmb3IgZGVidWdnYWJpbGl0eVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlPShcbmlmYWNlPSdSZW1vdGFibGUnLFxucHJvcHM9dW5kZWZpbmVkLFxucmVtb3RhYmxlPS8qKiBAdHlwZSB7VH0gKi97fSk9Plxue1xuYXNzZXJ0SWZhY2UoaWZhY2UpO1xuYXNzZXJ0KGlmYWNlKTtcbi8qIFRPRE86IFdoZW4gaWZhY2UgaXMgcmljaGVyIHRoYW4ganVzdCBzdHJpbmcsIHdlIG5lZWQgdG8gZ2V0IHRoZSBhbGxlZ2VkTmFtZSovXG4vKiBpbiBhIGRpZmZlcmVudCB3YXkuKi9cbnByb3BzPT09dW5kZWZpbmVkfHxGYWlsIGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWA7XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgdGhhdCB0aGUgdW5tb2RpZmllZCBvYmplY3QgaXMgYWJsZSB0byBiZWNvbWUgYSBSZW1vdGFibGUuKi9cbmFzc2VydENhbkJlUmVtb3RhYmxlKHJlbW90YWJsZSk7XG5cbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBtYXJrZWQuKi9cbiEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBtYXJrZWQgYXMgYSAke3EoXG5yZW1vdGFibGVbUEFTU19TVFlMRV0pXG4gfWA7XG4vKiBgaXNGcm96ZW5gIGFsd2F5cyByZXR1cm5zIHRydWUgd2l0aCBhIGZha2UgYGhhcmRlbmAsIGJ1dCB3ZSB3YW50IHRoYXQgY2FzZSovXG4vKiB0byBzdWNjZWVkIGFueXdheS4gRmFraW5nIGBoYXJkZW5gIGlzIG9ubHkgY29ycmVjdG5lc3MgcHJlc2VydmluZyovXG4vKiBpZiB0aGUgY29kZSBpbiBxdWVzdGlvbiBjb250YWlucyBubyBidWdzIHRoYXQgdGhlIHJlYWwgYGhhcmRlbmAgd291bGQqL1xuLyogaGF2ZSBjYXVnaHQuKi9cbi8qIEB0cy1pZ25vcmUgYGlzRmFrZWAgcHVycG9zZWx5IG5vdCBpbiB0aGUgdHlwZSovXG5oYXJkZW4uaXNGYWtlfHxcbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBmcm96ZW4uKi9cbiFpc0Zyb3plbihyZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuY29uc3QgcmVtb3RhYmxlUHJvdG89bWFrZVJlbW90YWJsZVByb3RvKHJlbW90YWJsZSxpZmFjZSk7XG5cbi8qIFRha2UgYSBzdGF0aWMgY29weSBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBhcyBkYXRhIHByb3BlcnRpZXMuKi9cbi8qIGNvbnN0IHByb3BEZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoeyAuLi5wcm9wcyB9KTsqL1xuY29uc3QgbXV0YXRlSGFyZGVuQW5kQ2hlY2s9KHRhcmdldCk9Pntcbi8qIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wRGVzY3MpOyovXG5zZXRQcm90b3R5cGVPZih0YXJnZXQscmVtb3RhYmxlUHJvdG8pO1xuaGFyZGVuKHRhcmdldCk7XG5hc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuIH07XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgYSBmcmVzaCByZW1vdGFibGUgdG8gc2VlIGlmIG91ciBydWxlcyBmaXQuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuLyogQWN0dWFsbHkgZmluaXNoIHRoZSBuZXcgcmVtb3RhYmxlLiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4vKiBDT01NSVRURUQhKi9cbi8qIFdlJ3JlIGNvbW1pdHRlZCwgc28ga2VlcCB0aGUgaW50ZXJmYWNlIGZvciBmdXR1cmUgcmVmZXJlbmNlLiovXG5hc3NlcnQoaWZhY2UhPT11bmRlZmluZWQpOy8qIFRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweSovXG5yZXR1cm4gKC8qKiBAdHlwZSB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gKi9yZW1vdGFibGUpO1xuIH07JGjigI1fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKipcbiAqIEEgY29uY2lzZSBjb252ZW5pZW5jZSBmb3IgdGhlIG1vc3QgY29tbW9uIGBSZW1vdGFibGVgIHVzZS5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSBUaGlzIG5hbWUgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCBgQWxsZWdlZDogYFxuICogZm9yIG5vdyB0byBmb3JtIHRoZSBgUmVtb3RhYmxlYCBgaWZhY2VgIGFyZ3VtZW50LlxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlPXt9XSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICovXG5jb25zdCAgICAgICAgRmFyPShmYXJOYW1lLHJlbW90YWJsZT11bmRlZmluZWQpPT57XG5jb25zdCByPXJlbW90YWJsZT09PXVuZGVmaW5lZD8vKiogQHR5cGUge1R9ICove306cmVtb3RhYmxlO1xucmV0dXJuIFJlbW90YWJsZSggYEFsbGVnZWQ6ICR7ZmFyTmFtZX1gLHVuZGVmaW5lZCxyKTtcbiB9OyRo4oCNX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLyoqXG4gKiBDb2VyY2UgYGZ1bmNgIHRvIGEgZmFyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIGl0cyBjYWxsIGJlaGF2aW9yLlxuICogSWYgaXQgaXMgYWxyZWFkeSBhIGZhciBmdW5jdGlvbiwgcmV0dXJuIGl0LiBPdGhlcndpc2UgbWFrZSBhbmQgcmV0dXJuIGFcbiAqIG5ldyBmYXIgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGZvcndhcmRzIGNhbGxzIHRvIGl0LiBUaGlzXG4gKiB3b3JrcyBldmVuIGlmIGBmdW5jYCBpcyBhbHJlYWR5IGZyb3plbi4gYFRvRmFyRnVuY3Rpb25gIGlzIHRvIGJlIHVzZWRcbiAqIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20gZWxzZXdoZXJlIHVuZGVyIGxlc3MgY29udHJvbC4gRm9yIGZ1bmN0aW9uc1xuICogeW91IGF1dGhvciBpbiBwbGFjZSwgYmV0dGVyIHRvIHVzZSBgRmFyYCBvbiB0aGVpciBmdW5jdGlvbiBsaXRlcmFsIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIHRvIGJlIHVzZWQgb25seSBpZiBgZnVuY2AgaXMgbm90IGFscmVhZHkgYVxuICogZmFyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gZnVuY1xuICovXG5jb25zdCAgICAgICAgVG9GYXJGdW5jdGlvbj0oZmFyTmFtZSxmdW5jKT0+e1xuaWYoZ2V0SW50ZXJmYWNlT2YoZnVuYykhPT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmM7XG4gfVxucmV0dXJuIEZhcihmYXJOYW1lLCguLi5hcmdzKT0+ZnVuYyguLi5hcmdzKSk7XG4gfTskaOKAjV9vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUmVtb3RhYmxlIjpbIlJlbW90YWJsZSJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAACkXvlHQQAAB0EAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7Y3JlYXRlLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuY29uc3QgICAgICAgIG1ha2VUYWdnZWQ9KHRhZyxwYXlsb2FkKT0+e1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG5hc3NlcnRQYXNzYWJsZShoYXJkZW4ocGF5bG9hZCkpO1xucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvYmplY3RQcm90b3R5cGUse1xuW1BBU1NfU1RZTEVdOnt2YWx1ZTondGFnZ2VkJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6dGFnfSxcbnBheWxvYWQ6e3ZhbHVlOnBheWxvYWQsZW51bWVyYWJsZTp0cnVlfX0pKTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABlAKMb1GQAA9RkAADAAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2FuQmVNZXRob2QiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tOb3JtYWxQcm9wZXJ0eSIsImNoZWNrUGFzc1N0eWxlIiwiY2hlY2tUYWdSZWNvcmQiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG5nZXRQcm90b3R5cGVPZixcbmhhc093blByb3BlcnR5Om9iamVjdEhhc093blByb3BlcnR5LFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuY29uc3R7dG9TdHJpbmdUYWc6dG9TdHJpbmdUYWdTeW1ib2x9PVN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZT1nZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbnR5cGVkQXJyYXlQcm90b3R5cGUsXG50b1N0cmluZ1RhZ1N5bWJvbCk7XG5cbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz10eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPT09J2Z1bmN0aW9uJyk7XG5cbmNvbnN0ICAgICAgICBoYXNPd25Qcm9wZXJ0eU9mPShvYmoscHJvcCk9PlxuYXBwbHkob2JqZWN0SGFzT3duUHJvcGVydHksb2JqLFtwcm9wXSk7JGjigI1fb25jZS5oYXNPd25Qcm9wZXJ0eU9mKGhhc093blByb3BlcnR5T2YpO1xuaGFyZGVuKGhhc093blByb3BlcnR5T2YpO1xuXG5jb25zdCAgICAgICAgaXNPYmplY3Q9KHZhbCk9Pk9iamVjdCh2YWwpPT09dmFsOyRo4oCNX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLyoqXG4gKiBEdXBsaWNhdGVzIHBhY2thZ2VzL3Nlcy9zcmMvbWFrZS1oYXJkZW5lci5qcyB0byBhdm9pZCBhIGRlcGVuZGVuY3kuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmplY3RcbiAqL1xuY29uc3QgICAgICAgIGlzVHlwZWRBcnJheT0ob2JqZWN0KT0+e1xuLyogVGhlIG9iamVjdCBtdXN0IHBhc3MgYSBicmFuZCBjaGVjayBvciB0b1N0cmluZ1RhZyB3aWxsIHJldHVybiB1bmRlZmluZWQuKi9cbmNvbnN0IHRhZz1hcHBseShnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcsb2JqZWN0LFtdKTtcbnJldHVybiB0YWchPT11bmRlZmluZWQ7XG4gfTskaOKAjV9vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbmNvbnN0ICAgICAgICBQQVNTX1NUWUxFPVN5bWJvbC5mb3IoJ3Bhc3NTdHlsZScpO1xuXG4vKipcbiAqIEZvciBhIGZ1bmN0aW9uIHRvIGJlIGEgdmFsaWQgbWV0aG9kLCBpdCBtdXN0IG5vdCBiZSBwYXNzYWJsZS5cbiAqIE90aGVyd2lzZSwgd2UgcmlzayBjb25mdXNpbmcgcGFzcy1ieS1jb3B5IGRhdGEgY2FycnlpbmdcbiAqIGZhciBmdW5jdGlvbnMgd2l0aCBhdHRlbXB0cyBhdCBmYXIgb2JqZWN0cyB3aXRoIG1ldGhvZHMuXG4gKlxuICogVE9ETyBIQVpBUkQgQmVjYXVzZSB3ZSBjaGVjayB0aGlzIG9uIHRoZSB3YXkgdG8gaGFyZGVuaW5nIGEgcmVtb3RhYmxlLFxuICogd2UgY2Fubm90IHlldCBjaGVjayB0aGF0IGBmdW5jYCBpcyBoYXJkZW5lZC4gSG93ZXZlciwgd2l0aG91dFxuICogZG9pbmcgc28sIGl0J3MgaW5oZXJpdGFuY2UgbWlnaHQgY2hhbmdlIGFmdGVyIHRoZSBgUEFTU19TVFlMRWBcbiAqIGNoZWNrIGJlbG93LlxuICpcbiAqIEBwYXJhbSB7YW55fSBmdW5jXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuUEFTU19TVFlMRShQQVNTX1NUWUxFKTtcbmNvbnN0ICAgICAgICBjYW5CZU1ldGhvZD0oZnVuYyk9PlxudHlwZW9mIGZ1bmM9PT0nZnVuY3Rpb24nJiYhKFBBU1NfU1RZTEUgaW4gZnVuYyk7JGjigI1fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKipcbiAqIEJlbG93IHdlIGhhdmUgYSBzZXJpZXMgb2YgcHJlZGljYXRlIGZ1bmN0aW9ucyBhbmQgdGhlaXIgKGN1cnJpZWQpIGFzc2VydGlvblxuICogZnVuY3Rpb25zLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBhc3NlcnRpb24gZnVuY3Rpb24gaXMganVzdCB0byBhc3NlcnQgdGhhdFxuICogdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGljYXRlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgcmV0dXJuZWQgdHJ1ZS4gQnV0IGl0XG4gKiByZXByb2R1Y2VzIHRoZSBpbnRlcm5hbCB0ZXN0cyBzbyBmYWlsdXJlcyBjYW4gZ2l2ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q2hlY2tlcj0oY29uZCxkZXRhaWxzKT0+e1xuYXNzZXJ0KGNvbmQsZGV0YWlscyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBhbmQgZW51bWVyYWJpbGl0eSBvZiBhbiBvd24gZGF0YSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8c3ltYm9sfSBwcm9wZXJ0eU5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkQmVFbnVtZXJhYmxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tOb3JtYWxQcm9wZXJ0eT0oXG5jYW5kaWRhdGUsXG5wcm9wZXJ0eU5hbWUsXG5zaG91bGRCZUVudW1lcmFibGUsXG5jaGVjayk9Plxue1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGRlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNhbmRpZGF0ZSxwcm9wZXJ0eU5hbWUpO1xuaWYoZGVzYz09PXVuZGVmaW5lZCl7XG5yZXR1cm4oXG5yZWplY3QmJnJlamVjdChYIGAke3EocHJvcGVydHlOYW1lKX0gcHJvcGVydHkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cbnJldHVybihcbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2MsJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IG5vdCBiZSBhbiBhY2Nlc3NvciBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnNob3VsZEJlRW51bWVyYWJsZT9cbmRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCk6XG5cbiFkZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShcbnByb3BlcnR5TmFtZSlcbiB9IG11c3Qgbm90IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSk7XG5cblxuIH07JGjigI1fb25jZS5jaGVja05vcm1hbFByb3BlcnR5KGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuaGFyZGVuKGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuXG5jb25zdCAgICAgICAgZ2V0VGFnPSh0YWdSZWNvcmQpPT50YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaOKAjV9vbmNlLmdldFRhZyhnZXRUYWcpO1xuaGFyZGVuKGdldFRhZyk7XG5cbmNvbnN0ICAgICAgICBjaGVja1Bhc3NTdHlsZT0ob2JqLGV4cGVjdGVkUGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGFjdHVhbD1vYmpbUEFTU19TVFlMRV07XG5yZXR1cm4oXG5hY3R1YWw9PT1leHBlY3RlZFBhc3NTdHlsZXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEV4cGVjdGVkICR7cShleHBlY3RlZFBhc3NTdHlsZSl9LCBub3QgJHtxKGFjdHVhbCl9OiAke29ian1gKSk7XG5cbiB9OyRo4oCNX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkPShjaGVja1Byb3RvKT0+e1xuLyoqXG4gKiBAcGFyYW0ge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcgfX0gdGFnUmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1RhZ1JlY29yZD0odGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5yZXR1cm4oXG4oaXNPYmplY3QodGFnUmVjb3JkKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEEgbm9uLW9iamVjdCBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmKFxuaXNGcm96ZW4odGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdChYIGBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpJiYoXG4haXNBcnJheSh0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFBBU1NfU1RZTEUsZmFsc2UsY2hlY2spJiZcbmNoZWNrUGFzc1N0eWxlKHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFN5bWJvbC50b1N0cmluZ1RhZyxmYWxzZSxjaGVjaykmJihcbnR5cGVvZiBnZXRUYWcodGFnUmVjb3JkKT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBBIFtTeW1ib2wudG9TdHJpbmdUYWddLW5hbWVkIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnUmVjb3JkfWApKSYmXG5cbmNoZWNrUHJvdG8odGFnUmVjb3JkLGdldFByb3RvdHlwZU9mKHRhZ1JlY29yZCksY2hlY2spKTtcblxuIH07XG5yZXR1cm4gaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcbiB9O1xuXG5jb25zdCAgICAgICAgY2hlY2tUYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhmYWxzZSxYIGBBIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja1RhZ1JlY29yZChjaGVja1RhZ1JlY29yZCk7XG5cbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbmNvbnN0ICAgICAgICBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxucHJvdG8hPT1udWxsJiZnZXRQcm90b3R5cGVPZihwcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKFxuZmFsc2UsXG5YIGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5cblxuaGFyZGVuKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiJdLCJpc09iamVjdCI6WyJpc09iamVjdCJdLCJpc1R5cGVkQXJyYXkiOlsiaXNUeXBlZEFycmF5Il0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSJdLCJjYW5CZU1ldGhvZCI6WyJjYW5CZU1ldGhvZCJdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiXSwiY2hlY2tOb3JtYWxQcm9wZXJ0eSI6WyJjaGVja05vcm1hbFByb3BlcnR5Il0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAC5usQ2DGwAAgxsAACoAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiLi9jb3B5QXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL2Vycm9yLmpzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIiwiLi9zYWZlLXByb21pc2UuanMiLCIuL3N5bWJvbC5qcyIsIi4vdGFnZ2VkLmpzIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZSIsInBhc3NTdHlsZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxpc09iamVjdCxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxDb3B5QXJyYXlIZWxwZXIsQ29weVJlY29yZEhlbHBlcixUYWdnZWRIZWxwZXIsRXJyb3JIZWxwZXIsUmVtb3RhYmxlSGVscGVyLGFzc2VydFBhc3NhYmxlU3ltYm9sLGFzc2VydFNhZmVQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImlzVHlwZWRBcnJheVwiLCBbJGjigI1fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVPZn0gUGFzc1N0eWxlT2YgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByaW1pdGl2ZVN0eWxlfSBQcmltaXRpdmVTdHlsZSAqL1xuXG4vKiogQHR5cGVkZWYge0V4Y2x1ZGU8UGFzc1N0eWxlLCBQcmltaXRpdmVTdHlsZSB8IFwicHJvbWlzZVwiPn0gSGVscGVyUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0Zyb3plbn09T2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBQYXNzU3R5bGVIZWxwZXI+IH1cbiAqL1xuXG5jb25zdCBtYWtlSGVscGVyVGFibGU9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG4vKiogQHR5cGUge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIGFueT4gJiB7X19wcm90b19fOiBudWxsfX0gKi9cbmNvbnN0IEhlbHBlclRhYmxlPXtcbl9fcHJvdG9fXzpudWxsLFxuY29weUFycmF5OnVuZGVmaW5lZCxcbmNvcHlSZWNvcmQ6dW5kZWZpbmVkLFxudGFnZ2VkOnVuZGVmaW5lZCxcbmVycm9yOnVuZGVmaW5lZCxcbnJlbW90YWJsZTp1bmRlZmluZWR9O1xuXG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuY29uc3R7c3R5bGVOYW1lfT1oZWxwZXI7XG5zdHlsZU5hbWUgaW4gSGVscGVyVGFibGV8fEZhaWwgYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPT09dW5kZWZpbmVkfHxcbkZhaWwgYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPWhlbHBlcjtcbiB9XG5mb3IoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKXtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV0hPT11bmRlZmluZWR8fFxuRmFpbCBgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gfVxuXG5yZXR1cm4gaGFyZGVuKEhlbHBlclRhYmxlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnMgVGhlIHBhc3NTdHlsZUhlbHBlcnMgdG8gcmVnaXN0ZXIsXG4gKiBpbiBwcmlvcml0eSBvcmRlci5cbiAqIE5PVEUgVGhlc2UgbXVzdCBhbGwgYmUgXCJ0cnVzdGVkXCIsXG4gKiBjb21wbGV0ZSwgYW5kIG5vbi1jb2xsaWRpbmcuIGBtYWtlUGFzc1N0eWxlT2ZgIG1heSAqYXNzdW1lKiB0aGF0IGVhY2ggaGVscGVyXG4gKiBkb2VzIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uIGBtYWtlUGFzc1N0eWxlT2ZgIGlzIG5vdCB0cnlpbmcgdG8gZGVmZW5kXG4gKiBpdHNlbGYgYWdhaW5zdCBtYWxpY2lvdXMgaGVscGVycywgdGhvdWdoIGl0IGRvZXMgZGVmZW5kIGFnYWluc3Qgc29tZVxuICogYWNjaWRlbnRzLlxuICogQHJldHVybnMge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2Y9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG5jb25zdCBIZWxwZXJUYWJsZT1tYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG5jb25zdCByZW1vdGFibGVIZWxwZXI9SGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4vKipcbiAqIFB1cmVseSBmb3IgcGVyZm9ybWFuY2UuIEhvd2V2ZXIgaXQgaXMgbXV0YWJsZSBzdGF0aWMgc3RhdGUsIGFuZFxuICogaXQgZG9lcyBoYXZlIHNvbWUgb2JzZXJ2YWJpbGl0eSBvbiBwcm94aWVzLiBUT0RPIG5lZWQgdG8gYXNzZXNzXG4gKiB3aGV0aGVyIHRoaXMgY3JlYXRlcyBhIHN0YXRpYyBjb21tdW5pY2F0aW9ucyBjaGFubmVsLlxuICpcbiAqIHBhc3NTdHlsZU9mIGRvZXMgYSBmdWxsIHJlY3Vyc2l2ZSB3YWxrIG9mIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgaW4gb3JkZXIgdG8gdmFsaWRhdGUgdGhhdCB0aGV5IGFyZSBhY3ljbGljLiBJbiBhZGRpdGlvblxuICogaXQgaXMgdXNlZCBieSBvdGhlciBhbGdvcml0aG1zIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2UgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBzbyB3aXRob3V0IHRoaXMgY2FjaGUsIHRoZXNlIGFsZ29yaXRobXMgY291bGQgYmVcbiAqIE8oTioqMikgb3Igd29yc2UuXG4gKlxuICogQHR5cGUge1dlYWtNYXA8UGFzc2FibGUsIFBhc3NTdHlsZT59XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU1lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mPShwYXNzYWJsZSk9Pntcbi8qIEV2ZW4gd2hlbiBhIFdlYWtTZXQgaXMgY29ycmVjdCwgd2hlbiB0aGUgc2V0IGhhcyBhIHNob3J0ZXIgbGlmZXRpbWUqL1xuLyogdGhhbiBpdHMga2V5cywgd2UgcHJlZmVyIGEgU2V0IGR1ZSB0byBleHBlY3RlZCBpbXBsZW1lbnRhdGlvbiovXG4vKiB0cmFkZW9mZnMuKi9cbmNvbnN0IGluUHJvZ3Jlc3M9bmV3IFNldCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZSZWN1cj0oaW5uZXIpPT57XG5jb25zdCBpbm5lcklzT2JqZWN0PWlzT2JqZWN0KGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xuaWYocGFzc1N0eWxlTWVtby5oYXMoaW5uZXIpKXtcbi8qIEB0cy1pZ25vcmUgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdCBgZ2V0YCBhZnRlciBgaGFzYCBpcyBzYWZlKi9cbnJldHVybiBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gfVxuIWluUHJvZ3Jlc3MuaGFzKGlubmVyKXx8XG5GYWlsIGBQYXNzLWJ5LWNvcHkgZGF0YSBjYW5ub3QgYmUgY3ljbGljICR7aW5uZXJ9YDtcbmluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5wYXNzU3R5bGVNZW1vLnNldChpbm5lcixwYXNzU3R5bGUpO1xuaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuIH1cbnJldHVybiBwYXNzU3R5bGU7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mSW50ZXJuYWw9KGlubmVyKT0+e1xuY29uc3QgdHlwZXN0cj10eXBlb2YgaW5uZXI7XG5zd2l0Y2godHlwZXN0cil7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOntcbnJldHVybiB0eXBlc3RyO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG5yZXR1cm4nc3ltYm9sJztcbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoaW5uZXI9PT1udWxsKXtcbnJldHVybidudWxsJztcbiB9XG5pZighaXNGcm96ZW4oaW5uZXIpKXtcbmFzc2VydC5mYWlsKFxuLyogVHlwZWRBcnJheXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGluIGhhcmRlbigpKi9cbi8qIGFuZCBhIGNvcnJlc3BvbmRpbmcgc3BlY2lhbCBlcnJvciBtZXNzYWdlIGhlcmUuKi9cbmlzVHlwZWRBcnJheShpbm5lcik/XG5YIGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmA6XG5YIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCk7XG5cbiB9XG5pZihpc1Byb21pc2UoaW5uZXIpKXtcbmFzc2VydFNhZmVQcm9taXNlKGlubmVyKTtcbnJldHVybidwcm9taXNlJztcbiB9XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbmNvbnN0IHBhc3NTdHlsZVRhZz1pbm5lcltQQVNTX1NUWUxFXTtcbmlmKHBhc3NTdHlsZVRhZyE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywnc3RyaW5nJyk7XG5jb25zdCBoZWxwZXI9SGVscGVyVGFibGVbcGFzc1N0eWxlVGFnXTtcbmhlbHBlciE9PXVuZGVmaW5lZHx8XG5GYWlsIGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuICgvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi9wYXNzU3R5bGVUYWcpO1xuIH1cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5pZihoZWxwZXIuY2FuQmVWYWxpZChpbm5lcikpe1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuIGhlbHBlci5zdHlsZU5hbWU7XG4gfVxuIH1cbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmNhc2UnZnVuY3Rpb24nOntcbmlzRnJvemVuKGlubmVyKXx8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07XG5cbnJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiB9O1xucmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG4gfTtcblxuY29uc3QgICAgICAgIHBhc3NTdHlsZU9mPW1ha2VQYXNzU3R5bGVPZihbXG5Db3B5QXJyYXlIZWxwZXIsXG5Db3B5UmVjb3JkSGVscGVyLFxuVGFnZ2VkSGVscGVyLFxuRXJyb3JIZWxwZXIsXG5SZW1vdGFibGVIZWxwZXJdKTskaOKAjV9vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGU9KHZhbCk9PntcbnBhc3NTdHlsZU9mKHZhbCk7LyogdGhyb3dzIGlmIHZhbCBpcyBub3QgYSBwYXNzYWJsZSovXG4gfTskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFLGifcMhAADDIQAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlJlbW90YWJsZUhlbHBlciIsImFzc2VydElmYWNlIiwiZ2V0SW50ZXJmYWNlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxoYXNPd25Qcm9wZXJ0eU9mLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc09iamVjdCxnZXRUYWc7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLk1hcnNoYWxHZXRJbnRlcmZhY2VPZn0gTWFyc2hhbEdldEludGVyZmFjZU9mICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZSxcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PVxuT2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja0lmYWNlPShpZmFjZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5yZXR1cm4oXG4vKiBUT0RPIG90aGVyIHBvc3NpYmxlIGlmYWNlcywgb25jZSB3ZSBoYXZlIHRoaXJkIHBhcnR5IHZlcmFjaXR5Ki9cbih0eXBlb2YgaWZhY2U9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkmJihcblxuaWZhY2U9PT0nUmVtb3RhYmxlJ3x8XG5pZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKXx8XG5pZmFjZS5zdGFydHNXaXRoKCdEZWJ1Z05hbWU6ICcpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGb3Igbm93LCBpZmFjZSAke3EoXG5pZmFjZSlcbiB9IG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiOyB1bmltcGxlbWVudGVkYCkpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBBbiBgaWZhY2VgIG11c3QgYmUgcHVyZS4gUmlnaHQgbm93IGl0IG11c3QgYmUgYSBzdHJpbmcsIHdoaWNoIGlzIHB1cmUuXG4gKiBMYXRlciB3ZSBleHBlY3QgdG8gaW5jbHVkZSBzb21lIG90aGVyIHZhbHVlcyB0aGF0IHF1YWxpZnkgYXMgYFB1cmVEYXRhYCxcbiAqIHdoaWNoIGlzIGEgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGVuZGluZyBvbmx5IGluIHByaW1pdGl2ZXMgb3JcbiAqIGVtcHR5IHBhc3MtYnktY29weSBjb21wb3NpdGVzLiBObyByZW1vdGFibGVzLCBwcm9taXNlcywgb3IgZXJyb3JzLlxuICogV2UgKmFzc3VtZSogZm9yIG5vdyB0aGF0IHRoZSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgY29udGFpbnMgbm9cbiAqIHByb3hpZXMuXG4gKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0SWZhY2U9KGlmYWNlKT0+Y2hlY2tJZmFjZShpZmFjZSxhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydElmYWNlKGFzc2VydElmYWNlKTtcbmhhcmRlbihhc3NlcnRJZmFjZSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3QgfCBGdW5jdGlvbn0gb3JpZ2luYWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlUHJvdG9PZj0ob3JpZ2luYWwsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaXNPYmplY3Qob3JpZ2luYWwpfHxcbkZhaWwgYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4vKiBBIHZhbGlkIHJlbW90YWJsZSBvYmplY3QgbXVzdCBpbmhlcml0IGZyb20gYSBcInRhZyByZWNvcmRcIiAtLSBhKi9cbi8qIHBsYWluLW9iamVjdCBwcm90b3R5cGUgY29uc2lzdGluZyBvZiBvbmx5Ki9cbi8qIGEgYFBBU1NfU1RZTEVgIHByb3BlcnR5IHdpdGggdmFsdWUgXCJyZW1vdGFibGVcIiBhbmQgYSBzdWl0YWJsZSBgU3ltYm9sLnRvU3RyaW5nVGFnYCovXG4vKiBwcm9wZXJ0eS4gVGhlIHJlbW90YWJsZSBjb3VsZCBpbmhlcml0IGRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQsIG9yKi9cbi8qIGl0IGNvdWxkIGluaGVyaXQgZnJvbSBhbm90aGVyIHZhbGlkIHJlbW90YWJsZSwgdGhhdCB0aGVyZWZvcmUgaXRzZWxmKi9cbi8qIGluaGVyaXRzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZC4qL1xuLyoqL1xuLyogVE9ETzogSXQgd291bGQgYmUgbmljZSB0byB0eXBlZGVmIHRoaXMgc2hhcGUsIGJ1dCB3ZSBjYW4ndCBkZWNsYXJlIGEgdHlwZSovXG4vKiB3aXRoIFBBU1NfU1RZTEUgZnJvbSBKU0RvYy4qL1xuLyoqL1xuLyogQHR5cGUge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcsKi9cbi8qIFtTeW1ib2wudG9TdHJpbmdUYWddOiBzdHJpbmcsKi9cbi8qIH19Ki9cbi8qKi9cbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKG9yaWdpbmFsKTtcbmlmKHByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxwcm90bz09PW51bGwpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBSZW1vdGFibGVzIG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZDogJHtxKG9yaWdpbmFsKX1gKSk7XG5cbiB9XG5cbmlmKHR5cGVvZiBvcmlnaW5hbD09PSdvYmplY3QnKXtcbmNvbnN0IHByb3RvUHJvdG89Z2V0UHJvdG90eXBlT2YocHJvdG8pO1xuaWYocHJvdG9Qcm90byE9PW9iamVjdFByb3RvdHlwZSYmcHJvdG9Qcm90byE9PW51bGwpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiBjaGVja1JlbW90YWJsZShwcm90byxjaGVjayk7XG4gfVxuaWYoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1lbHNlIGlmKHR5cGVvZiBvcmlnaW5hbD09PSdmdW5jdGlvbicpe1xuaWYoIWNoZWNrRnVuY3Rpb25UYWdSZWNvcmQocHJvdG8sJ3JlbW90YWJsZScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06e3ZhbHVlOmlmYWNlfSxcbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHByb3RvKTtcblxucmV0dXJuKFxuKG93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhyZXN0RGVzY3MpfWApKSYmXG5cbmNoZWNrSWZhY2UoaWZhY2UsY2hlY2spKTtcblxuIH07XG5cbi8qKlxuICogS2VlcCBhIHdlYWsgc2V0IG9mIGNvbmZpcm1lZCByZW1vdGFibGVzIGZvciBtYXJzaGFsIHBlcmZvcm1hbmNlXG4gKiAod2l0aG91dCB3aGljaCB3ZSB3b3VsZCBpbmN1ciBhIHJlZHVuZGFudCB2ZXJpZmljYXRpb24gaW5cbiAqIGdldEludGVyZmFjZU9mKS5cbiAqIFdlIGRvbid0IHJlbWVtYmVyIHJlamVjdGlvbnMgYmVjYXVzZSB0aGV5IGFyZSBwb3NzaWJsZSB0byBjb3JyZWN0XG4gKiB3aXRoIGUuZy4gYGhhcmRlbmAuXG4gKlxuICogQHR5cGUge1dlYWtTZXQ8UmVtb3RhYmxlPn1cbiAqL1xuY29uc3QgY29uZmlybWVkUmVtb3RhYmxlcz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmVtb3RhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlPSh2YWwsY2hlY2spPT57XG5pZihjb25maXJtZWRSZW1vdGFibGVzLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZighaXNGcm96ZW4odmFsKSl7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke3ZhbH1gKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHJlc3VsdD1jaGVja1JlbW90YWJsZVByb3RvT2YodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb25maXJtZWRSZW1vdGFibGVzLmFkZCh2YWwpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqIEB0eXBlIHtNYXJzaGFsR2V0SW50ZXJmYWNlT2Z9ICovXG5jb25zdCAgICAgICAgZ2V0SW50ZXJmYWNlT2Y9KHZhbCk9PntcbmlmKFxuIWlzT2JqZWN0KHZhbCl8fFxudmFsW1BBU1NfU1RZTEVdIT09J3JlbW90YWJsZSd8fFxuIWNoZWNrUmVtb3RhYmxlKHZhbCkpXG57XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBnZXRUYWcodmFsKTtcbiB9OyRo4oCNX29uY2UuZ2V0SW50ZXJmYWNlT2YoZ2V0SW50ZXJmYWNlT2YpO1xuaGFyZGVuKGdldEludGVyZmFjZU9mKTtcblxuLyoqXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidyZW1vdGFibGUnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IHZhbGlkVHlwZT1cbihpc09iamVjdChjYW5kaWRhdGUpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpJiYoXG4haXNBcnJheShjYW5kaWRhdGUpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBhcnJheXMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKTtcbmlmKCF2YWxpZFR5cGUpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdvYmplY3QnKXtcbi8qIEV2ZXJ5IG93biBwcm9wZXJ0eSAocmVnYXJkbGVzcyBvZiBlbnVtZXJhYmlsaXR5KSovXG4vKiBtdXN0IGhhdmUgYSBmdW5jdGlvbiB2YWx1ZS4qL1xucmV0dXJuIG93bktleXMoZGVzY3MpLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4vKiBUeXBlY2FzdCBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG4oaGFzT3duUHJvcGVydHlPZihkZXNjc1svKiogQHR5cGUge3N0cmluZ30gKi9rZXldLCd2YWx1ZScpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBhY2Nlc3NvcnMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5rZXk9PT1TeW1ib2wudG9TdHJpbmdUYWcmJmNoZWNrSWZhY2UoY2FuZGlkYXRlW2tleV0sY2hlY2spfHxcbihjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIG5vbi1tZXRob2RzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxua2V5IT09UEFTU19TVFlMRXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEEgcGFzcy1ieS1yZW1vdGUgY2Fubm90IHNoYWRvdyAke3EoUEFTU19TVFlMRSl9YCkpKSk7XG5cbiB9KTtcbiB9ZWxzZSBpZih0eXBlb2YgY2FuZGlkYXRlPT09J2Z1bmN0aW9uJyl7XG4vKiBGYXIgZnVuY3Rpb25zIGNhbm5vdCBiZSBtZXRob2RzLCBhbmQgY2Fubm90IGhhdmUgbWV0aG9kcy4qL1xuLyogVGhleSBtdXN0IGhhdmUgZXhhY3RseSBleHBlY3RlZCBgLm5hbWVgIGFuZCBgLmxlbmd0aGAgcHJvcGVydGllcyovXG5jb25zdHtcbm5hbWU6bmFtZURlc2MsXG5sZW5ndGg6bGVuZ3RoRGVzYyxcbi8qIEB0cy1pZ25vcmUgVFMgZG9lc24ndCBsaWtlIHN5bWJvbHMgYXMgY29tcHV0ZWQgaW5kZXhlcz8/Ki9cbltTeW1ib2wudG9TdHJpbmdUYWddOnRvU3RyaW5nVGFnRGVzYyxcbi4uLnJlc3REZXNjc309XG5kZXNjcztcbmNvbnN0IHJlc3RLZXlzPW93bktleXMocmVzdERlc2NzKTtcbnJldHVybihcbihuYW1lRGVzYyYmdHlwZW9mIG5hbWVEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChYIGBGYXIgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkmJihcbmxlbmd0aERlc2MmJnR5cGVvZiBsZW5ndGhEZXNjLnZhbHVlPT09J251bWJlcid8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZhciBmdW5jdGlvbiBsZW5ndGggbXVzdCBiZSBhIG51bWJlciwgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnRvU3RyaW5nVGFnRGVzYz09PXVuZGVmaW5lZHx8XG4odHlwZW9mIHRvU3RyaW5nVGFnRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkmJlxuXG5jaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSxjaGVjaykpJiYoXG5yZXN0S2V5cy5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpKTtcblxuXG4gfVxucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYHVucmVjb2duaXplZCB0eXBlb2YgJHtjYW5kaWRhdGV9YCk7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PmNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKSxcblxuZXZlcnk6KF9wYXNzYWJsZSxfZm4pPT50cnVlfSk7JGjigI1fb25jZS5SZW1vdGFibGVIZWxwZXIoUmVtb3RhYmxlSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJZmFjZSI6WyJhc3NlcnRJZmFjZSJdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiJdLCJSZW1vdGFibGVIZWxwZXIiOlsiUmVtb3RhYmxlSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADXiToqaDwAAmg8AACsAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvc2FmZS1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFzc2VydFNhZmVQcm9taXNlIiwiaXNTYWZlUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsYXNzZXJ0Q2hlY2tlcixoYXNPd25Qcm9wZXJ0eU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2lzRnJvemVuLGdldFByb3RvdHlwZU9mfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZX0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXM9KHByLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscyk7XG5jb25zdCBrZXlzPW93bktleXMocHIpO1xuXG5pZihrZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5jb25zdCB1bmtub3duS2V5cz1rZXlzLmZpbHRlcihcbihrZXkpPT50eXBlb2Yga2V5IT09J3N5bWJvbCd8fCFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLGtleSkpO1xuXG5cbmlmKHVua25vd25LZXlzLmxlbmd0aCE9PTApe1xucmV0dXJuIHJlamVjdChcblggYCR7cHJ9IC0gTXVzdCBub3QgaGF2ZSBhbnkgb3duIHByb3BlcnRpZXM6ICR7cSh1bmtub3duS2V5cyl9YCk7XG5cbiB9XG5cbi8qKlxuICogQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCBOb2RlJ3MgYXN5bmNfaG9va3MgY29udGFpbnMgdGhlXG4gKiBmb2xsb3dpbmcgY29kZSwgd2hpY2ggd2UgY2FuIGFsc28gc2FmZWx5IHRvbGVyYXRlXG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIGRlc3Ryb3lUcmFja2luZyhwcm9taXNlLCBwYXJlbnQpIHtcbiAqIHRyYWNrUHJvbWlzZShwcm9taXNlLCBwYXJlbnQpO1xuICogICBjb25zdCBhc3luY0lkID0gcHJvbWlzZVthc3luY19pZF9zeW1ib2xdO1xuICogICBjb25zdCBkZXN0cm95ZWQgPSB7IGRlc3Ryb3llZDogZmFsc2UgfTtcbiAqICAgcHJvbWlzZVtkZXN0cm95ZWRTeW1ib2xdID0gZGVzdHJveWVkO1xuICogICByZWdpc3RlckRlc3Ryb3lIb29rKHByb21pc2UsIGFzeW5jSWQsIGRlc3Ryb3llZCk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGtleVxuICovXG5jb25zdCBjaGVja1NhZmVBc3luY0hvb2tzS2V5PShrZXkpPT57XG5jb25zdCB2YWw9cHJba2V5XTtcbmlmKHZhbD09PXVuZGVmaW5lZHx8dHlwZW9mIHZhbD09PSdudW1iZXInKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKFxudHlwZW9mIHZhbD09PSdvYmplY3QnJiZcbnZhbCE9PW51bGwmJlxuaXNGcm96ZW4odmFsKSYmXG5nZXRQcm90b3R5cGVPZih2YWwpPT09T2JqZWN0LnByb3RvdHlwZSlcbntcbmNvbnN0IHN1YktleXM9b3duS2V5cyh2YWwpO1xuaWYoc3ViS2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuaWYoXG5zdWJLZXlzLmxlbmd0aD09PTEmJlxuc3ViS2V5c1swXT09PSdkZXN0cm95ZWQnJiZcbnZhbC5kZXN0cm95ZWQ9PT1mYWxzZSlcbntcbnJldHVybiB0cnVlO1xuIH1cbiB9XG5yZXR1cm4gcmVqZWN0KFxuWCBgVW5leHBlY3RlZCBOb2RlIGFzeW5jX2hvb2tzIGFkZGl0aW9ucyB0byBwcm9taXNlOiAke3ByfS4ke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGlzICR7dmFsfWApO1xuXG4gfTtcblxucmV0dXJuIGtleXMuZXZlcnkoY2hlY2tTYWZlQXN5bmNIb29rc0tleSk7XG4gfTtcblxuLyoqXG4gKiBVbmRlciBIYXJkZW5lZCBKUyBhIHByb21pc2UgaXMgXCJzYWZlXCIgaWYgaXRzIGB0aGVuYCBtZXRob2QgY2FuIGJlIGNhbGxlZFxuICogc3luY2hyb25vdXNseSB3aXRob3V0IGdpdmluZyB0aGUgcHJvbWlzZSBhbiBvcHBvcnR1bml0eSBmb3IgYVxuICogcmVlbnRyYW5jeSBhdHRhY2sgZHVyaW5nIHRoYXQgY2FsbC5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzlcbiAqIHJhaXNlcyB0aGUgaXNzdWUgb2YgdGVzdGluZyB0aGF0IGEgc3BlY2ltZW4gaXMgYSBzYWZlIHByb21pc2VcbiAqIHN1Y2ggdGhhdCB0aGUgdGVzdCBhbHNvIGRvZXMgbm90IGdpdmUgdGhlIHNwZWNpbWVuIGFcbiAqIHJlZW50cmFuY3kgb3Bwb3J0dW5pdHkuIFRoYXQgaXMgd2VsbCBiZXlvbmQgdGhlIGFtYml0aW9uIGhlcmUuXG4gKiBUT0RPIFRob3VnaCBpZiB3ZSBmaWd1cmUgb3V0IGEgbmljZSBzb2x1dGlvbiwgaXQgbWlnaHQgYmUgZ29vZCB0b1xuICogdXNlIGl0IGhlcmUgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xucmV0dXJuKFxuKGlzRnJvemVuKHByKXx8cmVqZWN0KFggYCR7cHJ9IC0gTXVzdCBiZSBmcm96ZW5gKSkmJihcbmlzUHJvbWlzZShwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkpJiYoXG5nZXRQcm90b3R5cGVPZihwcik9PT1Qcm9taXNlLnByb3RvdHlwZXx8XG5yZWplY3QoXG5YIGAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG5nZXRQcm90b3R5cGVPZihwcikpXG4gfWApKSYmXG5cbmNoZWNrUHJvbWlzZU93bktleXMoLyoqIEB0eXBlIHtQcm9taXNlfSAqL3ByLGNoZWNrKSk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5jb25zdCAgICAgICAgaXNTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLCh4KT0+eCk7JGjigI1fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0U2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwcixhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1NhZmVQcm9taXNlIjpbImlzU2FmZVByb21pc2UiXSwiYXNzZXJ0U2FmZVByb21pc2UiOlsiYXNzZXJ0U2FmZVByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxx/VUEcSAABHEgAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9zeW1ib2wuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIGNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBUaGUgd2VsbCBrbm93biBzeW1ib2xzIGFyZSBzdGF0aWMgc3ltYm9sIHZhbHVlcyBvbiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzPW5ldyBNYXAoXG5vd25LZXlzKFN5bWJvbCkuXG5maWx0ZXIoXG4obmFtZSk9PnR5cGVvZiBuYW1lPT09J3N0cmluZycmJnR5cGVvZiBTeW1ib2xbbmFtZV09PT0nc3ltYm9sJykuXG5cbmZpbHRlcigobmFtZSk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi9cbiFuYW1lLnN0YXJ0c1dpdGgoJ0BAJyl8fFxuRmFpbCBgRGlkIG5vdCBleHBlY3QgU3ltYm9sIHRvIGhhdmUgYSBzeW1ib2wtdmFsdWVkIHByb3BlcnR5IG5hbWUgc3RhcnRpbmcgd2l0aCBcIkBAXCIgJHtxKFxubmFtZSlcbiB9YDtcbnJldHVybiB0cnVlO1xuIH0pXG4vKiBAdHMtaWdub3JlIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovLlxubWFwKChuYW1lKT0+W1N5bWJvbFtuYW1lXSwgYEBAJHtuYW1lfWBdKSk7XG5cblxuLyoqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzeW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG50eXBlb2Ygc3ltPT09J3N5bWJvbCcmJihcbnR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSk9PT0nc3RyaW5nJ3x8d2VsbEtub3duU3ltYm9sTmFtZXMuaGFzKHN5bSkpOyRo4oCNX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sPShzeW0pPT5cbmlzUGFzc2FibGVTeW1ib2woc3ltKXx8XG5GYWlsIGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGVTeW1ib2woYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcblxuLyoqXG4gKiBJZiBgc3ltYCBpcyBhIHBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzXG4gKiBzeW1ib2wuIElmIGBzeW1gIGlzIGEgbm9uLXBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICpcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuIFNpbmNlIHRoZSByZWdpc3RyYXRpb24gc3RyaW5nIG9mIGEgcmVnaXN0ZXJlZCBzeW1ib2wgY2FuIGJlIGFueVxuICogc3RyaW5nLCBpZiB3ZSBzaW1wbHkgdXNlZCB0aGF0IHRvIGlkZW50aWZ5IHRob3NlIHN5bWJvbHMsIHRoZXJlIHdvdWxkIG5vdFxuICogYmUgYW55IHJlbWFpbmluZyBzdHJpbmdzIGxlZnQgb3ZlciB0byBpZGVudGlmeSB0aGUgd2VsbC1rbm93biBzeW1ib2xzLlxuICogSW5zdGVhZCwgd2UgcmVzZXJ2ZSBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGBcIkBAXCJgIGZvciBwdXJwb3NlcyBvZiB0aGlzXG4gKiBlbmNvZGluZy4gV2UgaWRlbnRpZnkgYSB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiBieSBwcmVmaXhpbmcgdGhlIHByb3BlcnR5IG5hbWUgd2l0aCBgXCJAQFwiYCwgc3VjaCBhcyBgXCJAQGl0ZXJhdG9yXCJgLlxuICogRm9yIHJlZ2lzdGVyZWQgc3ltYm9scyB3aG9zZSBuYW1lIGhhcHBlbnMgdG8gYmVnaW4gd2l0aCBgXCJAQFwiYCwgc3VjaFxuICogYXMgYFN5bWJvbC5mb3IoJ0BAaXRlcmF0b3InKWAgb3IgYFN5bWJvbC5mb3IoJ0BAZm9vJylgLCB3ZSBpZGVudGlmeVxuICogdGhlbSBieSBwcmVmaXhpbmcgdGhlbSB3aXRoIGFuIGV4dHJhIGBcIkBAXCJgLCBzdWNoIGFzXG4gKiBgXCJAQEBAaXRlcmF0b3JcImAgb3IgYFwiQEBAQGZvb1wiYC4gKFRoaXMgaXMgdGhlIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmdcbiAqIHRlY2huaXF1ZS4pXG4gKlxuICogQHBhcmFtIHtzeW1ib2x9IHN5bVxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cbmNvbnN0ICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2w9KHN5bSk9PntcbmNvbnN0IG5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYobmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gfVxuaWYobmFtZS5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBgQEAke25hbWV9YDtcbiB9XG5yZXR1cm4gbmFtZTtcbiB9OyRo4oCNX29uY2UubmFtZUZvclBhc3NhYmxlU3ltYm9sKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4obmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogSWYgYG5hbWVgIGlzIGEgc3RyaW5nIHRoYXQgY291bGQgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5XG4gKiBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCwgcmV0dXJuIHRoZSBzeW1ib2wgYXJndW1lbnQgaXQgd2FzIHByb2R1Y2VkIHRvXG4gKiByZXByZXNlbnQuXG4gKlxuICogICAgSWYgYG5hbWVgIGRvZXMgbm90IGJlZ2luIHdpdGggYFwiQEBcImAsIHRoZW4ganVzdCB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgICByZWdpc3RlcmVkIHN5bWJvbCwgYFN5bWJvbC5mb3IobmFtZSlgLlxuICogICAgSWYgYG5hbWVgIGlzIGBcIkBAXCJgIGZvbGxvd2VkIGJ5IGEgd2VsbCBrbm93biBzeW1ib2wncyBwcm9wZXJ0eSBuYW1lIG9uXG4gKiAgICAgIGBTeW1ib2xgIHN1Y2ggYFwiQEBpdGVyYXRvclwiLCByZXR1cm4gdGhhdCB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzXG4gKiAgICAgIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiAgICBJZiBgbmFtZWAgYmVnaW5zIHdpdGggYFwiQEBAQFwiYCBpdCBlbmNvZGVzIHRoZSByZWdpc3RlcmVkIHN5bWJvbCB3aG9zZVxuICogICAgICBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGluc3RlYWQuXG4gKiAgICBPdGhlcndpc2UsIGlmIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaXQgbWF5IGVuY29kZSBhIHJlZ2lzdGVyZWQgc3ltYm9sXG4gKiAgICAgIGZyb20gYSBmdXR1cmUgdmVyc2lvbiBvZiBKYXZhU2NyaXB0LCBidXQgaXQgaXMgbm90IG9uZSB3ZSBjYW4gZGVjb2RlXG4gKiAgICAgIHlldCwgc28gdGhyb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtzeW1ib2w9fVxuICovXG5jb25zdCAgICAgICAgcGFzc2FibGVTeW1ib2xGb3JOYW1lPShuYW1lKT0+e1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5pZihtYXRjaCl7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5pZihzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuIH1lbHNle1xuY29uc3Qgc3ltPVN5bWJvbFtzdWZmaXhdO1xuaWYodHlwZW9mIHN5bT09PSdzeW1ib2wnKXtcbnJldHVybiBzeW07XG4gfVxuRmFpbCBgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gfVxuIH1cbnJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xuIH07JGjigI1fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJbxc+/0HAAD9BwAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90YWdnZWQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsY2hlY2tOb3JtYWxQcm9wZXJ0eSxjaGVja1Bhc3NTdHlsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsIFskaOKAjV9hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBUYWdnZWRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTondGFnZ2VkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PlxuY2hlY2tQYXNzU3R5bGUoY2FuZGlkYXRlLCd0YWdnZWQnLGNoZWNrKSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuY2hlY2tUYWdSZWNvcmQoY2FuZGlkYXRlLCd0YWdnZWQnLGFzc2VydENoZWNrZXIpO1xuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06X2xhYmVsRGVzYyxcbnBheWxvYWQ6X3BheWxvYWREZXNjLC8qIHZhbHVlIGNoZWNrZWQgYnkgcmVjdXJzaXZlIHdhbGsgYXQgdGhlIGVuZCovXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xub3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxuRmFpbCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ3BheWxvYWQnLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbnBhc3NTdHlsZU9mUmVjdXIoY2FuZGlkYXRlLnBheWxvYWQpO1xuIH19KTskaOKAjV9vbmNlLlRhZ2dlZEhlbHBlcihUYWdnZWRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAeqB+aBINAAASDQAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXkgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBBS0EgYSBcImNvcHlBcnJheVwiXG4gKiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyXG4gKiBAcmV0dXJucyB7YXJyIGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5jb25zdCBpc0NvcHlBcnJheT0oYXJyKT0+cGFzc1N0eWxlT2YoYXJyKT09PSdjb3B5QXJyYXknOyRo4oCNX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQsIEFLQSBhXG4gKiBcImNvcHlSZWNvcmRcIiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVjb3JkXG4gKiBAcmV0dXJucyB7cmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuY29uc3QgaXNSZWNvcmQ9KHJlY29yZCk9PnBhc3NTdHlsZU9mKHJlY29yZCk9PT0nY29weVJlY29yZCc7JGjigI1fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcmVtb3RhYmxlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHJldHVybnMge3JlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cbmNvbnN0IGlzUmVtb3RhYmxlPShyZW1vdGFibGUpPT5wYXNzU3R5bGVPZihyZW1vdGFibGUpPT09J3JlbW90YWJsZSc7JGjigI1fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRBcnJheVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mQXJyYXlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFycmF5IGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0QXJyYXl9ICovXG5jb25zdCBhc3NlcnRDb3B5QXJyYXk9KGFycmF5LG9wdE5hbWVPZkFycmF5PSdBbGxlZ2VkIGFycmF5Jyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihhcnJheSk7XG5wYXNzU3R5bGU9PT0nY29weUFycmF5J3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2FycmF5fSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZWNvcmRcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZWNvcmR9ICovXG5jb25zdCBhc3NlcnRSZWNvcmQ9KHJlY29yZCxvcHROYW1lT2ZSZWNvcmQ9J0FsbGVnZWQgcmVjb3JkJyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZWNvcmQpO1xucGFzc1N0eWxlPT09J2NvcHlSZWNvcmQnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZWNvcmQpfSAke3JlY29yZH0gbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlY29yZChhc3NlcnRSZWNvcmQpO1xuaGFyZGVuKGFzc2VydFJlY29yZCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlbW90YWJsZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlbW90YWJsZVxuICogQHJldHVybnMge2Fzc2VydHMgcmVtb3RhYmxlIGlzIFJlbW90YWJsZX1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydFJlbW90YWJsZX0gKi9cbmNvbnN0IGFzc2VydFJlbW90YWJsZT0oXG5yZW1vdGFibGUsXG5vcHROYW1lT2ZSZW1vdGFibGU9J0FsbGVnZWQgcmVtb3RhYmxlJyk9Plxue1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlbW90YWJsZSk7XG5wYXNzU3R5bGU9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACwnEJ+4goAAOIKAAAeAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiLCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIiwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIiwiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy91dGlscy5qcyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIiwia2V5TFQiLCJrZXlMVCIsIm9iamVjdE1hcCIsIm9iamVjdE1hcCIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMva2V5cy9jaGVja0tleS5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5U2V0LmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvcHlCYWcuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW11dLFtcIi4vc3JjL3V0aWxzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIjpbWyJpc0tleSIsImlzS2V5Il0sWyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiXSxbImFzc2VydFNjYWxhcktleSIsImFzc2VydFNjYWxhcktleSJdLFsibWFrZUNvcHlTZXQiLCJtYWtlQ29weVNldCJdLFsiZ2V0Q29weVNldEtleXMiLCJnZXRDb3B5U2V0S2V5cyJdLFsibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZyJdLFsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLFsiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5QmFnRW50cmllcyJdLFsibWFrZUNvcHlNYXAiLCJtYWtlQ29weU1hcCJdLFsiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIjpbWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdXSwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjpbWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXV0sIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOltbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl1dLCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOltbImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzSXNTdXBlcnNldCJdLFsiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50Il0sWyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0NvbXBhcmUiXSxbImVsZW1lbnRzVW5pb24iLCJlbGVtZW50c1VuaW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSxbImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSxbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLFsic2V0SXNTdXBlcnNldCIsInNldElzU3VwZXJzZXQiXSxbInNldElzRGlzam9pbnQiLCJzZXRJc0Rpc2pvaW50Il0sWyJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSJdLFsic2V0VW5pb24iLCJzZXRVbmlvbiJdLFsic2V0RGlzam9pbnRVbmlvbiIsInNldERpc2pvaW50VW5pb24iXSxbInNldEludGVyc2VjdGlvbiIsInNldEludGVyc2VjdGlvbiJdLFsic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50U3VidHJhY3QiXV0sIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6W1siYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOltbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJtdXN0TWF0Y2giLCJtdXN0TWF0Y2giXV0sIi4vc3JjL3V0aWxzLmpzIjpbWyJsaXN0RGlmZmVyZW5jZSIsImxpc3REaWZmZXJlbmNlIl0sWyJvYmplY3RNYXAiLCJvYmplY3RNYXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMsXGeCkRgAApEYAACoAAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY2hlY2tLZXkuanN7ImltcG9ydHMiOlsiLi4vdXRpbHMuanMiLCIuL2NvcHlCYWcuanMiLCIuL2NvcHlTZXQuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUJhZyIsImFzc2VydENvcHlNYXAiLCJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0S2V5IiwiYXNzZXJ0UHJpbWl0aXZlS2V5IiwiYXNzZXJ0U2NhbGFyS2V5IiwiY2hlY2tDb3B5QmFnIiwiY2hlY2tDb3B5TWFwIiwiY2hlY2tDb3B5U2V0IiwiY2hlY2tLZXkiLCJjaGVja1NjYWxhcktleSIsImNvcHlNYXBLZXlTZXQiLCJldmVyeUNvcHlCYWdFbnRyeSIsImV2ZXJ5Q29weU1hcEtleSIsImV2ZXJ5Q29weU1hcFZhbHVlIiwiZXZlcnlDb3B5U2V0S2V5IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBLZXlzIiwiZ2V0Q29weU1hcFZhbHVlcyIsImdldENvcHlTZXRLZXlzIiwiaXNDb3B5QmFnIiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwiaXNLZXkiLCJpc1ByaW1pdGl2ZUtleSIsImlzU2NhbGFyS2V5IiwibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixhc3NlcnRQYXNzYWJsZSxGYXIsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssaWRlbnRDaGVja2VyLGNoZWNrRWxlbWVudHMsbWFrZVNldE9mRWxlbWVudHMsY2hlY2tCYWdFbnRyaWVzLG1ha2VCYWdPZkVudHJpZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL3V0aWxzLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRWxlbWVudHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoY2hlY2tCYWdFbnRyaWVzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXlDb21wYXJpc29ufSBLZXlDb21wYXJpc29uICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5fSBLZXkgKi9cbi8qKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5QmFnPEs+fSBDb3B5QmFnICovXG4vKiogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV0gQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ29weVNldDxLPn0gQ29weVNldCAqL1xuLyoqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFtWPVBhc3NhYmxlXSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5TWFwPEssIFY+fSBDb3B5TWFwICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyZX0gS2V5Q29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8gUHJpbWl0aXZlIGFuZCBTY2FsYXIga2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQcmltaXRpdmVLZXk9KHZhbCxjaGVjayk9PntcbmlmKGlzT2JqZWN0KHZhbCkpe1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSAke3EodHlwZW9mIHZhbCl9IGNhbm5vdCBiZSBhIHByaW1pdGl2ZTogJHt2YWx9YCkpO1xuXG4gfVxuLyogVE9ETyBUaGVyZSBpcyBub3QgeWV0IGEgY2hlY2tQYXNzYWJsZSwgYnV0IHBlcmhhcHMgdGhlcmUgc2hvdWxkIGJlLiovXG4vKiBJZiB0aGF0IGhhcHBlbnMsIHdlIHNob3VsZCBjYWxsIGl0IGhlcmUgaW5zdGVhZC4qL1xuYXNzZXJ0UGFzc2FibGUodmFsKTtcbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUHJpbWl0aXZlS2V5PSh2YWwpPT5jaGVja1ByaW1pdGl2ZUtleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzUHJpbWl0aXZlS2V5KGlzUHJpbWl0aXZlS2V5KTtcbmhhcmRlbihpc1ByaW1pdGl2ZUtleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFByaW1pdGl2ZUtleT0odmFsKT0+e1xuY2hlY2tQcmltaXRpdmVLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRQcmltaXRpdmVLZXkoYXNzZXJ0UHJpbWl0aXZlS2V5KTtcbmhhcmRlbihhc3NlcnRQcmltaXRpdmVLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja1NjYWxhcktleT0odmFsLGNoZWNrKT0+e1xuaWYoaXNQcmltaXRpdmVLZXkodmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbmlmKHBhc3NTdHlsZT09PSdyZW1vdGFibGUnKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBzY2FsYXIga2V5OiAke3ZhbH1gKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmNoZWNrU2NhbGFyS2V5KGNoZWNrU2NhbGFyS2V5KTtcbmNvbnN0ICAgICAgICBpc1NjYWxhcktleT0odmFsKT0+Y2hlY2tTY2FsYXJLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc1NjYWxhcktleShpc1NjYWxhcktleSk7XG5oYXJkZW4oaXNTY2FsYXJLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRTY2FsYXJLZXk9KHZhbCk9PntcbmNoZWNrU2NhbGFyS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0U2NhbGFyS2V5KGFzc2VydFNjYWxhcktleSk7XG5oYXJkZW4oYXNzZXJ0U2NhbGFyS2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8S2V5Pn0gKi9cbmNvbnN0IGtleU1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tLZXk9KHZhbCxjaGVjayk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbi8qIFRPRE8gVGhlcmUgaXMgbm90IHlldCBhIGNoZWNrUGFzc2FibGUsIGJ1dCBwZXJoYXBzIHRoZXJlIHNob3VsZCBiZS4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGQgY2FsbCBpdCBoZXJlIGluc3RlYWQuKi9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihrZXlNZW1vLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCByZXN1bHQ9Y2hlY2tLZXlJbnRlcm5hbCh2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbi8qIERvbid0IGNhY2hlIHRoZSB1bmRlZmluZWQgY2FzZXMsIHNvIHRoYXQgaWYgaXQgaXMgdHJpZWQgYWdhaW4qL1xuLyogd2l0aCBgYXNzZXJ0Q2hlY2tlcmAgaXQnbGwgdGhyb3cgYSBkaWFnbm9zdGljIGFnYWluKi9cbmtleU1lbW8uYWRkKHZhbCk7XG4gfVxuLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBtZW1vaXplIGEgbmVnYXRpdmUganVkZ2VtZW50LCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkKi9cbi8qIGFnYWluIHdpdGggYSBjaGVja2VyLCBpdCB3aWxsIHN0aWxsIHByb2R1Y2UgYSB1c2VmdWwgZGlhZ25vc3RpYy4qL1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tLZXkoY2hlY2tLZXkpO1xuaGFyZGVuKGNoZWNrS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNLZXk9KHZhbCk9PmNoZWNrS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNLZXkoaXNLZXkpO1xuaGFyZGVuKGlzS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge0tleX0gdmFsXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRLZXk9KHZhbCk9PntcbmNoZWNrS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0S2V5KGFzc2VydEtleSk7XG5oYXJkZW4oYXNzZXJ0S2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5U2V0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlTZXQgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5U2V0Pn0gKi9cbmNvbnN0IGNvcHlTZXRNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlTZXQ9KHMsY2hlY2spPT57XG5pZihjb3B5U2V0TWVtby5oYXMocykpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVzdWx0PVxuKHBhc3NTdHlsZU9mKHMpPT09J3RhZ2dlZCcmJmdldFRhZyhzKT09PSdjb3B5U2V0J3x8XG5jaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5U2V0OiAke3N9YCkpJiZcbmNoZWNrRWxlbWVudHMocy5wYXlsb2FkLGNoZWNrKSYmXG5jaGVja0tleShzLnBheWxvYWQsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvcHlTZXRNZW1vLmFkZChzKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlTZXQoY2hlY2tDb3B5U2V0KTtcbmhhcmRlbihjaGVja0NvcHlTZXQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHtzIGlzIENvcHlTZXR9XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlTZXR9ICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0PShzKT0+Y2hlY2tDb3B5U2V0KHMsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuaGFyZGVuKGlzQ29weVNldCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHMgaXMgQ29weVNldH1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlTZXR9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weVNldD0ocyk9PntcbmNoZWNrQ29weVNldChzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5U2V0KGFzc2VydENvcHlTZXQpO1xuaGFyZGVuKGFzc2VydENvcHlTZXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5U2V0S2V5cz0ocyk9PntcbmFzc2VydENvcHlTZXQocyk7XG5yZXR1cm4gcy5wYXlsb2FkO1xuIH07JGjigI1fb25jZS5nZXRDb3B5U2V0S2V5cyhnZXRDb3B5U2V0S2V5cyk7XG5oYXJkZW4oZ2V0Q29weVNldEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5U2V0S2V5PShzLGZuKT0+XG5nZXRDb3B5U2V0S2V5cyhzKS5ldmVyeSgoa2V5LGluZGV4KT0+Zm4oa2V5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlTZXRLZXkoZXZlcnlDb3B5U2V0S2V5KTtcbmhhcmRlbihldmVyeUNvcHlTZXRLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weVNldD0oZWxlbWVudEl0ZXIpPT57XG5jb25zdCByZXN1bHQ9bWFrZVNldE9mRWxlbWVudHMoZWxlbWVudEl0ZXIpO1xuYXNzZXJ0Q29weVNldChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlTZXQobWFrZUNvcHlTZXQpO1xuaGFyZGVuKG1ha2VDb3B5U2V0KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5QmFnIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlCYWcgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5QmFnPn0gKi9cbmNvbnN0IGNvcHlCYWdNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlCYWc9KGIsY2hlY2spPT57XG5pZihjb3B5QmFnTWVtby5oYXMoYikpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVzdWx0PVxuKHBhc3NTdHlsZU9mKGIpPT09J3RhZ2dlZCcmJmdldFRhZyhiKT09PSdjb3B5QmFnJ3x8XG5jaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5QmFnOiAke2J9YCkpJiZcbmNoZWNrQmFnRW50cmllcyhiLnBheWxvYWQsY2hlY2spJiZcbmNoZWNrS2V5KGIucGF5bG9hZCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29weUJhZ01lbW8uYWRkKGIpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrQ29weUJhZyhjaGVja0NvcHlCYWcpO1xuaGFyZGVuKGNoZWNrQ29weUJhZyk7XG5cbi8qKlxuICogQGNhbGxiYWNrIElzQ29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2IgaXMgQ29weUJhZ31cbiAqL1xuXG4vKiogQHR5cGUge0lzQ29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlCYWc9KGIpPT5jaGVja0NvcHlCYWcoYixpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNDb3B5QmFnKGlzQ29weUJhZyk7XG5oYXJkZW4oaXNDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2Fzc2VydHMgYiBpcyBDb3B5QmFnfVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5QmFnPShiKT0+e1xuY2hlY2tDb3B5QmFnKGIsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlCYWcoYXNzZXJ0Q29weUJhZyk7XG5oYXJkZW4oYXNzZXJ0Q29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHJldHVybnMge0NvcHlCYWc8Sz5bJ3BheWxvYWQnXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlCYWdFbnRyaWVzPShiKT0+e1xuYXNzZXJ0Q29weUJhZyhiKTtcbnJldHVybiBiLnBheWxvYWQ7XG4gfTskaOKAjV9vbmNlLmdldENvcHlCYWdFbnRyaWVzKGdldENvcHlCYWdFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5QmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHBhcmFtIHsoZW50cnk6IFtLLCBiaWdpbnRdLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlCYWdFbnRyeT0oYixmbik9PlxuZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LGluZGV4KT0+Zm4oZW50cnksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weUJhZ0VudHJ5KGV2ZXJ5Q29weUJhZ0VudHJ5KTtcbmhhcmRlbihldmVyeUNvcHlCYWdFbnRyeSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weUJhZz0oYmFnRW50cnlJdGVyKT0+e1xuY29uc3QgcmVzdWx0PW1ha2VCYWdPZkVudHJpZXMoYmFnRW50cnlJdGVyKTtcbmFzc2VydENvcHlCYWcocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5QmFnKG1ha2VDb3B5QmFnKTtcbmhhcmRlbihtYWtlQ29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzPShlbGVtZW50SXRlcik9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuY29uc3Qgc29ydGVkPXNvcnRCeVJhbmsoZWxlbWVudEl0ZXIsZnVsbENvbXBhcmUpO1xuLyoqIEB0eXBlIHtbSyxiaWdpbnRdW119ICovXG5jb25zdCBlbnRyaWVzPVtdO1xuZm9yKGxldCBpPTA7aTxzb3J0ZWQubGVuZ3RoOyl7XG5jb25zdCBrPXNvcnRlZFtpXTtcbmxldCBqPWkrMTtcbndoaWxlKGo8c29ydGVkLmxlbmd0aCYmZnVsbENvbXBhcmUoayxzb3J0ZWRbal0pPT09MCl7XG5qKz0xO1xuIH1cbmVudHJpZXMucHVzaChbayxCaWdJbnQoai1pKV0pO1xuaT1qO1xuIH1cbnJldHVybiBtYWtlQ29weUJhZyhlbnRyaWVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlCYWdGcm9tRWxlbWVudHMobWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5TWFwIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlNYXAncyBrZXlzIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weU1hcD59ICovXG5jb25zdCBjb3B5TWFwTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5TWFwPShtLGNoZWNrKT0+e1xuaWYoY29weU1hcE1lbW8uaGFzKG0pKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKCEocGFzc1N0eWxlT2YobSk9PT0ndGFnZ2VkJyYmZ2V0VGFnKG0pPT09J2NvcHlNYXAnKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgTm90IGEgY29weU1hcDogJHttfWApO1xuIH1cbmNvbnN0e3BheWxvYWR9PW07XG5pZihwYXNzU3R5bGVPZihwYXlsb2FkKSE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IGJlIGEgcmVjb3JkOiAke219YCk7XG4gfVxuY29uc3R7a2V5cyx2YWx1ZXMsLi4ucmVzdH09cGF5bG9hZDtcbmNvbnN0IHJlc3VsdD1cbihvd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBvbmx5IGhhdmUgLmtleXMgYW5kIC52YWx1ZXM6ICR7bX1gKSkmJlxuXG5jaGVja0VsZW1lbnRzKGtleXMsY2hlY2spJiZcbmNoZWNrS2V5KGtleXMsY2hlY2spJiYoXG5wYXNzU3R5bGVPZih2YWx1ZXMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgLnZhbHVlcyBtdXN0IGJlIGEgY29weUFycmF5OiAke219YCkpJiYoXG5rZXlzLmxlbmd0aD09PXZhbHVlcy5sZW5ndGh8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGtleXMgYW5kIHZhbHVlczogJHttfWApKTtcblxuaWYocmVzdWx0KXtcbmNvcHlNYXBNZW1vLmFkZChtKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlNYXAoY2hlY2tDb3B5TWFwKTtcbmhhcmRlbihjaGVja0NvcHlNYXApO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlNYXBcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHttIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlNYXB9ICovXG5jb25zdCAgICAgICAgaXNDb3B5TWFwPShtKT0+Y2hlY2tDb3B5TWFwKG0saWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuaGFyZGVuKGlzQ29weU1hcCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlNYXBcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHthc3NlcnRzIG0gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlNYXB9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weU1hcD0obSk9PntcbmNoZWNrQ29weU1hcChtLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5TWFwKGFzc2VydENvcHlNYXApO1xuaGFyZGVuKGFzc2VydENvcHlNYXApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0tbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBLZXlzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbnJldHVybiBtLnBheWxvYWQua2V5cztcbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcEtleXMoZ2V0Q29weU1hcEtleXMpO1xuaGFyZGVuKGdldENvcHlNYXBLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtWW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwVmFsdWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbnJldHVybiBtLnBheWxvYWQudmFsdWVzO1xuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwVmFsdWVzKGdldENvcHlNYXBWYWx1ZXMpO1xuaGFyZGVuKGdldENvcHlNYXBWYWx1ZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBFbnRyaWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbmNvbnN0e1xucGF5bG9hZDp7a2V5cyx2YWx1ZXN9fT1cbm07XG5jb25zdHtsZW5ndGh9PS8qKiBAdHlwZSB7QXJyYXl9ICova2V5cztcbnJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPTA7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmF0b3InLHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8W0ssVl0sdm9pZD59ICovXG5sZXQgcmVzdWx0O1xuaWYoaTxsZW5ndGgpe1xucmVzdWx0PWhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTpba2V5c1tpXSx2YWx1ZXNbaV1dfSk7XG5pKz0xO1xucmV0dXJuIHJlc3VsdDtcbiB9ZWxzZXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH19KTtcblxuIH19KTtcblxuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlNYXBLZXk9KG0sZm4pPT5cbmdldENvcHlNYXBLZXlzKG0pLmV2ZXJ5KChrZXksaW5kZXgpPT5mbihrZXksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weU1hcEtleShldmVyeUNvcHlNYXBLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcGFyYW0geyh2YWx1ZTogViwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5TWFwVmFsdWU9KG0sZm4pPT5cbmdldENvcHlNYXBWYWx1ZXMobSkuZXZlcnkoKHZhbHVlLGluZGV4KT0+Zm4odmFsdWUsaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weU1hcFZhbHVlKGV2ZXJ5Q29weU1hcFZhbHVlKTtcbmhhcmRlbihldmVyeUNvcHlNYXBWYWx1ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIGNvcHlNYXBLZXlTZXQ9KG0pPT5cbi8qIEEgY29weU1hcCdzIGtleXMgYXJlIGFscmVhZHkgaW4gdGhlIGludGVybmFsIGZvcm0gdXNlZCBieSBjb3B5U2V0cy4qL1xubWFrZVRhZ2dlZCgnY29weVNldCcsbS5wYXlsb2FkLmtleXMpOyRo4oCNX29uY2UuY29weU1hcEtleVNldChjb3B5TWFwS2V5U2V0KTtcbmhhcmRlbihjb3B5TWFwS2V5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgVl0+fSBlbnRyaWVzXG4gKiBAcmV0dXJucyB7Q29weU1hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlNYXA9KGVudHJpZXMpPT57XG4vKiBUaGlzIGlzIHdlaXJkLCBidXQgcmV2ZXJzZSByYW5rIHNvcnRpbmcgdGhlIGVudHJpZXMgaXMgYSBnb29kIGZpcnN0IHN0ZXAqL1xuLyogZm9yIGdldHRpbmcgdGhlIHJhbmsgc29ydGVkIGtleXMgdG9nZXRoZXIgd2l0aCB0aGUgdmFsdWVzKi9cbi8qIG9yZ2FuaXplZCBieSB0aG9zZSBrZXlzLiBBbHNvLCBhbW9uZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoKi9cbi8qIGtleXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MsIHRob3NlIGFyZSByYW5rIHNvcnRlZC4qL1xuLyogVE9ETyBUaGlzKi9cbi8qIGNvdWxkIHNvbHZlIHRoZSBjb3B5TWFwIGNvdmVyIGlzc3VlIGV4cGxhaW5lZCBpbiBwYXR0ZXJuTWF0Y2hlcnMuanMuKi9cbi8qIEJ1dCBvbmx5IGlmIHdlIGluY2x1ZGUgdGhpcyBjcml0ZXJpYSBpbiBvdXIgdmFsaWRhdGlvbiBvZiBjb3B5TWFwcywqL1xuLyogd2hpY2ggd2UgY3VycmVudGx5IGRvIG5vdC4qL1xuY29uc3Qgc29ydGVkRW50cmllcz1zb3J0QnlSYW5rKGVudHJpZXMsY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0IGtleXM9c29ydGVkRW50cmllcy5tYXAoKFtrLF92XSk9PmspO1xuY29uc3QgdmFsdWVzPXNvcnRlZEVudHJpZXMubWFwKChbX2ssdl0pPT52KTtcbmNvbnN0IHJlc3VsdD1tYWtlVGFnZ2VkKCdjb3B5TWFwJyx7a2V5cyx2YWx1ZXN9KTtcbmFzc2VydENvcHlNYXAocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5TWFwKG1ha2VDb3B5TWFwKTtcbmhhcmRlbihtYWtlQ29weU1hcCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIFJlY3VyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0tleUludGVybmFsPSh2YWwsY2hlY2spPT57XG5jb25zdCBjaGVja0l0PShjaGlsZCk9PmNoZWNrS2V5KGNoaWxkLGNoZWNrKTtcblxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuLyogQSBjb3B5UmVjb3JkIGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbnJldHVybiBPYmplY3QudmFsdWVzKHZhbCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIEEgY29weUFycmF5IGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbnJldHVybiB2YWwuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4oXG5jaGVja0NvcHlNYXAodmFsLGNoZWNrKSYmXG4vKiBGb3IgYSBjb3B5TWFwIHRvIGJlIGEga2V5LCBhbGwgaXRzIGtleXMgYW5kIHZhbHVlcyBtdXN0Ki9cbi8qIGJlIGtleXMuIEtleXMgYWxyZWFkeSBjaGVja2VkIGJ5IGBjaGVja0NvcHlNYXBgIHNpbmNlKi9cbi8qIHRoYXQncyBhIGNvcHlNYXAgcmVxdWlyZW1lbnQgaW4gZ2VuZXJhbC4qL1xuZXZlcnlDb3B5TWFwVmFsdWUodmFsLGNoZWNrSXQpKTtcblxuIH1cbmRlZmF1bHQ6e1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHt2YWx9YCkpO1xuXG4gfX1cblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG4vKiBBbGwgcmVtb3RhYmxlcyBhcmUga2V5cy4qL1xucmV0dXJuIHRydWU7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBrZXlgKTtcbiB9XG5kZWZhdWx0Ontcbi8qIFVuZXhwZWN0ZWQgdGFncyBhcmUganVzdCBub24ta2V5cywgYnV0IGFuIHVuZXhwZWN0ZWQgcGFzc1N0eWxlKi9cbi8qIGlzIGFsd2F5cyBhbiBlcnJvci4qL1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3ZhbH1gO1xuIH19XG5cbiB9O1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJpbWl0aXZlS2V5IjpbImlzUHJpbWl0aXZlS2V5Il0sImFzc2VydFByaW1pdGl2ZUtleSI6WyJhc3NlcnRQcmltaXRpdmVLZXkiXSwiY2hlY2tTY2FsYXJLZXkiOlsiY2hlY2tTY2FsYXJLZXkiXSwiaXNTY2FsYXJLZXkiOlsiaXNTY2FsYXJLZXkiXSwiYXNzZXJ0U2NhbGFyS2V5IjpbImFzc2VydFNjYWxhcktleSJdLCJjaGVja0tleSI6WyJjaGVja0tleSJdLCJpc0tleSI6WyJpc0tleSJdLCJhc3NlcnRLZXkiOlsiYXNzZXJ0S2V5Il0sImNoZWNrQ29weVNldCI6WyJjaGVja0NvcHlTZXQiXSwiaXNDb3B5U2V0IjpbImlzQ29weVNldCJdLCJhc3NlcnRDb3B5U2V0IjpbImFzc2VydENvcHlTZXQiXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiXSwiZXZlcnlDb3B5U2V0S2V5IjpbImV2ZXJ5Q29weVNldEtleSJdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCJdLCJjaGVja0NvcHlCYWciOlsiY2hlY2tDb3B5QmFnIl0sImlzQ29weUJhZyI6WyJpc0NvcHlCYWciXSwiYXNzZXJ0Q29weUJhZyI6WyJhc3NlcnRDb3B5QmFnIl0sImdldENvcHlCYWdFbnRyaWVzIjpbImdldENvcHlCYWdFbnRyaWVzIl0sImV2ZXJ5Q29weUJhZ0VudHJ5IjpbImV2ZXJ5Q29weUJhZ0VudHJ5Il0sIm1ha2VDb3B5QmFnIjpbIm1ha2VDb3B5QmFnIl0sIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIjpbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sImNoZWNrQ29weU1hcCI6WyJjaGVja0NvcHlNYXAiXSwiaXNDb3B5TWFwIjpbImlzQ29weU1hcCJdLCJhc3NlcnRDb3B5TWFwIjpbImFzc2VydENvcHlNYXAiXSwiZ2V0Q29weU1hcEtleXMiOlsiZ2V0Q29weU1hcEtleXMiXSwiZ2V0Q29weU1hcFZhbHVlcyI6WyJnZXRDb3B5TWFwVmFsdWVzIl0sImdldENvcHlNYXBFbnRyaWVzIjpbImdldENvcHlNYXBFbnRyaWVzIl0sImV2ZXJ5Q29weU1hcEtleSI6WyJldmVyeUNvcHlNYXBLZXkiXSwiZXZlcnlDb3B5TWFwVmFsdWUiOlsiZXZlcnlDb3B5TWFwVmFsdWUiXSwiY29weU1hcEtleVNldCI6WyJjb3B5TWFwS2V5U2V0Il0sIm1ha2VDb3B5TWFwIjpbIm1ha2VDb3B5TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPfmwlF3GgAAdxoAAC0AAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY29tcGFyZUtleXMuanN7ImltcG9ydHMiOlsiLi9jaGVja0tleS5qcyIsIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4vbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJjb21wYXJlS2V5cyIsImtleUVRIiwia2V5R1QiLCJrZXlHVEUiLCJrZXlMVCIsImtleUxURSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixnZXRUYWcsY29tcGFyZVJhbmsscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLGFzc2VydEtleSxiYWdDb21wYXJlLHNldENvbXBhcmU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXSxbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dLFtcIi4vY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXV1dLFtcIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnQ29tcGFyZVwiLCBbJGjigI1fYSA9PiAoYmFnQ29tcGFyZSA9ICRo4oCNX2EpXV1dXSxbXCIuL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcInNldENvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKHNldENvbXBhcmUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyZX0gKi9cbmNvbnN0ICAgICAgICBjb21wYXJlS2V5cz0obGVmdCxyaWdodCk9PntcbmFzc2VydEtleShsZWZ0KTtcbmFzc2VydEtleShyaWdodCk7XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xuLyogRGlmZmVyZW50IHBhc3NTdHlsZXMgYXJlIGluY29tbWVuc3VyYXRlKi9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzp7XG4vKiBmb3IgdGhlc2UsIGtleXMgY29tcGFyZSB0aGUgc2FtZSBhcyByYW5rKi9cbnJldHVybiBjb21wYXJlUmFuayhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ251bWJlcic6e1xuY29uc3QgcmFua0NvbXA9Y29tcGFyZVJhbmsobGVmdCxyaWdodCk7XG5pZihyYW5rQ29tcD09PTApe1xucmV0dXJuIDA7XG4gfVxuaWYoTnVtYmVyLmlzTmFOKGxlZnQpfHxOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbi8qIE5hTiBpcyBlcXVhbCB0byBpdHNlbGYsIGJ1dCBpbmNvbW1lbnN1cmF0ZSB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSovXG5hc3NlcnQoIU51bWJlci5pc05hTihsZWZ0KXx8IU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIE5hTjtcbiB9XG4vKiBBbW9uZyBub24tTmFOIG51bWJlcnMsIGtleSBvcmRlciBpcyB0aGUgc2FtZSBhcyByYW5rIG9yZGVyLiBOb3RlIHRoYXQqL1xuLyogaW4gYm90aCBvcmRlcnMsIGAtMGAgaXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MgYXMgYDBgLiovXG5yZXR1cm4gcmFua0NvbXA7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmlmKGxlZnQ9PT1yaWdodCl7XG5yZXR1cm4gMDtcbiB9XG4vKiBJZiB0d28gcmVtb3RhYmxlcyBhcmUgbm90IGlkZW50aWNhbCwgdGhlbiBhcyBrZXlzIHRoZXkgYXJlKi9cbi8qIGluY29tbWVuc3VyYXRlLiovXG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGtleSBvcmRlci4gUmFuayBvcmRlciBvZiBhcnJheXMgaXMgbGV4aWNvZ3JhcGhpYyBieSovXG4vKiByYW5rIG9yZGVyLiovXG4vKiBCZWNhdXNlIHRoZSBpbnZhcmlhbnRzIGFib3ZlIGFwcGx5IHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXksKi9cbi8qIHRoZXkgYXBwbHkgdG8gdGhlIGFycmF5IGFzIGEgd2hvbGUuKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyZUtleXMobGVmdFtpXSxyaWdodFtpXSk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbi8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyBhcmUga2V5RVEsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbi8qIFRodXMsIGlmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGlzIHNtYWxsZXIgdGhhbiBZLiovXG5yZXR1cm4gY29tcGFyZVJhbmsobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIFBhcmV0byBwYXJ0aWFsIG9yZGVyIGNvbXBhcmlzb24uKi9cbmNvbnN0IGxlZnROYW1lcz1yZWNvcmROYW1lcyhsZWZ0KTtcbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIWtleUVRKGxlZnROYW1lcyxyaWdodE5hbWVzKSl7XG4vKiBJZiB0aGV5IGRvIG5vdCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydGllcywqL1xuLyogdGhleSBhcmUgaW5jb21tZW5zdXJhdGUuKi9cbi8qIE5vdGUgdGhhdCByYW5rIHNvcnRpbmcgb2YgY29weVJlY29yZHMgZ3JvdXBzIGFsbCBjb3B5UmVjb3JkcyB3aXRoKi9cbi8qIHRoZSBzYW1lIGtleXMgdG9nZXRoZXIsIGVuYWJsaW5nIHJhbmdlIHNlYXJjaGluZyBvdmVyIGNvcHlSZWNvcmRzKi9cbi8qIHRvIGF2b2lkIG1vcmUgaXJyZWxldmFudCBvbmVzLiovXG5yZXR1cm4gTmFOO1xuIH1cbmNvbnN0IGxlZnRWYWx1ZXM9cmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKTtcbmNvbnN0IHJpZ2h0VmFsdWVzPXJlY29yZFZhbHVlcyhyaWdodCxyaWdodE5hbWVzKTtcbi8qIFByZXN1bWUgdGhhdCBib3RoIGNvcHlSZWNvcmRzIGhhdmUgdGhlIHNhbWUga2V5IG9yZGVyKi9cbi8qIHVudGlsIGVuY291bnRlcmluZyBhIHByb3BlcnR5IGRpc3Byb3ZpbmcgdGhhdCBoeXBvdGhlc2lzLiovXG5sZXQgcmVzdWx0PTA7XG5mb3IobGV0IGk9MDtpPGxlZnRWYWx1ZXMubGVuZ3RoO2krPTEpe1xuY29uc3QgY29tcD1jb21wYXJlS2V5cyhsZWZ0VmFsdWVzW2ldLHJpZ2h0VmFsdWVzW2ldKTtcbmlmKE51bWJlci5pc05hTihjb21wKSl7XG5yZXR1cm4gTmFOO1xuIH1cbmlmKHJlc3VsdCE9PWNvbXAmJmNvbXAhPT0wKXtcbmlmKHJlc3VsdD09PTApe1xucmVzdWx0PWNvbXA7XG4gfWVsc2V7XG5hc3NlcnQoXG5yZXN1bHQ9PT0tMSYmY29tcD09PTF8fHJlc3VsdD09PTEmJmNvbXA9PT0tMSk7XG5cbnJldHVybiBOYU47XG4gfVxuIH1cbiB9XG4vKiBJZiBjb3B5UmVjb3JkIFggaXMgc21hbGxlciB0aGFuIGNvcHlSZWNvcmQgWSwgdGhlbiB0aGV5IG11c3QgaGF2ZSB0aGUqL1xuLyogc2FtZSBwcm9wZXJ0eSBuYW1lcyBhbmQgZXZlcnkgdmFsdWUgaW4gWCBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8qL1xuLyogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gWSAod2l0aCBhdCBsZWFzdCBvbmUgdmFsdWUgc21hbGxlcikuKi9cbi8qIFRoZSByYW5rIG9yZGVyIG9mIFggYW5kIFkgaXMgYmFzZWQgb24gbGV4aWNvZ3JhcGhpYyByYW5rIG9yZGVyIG9mKi9cbi8qIHRoZWlyIHZhbHVlcywgYXMgb3JnYW5pemVkIGJ5IHJldmVyc2UgbGV4aWNvZ3JhcGhpYyBvcmRlciBvZiB0aGVpciovXG4vKiBwcm9wZXJ0eSBuYW1lcy4qL1xuLyogVGh1cyBpZiBjb21wYXJlS2V5cyhYLFkpIDwgMCB0aGVuIGNvbXBhcmVSYW5rKFgsWSkgPCAwLiovXG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCBsZWZ0VGFnPWdldFRhZyhsZWZ0KTtcbmNvbnN0IHJpZ2h0VGFnPWdldFRhZyhyaWdodCk7XG5pZihsZWZ0VGFnIT09cmlnaHRUYWcpe1xuLyogZGlmZmVyZW50IHRhZ3MgYXJlIGluY29tbWVuc3VyYXRlKi9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRUYWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG4vKiBjb3B5U2V0IFggaXMgc21hbGxlciB0aGFuIGNvcHlTZXQgWSB3aGVuIGV2ZXJ5IGVsZW1lbnQgb2YgWCovXG4vKiBpcyBrZXlFUSB0byBzb21lIGVsZW1lbnQgb2YgWSBhbmQgc29tZSBlbGVtZW50IG9mIFkgaXMqL1xuLyogbm90IGtleUVRIHRvIGFueSBlbGVtZW50IG9mIFguKi9cbnJldHVybiBzZXRDb21wYXJlKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnY29weUJhZyc6e1xuLyogY29weUJhZyBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5QmFnIFkgd2hlbiBldmVyeSBlbGVtZW50IG9mIFgqL1xuLyogb2NjdXJzIG5vIG1vcmUgdGhhbiB0aGUga2V5RVEgZWxlbWVudCBvZiBZLCBhbmQgc29tZSBlbGVtZW50Ki9cbi8qIG9mIFkgb2NjdXJzIG1vcmUgdGhhbiBzb21lIGVsZW1lbnQgb2YgWCwgd2hlcmUgYmVpbmcgYWJzZW50Ki9cbi8qIGZyb20gWCBjb3VudHMgYXMgb2NjdXJyaW5nIHplcm8gdGltZXMuKi9cbnJldHVybiBiYWdDb21wYXJlKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogVHdvIGNvcHlNYXBzIHRoYXQgaGF2ZSBkaWZmZXJlbnQga2V5cyAoYWNjb3JkaW5nIHRvIGtleUVRKSBhcmUqL1xuLyogaW5jb21tZW5zdXJhdGUuIFRoZSByZXByZXNlbnRhdGlvbiBvZiBjb3B5TWFwcyBpbmNsdWRlcyB0aGUga2V5cyovXG4vKiBmaXJzdCwgaW4gdGhlIHNhbWUgcmV2ZXJzZSByYW5rIG9yZGVyIHVzZWQgYnkgc2V0cy4gVGh1cywgYWxsKi9cbi8qIGNvcHlNYXBzIHdpdGgga2V5cyBvZiB0aGUgc2FtZSByYW5rICh3aGljaCBpcyovXG4vKiBsZXNzIHByZWNpc2UhKSB3aWxsIGJlIGdyb3VwZWQgdG9nZXRoZXIgd2hlbiBjb3B5TWFwcyBhcmUgc29ydGVkKi9cbi8qIGJ5IHJhbmssIG1pbmltaXppbmcgdGhlIG51bWJlciBvZiBtaXNzZXMgd2hlbiByYW5nZSBzZWFyY2hpbmcuKi9cbi8qKi9cbi8qIEFtb25nIGNvcHlNYXBzIHdpdGggdGhlIHNhbWUga2V5cyAoYWNjb3JkaW5nIHRvIGtleUVRKSwgdGhleSovXG4vKiBjb21wYXJlIGJ5IGEgY29ycmVzcG9uZGluZyBjb21wYXJpc29uIG9mIHRoZWlyIHZhbHVlcy4gVGh1cywgYXMqL1xuLyogd2l0aCByZWNvcmRzLCBmb3IgdHdvIGNvcHlNYXBzIFggYW5kIFksIGlmIGBjb21wYXJlS2V5cyhYLFkpIDwqL1xuLyogMGAgdGhlbiwgYmVjYXVzZSB0aGVzZSB2YWx1ZXMgb2JleSB0aGUgYWJvdmUgaW52YXJpYW50cywgbm9uZSBvZiovXG4vKiB0aGUgdmFsdWVzIGluIFggaGF2ZSBhIGxhdGVyIHJhbmsgdGhhbiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSovXG4vKiBvZiBZLiBUaHVzLCBgY29tcGFyZVJhbmsoWCxZKSA8PSAwYC4gVE9ETyBpbXBsZW1lbnQqL1xudGhyb3cgRmFpbCBgTWFwIGNvbXBhcmlzb24gbm90IHlldCBpbXBsZW1lbnRlZDogJHtsZWZ0fSB2cyAke3JpZ2h0fWA7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHRhZyAke3EobGVmdFRhZyl9OiAke2xlZnR9YDtcbiB9fVxuXG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EobGVmdFN0eWxlKX06ICR7bGVmdH1gO1xuIH19XG5cbiB9OyRo4oCNX29uY2UuY29tcGFyZUtleXMoY29tcGFyZUtleXMpO1xuaGFyZGVuKGNvbXBhcmVLZXlzKTtcblxuY29uc3QgICAgICAgIGtleUxUPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk8MDskaOKAjV9vbmNlLmtleUxUKGtleUxUKTtcbmhhcmRlbihrZXlMVCk7XG5cbmNvbnN0ICAgICAgICBrZXlMVEU9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KTw9MDskaOKAjV9vbmNlLmtleUxURShrZXlMVEUpO1xuaGFyZGVuKGtleUxURSk7XG5cbmNvbnN0ICAgICAgICBrZXlFUT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPT09MDskaOKAjV9vbmNlLmtleUVRKGtleUVRKTtcbmhhcmRlbihrZXlFUSk7XG5cbmNvbnN0ICAgICAgICBrZXlHVEU9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT49MDskaOKAjV9vbmNlLmtleUdURShrZXlHVEUpO1xuaGFyZGVuKGtleUdURSk7XG5cbmNvbnN0ICAgICAgICBrZXlHVD0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPjA7JGjigI1fb25jZS5rZXlHVChrZXlHVCk7XG5oYXJkZW4oa2V5R1QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvbXBhcmVLZXlzIjpbImNvbXBhcmVLZXlzIl0sImtleUxUIjpbImtleUxUIl0sImtleUxURSI6WyJrZXlMVEUiXSwia2V5RVEiOlsia2V5RVEiXSwia2V5R1RFIjpbImtleUdURSJdLCJrZXlHVCI6WyJrZXlHVCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABVIML9KhQAACoUAAApAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL2NvcHlCYWcuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFzc2VydEJhZ0VudHJpZXMiLCJhc3NlcnROb0R1cGxpY2F0ZUtleXMiLCJjaGVja0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiLCJtYWtlQmFnT2ZFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChpc1JhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbi8qKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5QmFnPEs+fSBDb3B5QmFnICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5fSBLZXkgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5XG4gKiBrbm93biB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdFxuICogcmF0aGVyIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmVcbiAqIGFycmF5IGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlLWtleXMgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZUtleXM9KGJhZ0VudHJpZXMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuLyogU2luY2UgdGhlIGtleSBpcyBtb3JlIHNpZ25pZmljYW50IHRoYW4gdGhlIHZhbHVlICh0aGUgY291bnQpLCovXG4vKiBzb3J0aW5nIGJ5IGZ1bGxPcmRlciBpcyBndWFyYW50ZWVkIHRvIG1ha2UgZHVwbGljYXRlIGtleXMqL1xuLyogYWRqYWNlbnQgaW5kZXBlbmRlbnQgb2YgdGhlaXIgY291bnRzLiovXG5iYWdFbnRyaWVzPXNvcnRCeVJhbmsoYmFnRW50cmllcyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5mb3IobGV0IGk9MTtpPGxlbmd0aDtpKz0xKXtcbmNvbnN0IGswPWJhZ0VudHJpZXNbaS0xXVswXTtcbmNvbnN0IGsxPWJhZ0VudHJpZXNbaV1bMF07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlIGtleXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBbZnVsbENvbXBhcmVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlS2V5cz0oYmFnRW50cmllcyxmdWxsQ29tcGFyZT11bmRlZmluZWQpPT57XG5jaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKGFzc2VydE5vRHVwbGljYXRlS2V5cyk7XG5jb25zdCAgICAgICAgY2hlY2tCYWdFbnRyaWVzPShiYWdFbnRyaWVzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoYmFnRW50cmllcykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIGEgY29weUFycmF5OiAke2JhZ0VudHJpZXN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rKSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7YmFnRW50cmllc31gKTtcblxuIH1cbmZvcihjb25zdCBlbnRyeSBvZiBiYWdFbnRyaWVzKXtcbmlmKFxucGFzc1N0eWxlT2YoZW50cnkpIT09J2NvcHlBcnJheSd8fFxuZW50cnkubGVuZ3RoIT09Mnx8XG50eXBlb2YgZW50cnlbMV0hPT0nYmlnaW50JylcbntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBiZSBwYWlyIG9mIGEga2V5IGFuZCBhIGJpZ2ludCByZXByZXNlbnRpbmcgYSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbmlmKGVudHJ5WzFdPDEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyx1bmRlZmluZWQsY2hlY2spO1xuIH07JGjigI1fb25jZS5jaGVja0JhZ0VudHJpZXMoY2hlY2tCYWdFbnRyaWVzKTtcbmhhcmRlbihjaGVja0JhZ0VudHJpZXMpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrIC0tIGRvZXNuJ3QgdW5kZXJzdGFuZCBhc3NlcnRzKi9cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiYWdFbnRyaWVzIGlzIFtQYXNzYWJsZSxiaWdpbnRdW119XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRCYWdFbnRyaWVzPShiYWdFbnRyaWVzKT0+e1xuY2hlY2tCYWdFbnRyaWVzKGJhZ0VudHJpZXMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEJhZ0VudHJpZXMoYXNzZXJ0QmFnRW50cmllcyk7XG5oYXJkZW4oYXNzZXJ0QmFnRW50cmllcyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0JhZ0VudHJpZXM9KGJhZ0VudHJpZXNMaXN0KT0+e1xuY29uc3QgYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXNMaXN0LGNvbXBhcmVBbnRpUmFuayk7XG5hc3NlcnRCYWdFbnRyaWVzKGJhZ0VudHJpZXMpO1xucmV0dXJuIGJhZ0VudHJpZXM7XG4gfTskaOKAjV9vbmNlLmNvZXJjZVRvQmFnRW50cmllcyhjb2VyY2VUb0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNvZXJjZVRvQmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUJhZ09mRW50cmllcz0oYmFnRW50cnlJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5QmFnJyxjb2VyY2VUb0JhZ0VudHJpZXMoYmFnRW50cnlJdGVyKSk7JGjigI1fb25jZS5tYWtlQmFnT2ZFbnRyaWVzKG1ha2VCYWdPZkVudHJpZXMpO1xuaGFyZGVuKG1ha2VCYWdPZkVudHJpZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACh3+v6MQAACjEAAAKQAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMva2V5cy9jb3B5U2V0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhc3NlcnRFbGVtZW50cyIsImFzc2VydE5vRHVwbGljYXRlcyIsImNoZWNrRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIiwibWFrZVNldE9mRWxlbWVudHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuazskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuLyoqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkNvcHlTZXQ8Sz59IENvcHlTZXQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXl9IEtleSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBlbGVtZW50c2AgaXMgYWxyZWFkeSBrbm93blxuICogdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXQgcmF0aGVyXG4gKiB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlIGFycmF5XG4gKiBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZSBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlcz0oZWxlbWVudHMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50cyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWVsZW1lbnRzO1xuZm9yKGxldCBpPTE7aTxsZW5ndGg7aSs9MSl7XG5jb25zdCBrMD1lbGVtZW50c1tpLTFdO1xuY29uc3QgazE9ZWxlbWVudHNbaV07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlczogJHtrMH1gKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBbZnVsbENvbXBhcmVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlcz0oZWxlbWVudHMsZnVsbENvbXBhcmU9dW5kZWZpbmVkKT0+e1xuY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsZnVsbENvbXBhcmUsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVzKGFzc2VydE5vRHVwbGljYXRlcyk7XG5jb25zdCAgICAgICAgY2hlY2tFbGVtZW50cz0oZWxlbWVudHMsY2hlY2spPT57XG5pZihwYXNzU3R5bGVPZihlbGVtZW50cykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7ZWxlbWVudHN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuaykpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7ZWxlbWVudHN9YCk7XG5cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsdW5kZWZpbmVkLGNoZWNrKTtcbiB9OyRo4oCNX29uY2UuY2hlY2tFbGVtZW50cyhjaGVja0VsZW1lbnRzKTtcbmhhcmRlbihjaGVja0VsZW1lbnRzKTtcblxuY29uc3QgICAgICAgIGFzc2VydEVsZW1lbnRzPShlbGVtZW50cyk9PntcbmNoZWNrRWxlbWVudHMoZWxlbWVudHMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEVsZW1lbnRzKGFzc2VydEVsZW1lbnRzKTtcbmhhcmRlbihhc3NlcnRFbGVtZW50cyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0VsZW1lbnRzPShlbGVtZW50c0xpc3QpPT57XG5jb25zdCBlbGVtZW50cz1zb3J0QnlSYW5rKGVsZW1lbnRzTGlzdCxjb21wYXJlQW50aVJhbmspO1xuYXNzZXJ0RWxlbWVudHMoZWxlbWVudHMpO1xucmV0dXJuIGVsZW1lbnRzO1xuIH07JGjigI1fb25jZS5jb2VyY2VUb0VsZW1lbnRzKGNvZXJjZVRvRWxlbWVudHMpO1xuaGFyZGVuKGNvZXJjZVRvRWxlbWVudHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0T2ZFbGVtZW50cz0oZWxlbWVudEl0ZXIpPT5cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLGNvZXJjZVRvRWxlbWVudHMoZWxlbWVudEl0ZXIpKTskaOKAjV9vbmNlLm1ha2VTZXRPZkVsZW1lbnRzKG1ha2VTZXRPZkVsZW1lbnRzKTtcbmhhcmRlbihtYWtlU2V0T2ZFbGVtZW50cyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVzIjpbImFzc2VydE5vRHVwbGljYXRlcyJdLCJjaGVja0VsZW1lbnRzIjpbImNoZWNrRWxlbWVudHMiXSwiYXNzZXJ0RWxlbWVudHMiOlsiYXNzZXJ0RWxlbWVudHMiXSwiY29lcmNlVG9FbGVtZW50cyI6WyJjb2VyY2VUb0VsZW1lbnRzIl0sIm1ha2VTZXRPZkVsZW1lbnRzIjpbIm1ha2VTZXRPZkVsZW1lbnRzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAsonm15JQAAeSUAADUAAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyIuL2NvcHlCYWcuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYmFnQ29tcGFyZSIsImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJc0Rpc2pvaW50IiwiYmFnSXNTdXBlcmJhZyIsImJhZ1VuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzLG1ha2VCYWdPZkVudHJpZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlS2V5c1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyaXNvbn0gS2V5Q29tcGFyaXNvbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG5cbi8qIEJhc2VkIG9uIG1lcmdlLXNldC1vcGVyYXRvcnMuanMsIGJ1dCBhbHRlcmVkIGZvciB0aGUgYmFnIHJlcHJlc2VudGF0aW9uLiovXG4vKiBUT0RPIHNoYXJlIG1vcmUgY29kZSB3aXRoIG1lcmdlLXNldC1vcGVyYXRvcnMuanMsIHJhdGhlciB0aGFuKi9cbi8qIGR1cGxpY2F0aW5nIHdpdGggY2hhbmdlcy4qL1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZVxuICogdGhlcmVcbiAqIG1heSBiZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgYmFnRW50cmllcyB3aG9zZSBrZXlzIGFyZSB0aWVkIGZvciB0aGUgc2FtZVxuICogcmFuay5cbiAqIFJldHVybnMgYW4gaXRlcmFibGUgdGhhdCB3aWxsIGVudW1lcmF0ZSBhbGwgdGhlIGJhZ0VudHJpZXMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBiYWdFbnRyaWVzYCBhcnJheVxuICogYWNjb3JkaW5nXG4gKiB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludF0+fVxuICovXG5jb25zdCBiYWdXaW5kb3dSZXNvcnQ9KGJhZ0VudHJpZXMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG5hc3NlcnRSYW5rU29ydGVkKGJhZ0VudHJpZXMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1iYWdFbnRyaWVzO1xubGV0IGk9MDtcbmxldCBvcHRJbm5lckl0ZXJhdG9yO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+XG5oYXJkZW4oe1xubmV4dDooKT0+e1xuaWYob3B0SW5uZXJJdGVyYXRvcil7XG5jb25zdCByZXN1bHQ9b3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG5pZihyZXN1bHQuZG9uZSl7XG5vcHRJbm5lckl0ZXJhdG9yPXVuZGVmaW5lZDtcbi8qIGZhbGwgdGhyb3VnaCovXG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5pZihpPGxlbmd0aCl7XG5jb25zdCBlbnRyeT1iYWdFbnRyaWVzW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoXG5qPGxlbmd0aCYmXG5yYW5rQ29tcGFyZShlbnRyeVswXSxiYWdFbnRyaWVzW2pdWzBdKT09PTApXG57XG5qKz0xO1xuIH1cbmlmKGo9PT1pKzEpe1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTplbnRyeX0pO1xuIH1cbmNvbnN0IHNpbWlsYXJSdW49YmFnRW50cmllcy5zbGljZShpLGopO1xuaT1qO1xuY29uc3QgcmVzb3J0ZWQ9c29ydEJ5UmFuayhzaW1pbGFyUnVuLGZ1bGxDb21wYXJlKTtcbi8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbi8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbi8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbmFzc2VydE5vRHVwbGljYXRlS2V5cyhyZXNvcnRlZCxmdWxsQ29tcGFyZSk7XG4vKiBUaGlzIGlzIHRoZSByYXcgSlMgYXJyYXkgaXRlcmF0b3Igd2hvc2UgYC5uZXh0KClgIG1ldGhvZCovXG4vKiBkb2VzIG5vdCBoYXJkZW4gdGhlIEl0ZXJhdG9yUmVzdWx0LCBpbiB2aW9sYXRpb24gb2Ygb3VyKi9cbi8qIGNvbnZlbnRpb25zLiBGaXhpbmcgdGhpcyBpcyBleHBlbnNpdmUgYW5kIEknbSBjb25maWRlbnQgdGhlKi9cbi8qIHVuZnJvemVuIHZhbHVlIGRvZXMgbm90IGVzY2FwZSB0aGlzIGZpbGUsIHNvIEknbSBsZWF2aW5nIHRoaXMqL1xuLyogYXMgaXMuKi9cbm9wdElubmVySXRlcmF0b3I9cmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOltudWxsLDBuXX0pO1xuIH1cbiB9fSl9KTtcblxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHhiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geWJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59XG4gKi9cbmNvbnN0IG1lcmdlPSh4YmFnRW50cmllcyx5YmFnRW50cmllcyk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPWJhZ1dpbmRvd1Jlc29ydCh4YmFnRW50cmllcyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xuY29uc3QgeXM9YmFnV2luZG93UmVzb3J0KHliYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG4vKiBUaGVzZSBzaXggYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbi8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHg7XG5sZXQgeGM7XG5sZXQgeERvbmU7XG4vKiogQHR5cGUge1R9ICovXG5sZXQgeTtcbmxldCB5YztcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe1xuZG9uZTp4RG9uZSxcbnZhbHVlOlt4LHhjXX09XG54aS5uZXh0KCkpO1xuIH07XG5uZXh0WCgpO1xuXG5jb25zdCB5aT15c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WT0oKT0+e1xuIXlEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7XG5kb25lOnlEb25lLFxudmFsdWU6W3kseWNdfT1cbnlpLm5leHQoKSk7XG4gfTtcbm5leHRZKCk7XG5cbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtib29sZWFufSAqL1xubGV0IGRvbmU9ZmFsc2U7XG4vKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbnZhbHVlPVtudWxsLDBuLDBuXTtcbiB9ZWxzZSBpZih4RG9uZSl7XG4vKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt5LDBuLHljXTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoeURvbmUpe1xuLyogb25seSB4cyBhcmUgbGVmdCovXG52YWx1ZT1beCx4Yywwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuY29uc3QgY29tcD1mdWxsQ29tcGFyZSh4LHkpO1xuaWYoY29tcD09PTApe1xuLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xudmFsdWU9W3gseGMseWNdO1xubmV4dFgoKTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoY29tcDwwKXtcbi8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbnZhbHVlPVt4LHhjLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG4vKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG5jb21wPjB8fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG52YWx1ZT1beSwwbix5Y107XG5uZXh0WSgpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lLHZhbHVlfSk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTtcbmhhcmRlbihtZXJnZSk7XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNTdXBlcnNldCBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc1N1cGVyYmFnPSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPHljKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzRGlzam9pbnQgYXMgd2VsbC4qL1xuLyogVGhlIGNvZGUgaXMgaWRlbnRpY2FsLiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgYmFnSXRlcklzRGlzam9pbnQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVyQ29tcGFyZSBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge0tleUNvbXBhcmlzb259XG4gKi9cbmNvbnN0IGJhZ0l0ZXJDb21wYXJlPSh4eWkpPT57XG5sZXQgbG9uZVk9ZmFsc2U7XG5sZXQgbG9uZVg9ZmFsc2U7XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPHljKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xubG9uZVk9dHJ1ZTtcbiB9XG5pZih4Yz55Yyl7XG4vKiBzb21ldGhpbmcgaW4geCBpcyBub3QgaW4geSwgc28geSBpcyBub3QgYSBzdXBlcmJhZyBvZiB4Ki9cbmxvbmVYPXRydWU7XG4gfVxuaWYobG9uZVgmJmxvbmVZKXtcbnJldHVybiBOYU47XG4gfVxuIH1cbmlmKGxvbmVYKXtcbnJldHVybiAxO1xuIH1lbHNlIGlmKGxvbmVZKXtcbnJldHVybi0xO1xuIH1lbHNle1xuIWxvbmVYJiYhbG9uZVl8fFxuRmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsbG9uZVldKX1gO1xucmV0dXJuIDA7XG4gfVxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50LGJpZ2ludF1bXX0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVyVW5pb249KHh5aSk9Pntcbi8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnJlc3VsdC5wdXNoKFttLHhjK3ljXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVySW50ZXJzZWN0aW9uPSh4eWkpPT57XG4vKiogQHR5cGUge1tULGJpZ2ludF1bXX0gKi9cbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5jb25zdCBtYz14Yzw9eWM/eGM6eWM7XG5yZXN1bHQucHVzaChbbSxtY10pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1tULGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgYmFnSXRlckRpc2pvaW50U3VidHJhY3Q9KHh5aSk9Pntcbi8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmNvbnN0IG1jPXhjLXljO1xubWM+PTBufHxGYWlsIGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbmlmKG1jPj0xbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2goW20sbWNdKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBtZXJnZWlmeT0oYmFnSXRlck9wKT0+KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+XG5iYWdJdGVyT3AobWVyZ2UoeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpKTtcblxuY29uc3QgYmFnRW50cmllc0lzU3VwZXJiYWc9bWVyZ2VpZnkoYmFnSXRlcklzU3VwZXJiYWcpO1xuY29uc3QgYmFnRW50cmllc0lzRGlzam9pbnQ9bWVyZ2VpZnkoYmFnSXRlcklzRGlzam9pbnQpO1xuY29uc3QgYmFnRW50cmllc0NvbXBhcmU9bWVyZ2VpZnkoYmFnSXRlckNvbXBhcmUpO1xuY29uc3QgYmFnRW50cmllc1VuaW9uPW1lcmdlaWZ5KGJhZ0l0ZXJVbmlvbik7XG5jb25zdCBiYWdFbnRyaWVzSW50ZXJzZWN0aW9uPW1lcmdlaWZ5KGJhZ0l0ZXJJbnRlcnNlY3Rpb24pO1xuY29uc3QgYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3Q9bWVyZ2VpZnkoYmFnSXRlckRpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdCYWdpZnk9KGJhZ0VudHJpZXNPcCk9Pih4YmFnLHliYWcpPT5cbmJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKTtcblxuY29uc3QgYmFnaWZ5PShiYWdFbnRyaWVzT3ApPT4oeGJhZyx5YmFnKT0+XG5tYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBiYWdJc1N1cGVyYmFnPXJhd0JhZ2lmeShiYWdFbnRyaWVzSXNTdXBlcmJhZyk7JGjigI1fb25jZS5iYWdJc1N1cGVyYmFnKGJhZ0lzU3VwZXJiYWcpO1xuY29uc3QgICAgICAgIGJhZ0lzRGlzam9pbnQ9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc0Rpc2pvaW50KTskaOKAjV9vbmNlLmJhZ0lzRGlzam9pbnQoYmFnSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgYmFnQ29tcGFyZT1yYXdCYWdpZnkoYmFnRW50cmllc0NvbXBhcmUpOyRo4oCNX29uY2UuYmFnQ29tcGFyZShiYWdDb21wYXJlKTtcbmNvbnN0ICAgICAgICBiYWdVbmlvbj1iYWdpZnkoYmFnRW50cmllc1VuaW9uKTskaOKAjV9vbmNlLmJhZ1VuaW9uKGJhZ1VuaW9uKTtcbmNvbnN0ICAgICAgICBiYWdJbnRlcnNlY3Rpb249YmFnaWZ5KGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2UuYmFnSW50ZXJzZWN0aW9uKGJhZ0ludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgYmFnRGlzam9pbnRTdWJ0cmFjdD1iYWdpZnkoYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2UuYmFnRGlzam9pbnRTdWJ0cmFjdChiYWdEaXNqb2ludFN1YnRyYWN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJiYWdJc1N1cGVyYmFnIjpbImJhZ0lzU3VwZXJiYWciXSwiYmFnSXNEaXNqb2ludCI6WyJiYWdJc0Rpc2pvaW50Il0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSJdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiJdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIl0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAi9nVSnigAAJ4oAAA1AAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiLi9jb3B5U2V0LmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsInNldENvbXBhcmUiLCJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRVbmlvbiIsInNldEludGVyc2VjdGlvbiIsInNldElzRGlzam9pbnQiLCJzZXRJc1N1cGVyc2V0Iiwic2V0VW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxhc3NlcnROb0R1cGxpY2F0ZXMsbWFrZVNldE9mRWxlbWVudHM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlc1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVzID0gJGjigI1fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXlDb21wYXJpc29ufSBLZXlDb21wYXJpc29uICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5SYW5rQ29tcGFyZX0gUmFua0NvbXBhcmUgKi9cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGVsZW1lbnRzIHRpZWQgZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBlbGVtZW50cyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGVsZW1lbnRzYCBhcnJheSBhY2NvcmRpbmdcbiAqICB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3Qgd2luZG93UmVzb3J0PShlbGVtZW50cyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoZWxlbWVudHMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmxldCBpPTA7XG5sZXQgb3B0SW5uZXJJdGVyYXRvcjtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PlxuaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKG9wdElubmVySXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PW9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuaWYocmVzdWx0LmRvbmUpe1xub3B0SW5uZXJJdGVyYXRvcj11bmRlZmluZWQ7XG4vKiBmYWxsIHRocm91Z2gqL1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgdmFsdWU9ZWxlbWVudHNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShqPGxlbmd0aCYmcmFua0NvbXBhcmUodmFsdWUsZWxlbWVudHNbal0pPT09MCl7XG5qKz0xO1xuIH1cbmlmKGo9PT1pKzEpe1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbmNvbnN0IHNpbWlsYXJSdW49ZWxlbWVudHMuc2xpY2UoaSxqKTtcbmk9ajtcbmNvbnN0IHJlc29ydGVkPXNvcnRCeVJhbmsoc2ltaWxhclJ1bixmdWxsQ29tcGFyZSk7XG4vKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4vKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4vKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG5hc3NlcnROb0R1cGxpY2F0ZXMocmVzb3J0ZWQsZnVsbENvbXBhcmUpO1xuLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4vKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4vKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbi8qIGFzIGlzLiovXG5vcHRJbm5lckl0ZXJhdG9yPXJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTpudWxsfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0geGVsZW1lbnRzXG4gKiBAcGFyYW0ge1RbXX0geWVsZW1lbnRzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZT0oeGVsZW1lbnRzLHllbGVtZW50cyk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPXdpbmRvd1Jlc29ydCh4ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHlzPXdpbmRvd1Jlc29ydCh5ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pntcbi8qIFRoZXNlIGZvdXIgYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbi8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHg7XG5sZXQgeERvbmU7XG4vKiogQHR5cGUge1R9ICovXG5sZXQgeTtcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eERvbmUsdmFsdWU6eH09eGkubmV4dCgpKTtcbiB9O1xubmV4dFgoKTtcblxuY29uc3QgeWk9eXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFk9KCk9PntcbiF5RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eURvbmUsdmFsdWU6eX09eWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge2Jvb2xlYW59ICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xudmFsdWU9W251bGwsMG4sMG5dO1xuIH1lbHNlIGlmKHhEb25lKXtcbi8qIG9ubHkgeXMgYXJlIGxlZnQqL1xudmFsdWU9W3ksMG4sMW5dO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG52YWx1ZT1beCwxbiwxbl07XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xudmFsdWU9W3gsMW4sMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbi8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbmNvbXA+MHx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuY29uc3QgaXRlcklzU3VwZXJzZXQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4YyxfeWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge0tleUNvbXBhcmlzb259XG4gKi9cbmNvbnN0IGl0ZXJDb21wYXJlPSh4eWkpPT57XG5sZXQgbG9uZVk9ZmFsc2U7XG5sZXQgbG9uZVg9ZmFsc2U7XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG5sb25lWT10cnVlO1xuIH1cbmlmKHljPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHggaXMgbm90IGluIHksIHNvIHkgaXMgbm90IGEgc3VwZXJzZXQgb2YgeCovXG5sb25lWD10cnVlO1xuIH1cbmlmKGxvbmVYJiZsb25lWSl7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG5pZihsb25lWCl7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihsb25lWSl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbiFsb25lWCYmIWxvbmVZfHxcbkZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLGxvbmVZXSl9YDtcbnJldHVybiAwO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyVW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MG4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MG58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbi8qIGlmIHggYW5kIHkgd2VyZSBib3RoIHJlYWR5LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50IGFuZCovXG4vKiBhYm92ZSBjbGF1c2UgYWxyZWFkeSB0b29rIGNhcmUgb2YgaXQuIE90aGVyd2lzZSBwdXNoIGhlcmUuKi9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFVuaW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xueGM9PT0wbnx8eWM9PT0wbnx8RmFpbCBgU2V0cyBtdXN0IG5vdCBoYXZlIGNvbW1vbiBlbGVtZW50czogJHttfWA7XG5pZih4Yz49MW4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MW58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJJbnRlcnNlY3Rpb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBJZiB0aGV5IGFyZSBib3RoIHByZXNlbnQsIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlckRpc2pvaW50U3VidHJhY3Q9KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG54Yz49MW58fEZhaWwgYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuaWYoeWM9PT0wbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgbWVyZ2VpZnk9KGl0ZXJPcCk9Pih4ZWxlbWVudHMseWVsZW1lbnRzKT0+XG5pdGVyT3AobWVyZ2UoeGVsZW1lbnRzLHllbGVtZW50cykpO1xuXG5jb25zdCAgICAgICAgZWxlbWVudHNJc1N1cGVyc2V0PW1lcmdlaWZ5KGl0ZXJJc1N1cGVyc2V0KTskaOKAjV9vbmNlLmVsZW1lbnRzSXNTdXBlcnNldChlbGVtZW50c0lzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzSXNEaXNqb2ludD1tZXJnZWlmeShpdGVySXNEaXNqb2ludCk7JGjigI1fb25jZS5lbGVtZW50c0lzRGlzam9pbnQoZWxlbWVudHNJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0NvbXBhcmU9bWVyZ2VpZnkoaXRlckNvbXBhcmUpOyRo4oCNX29uY2UuZWxlbWVudHNDb21wYXJlKGVsZW1lbnRzQ29tcGFyZSk7XG5jb25zdCAgICAgICAgZWxlbWVudHNVbmlvbj1tZXJnZWlmeShpdGVyVW5pb24pOyRo4oCNX29uY2UuZWxlbWVudHNVbmlvbihlbGVtZW50c1VuaW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0Rpc2pvaW50VW5pb249bWVyZ2VpZnkoaXRlckRpc2pvaW50VW5pb24pOyRo4oCNX29uY2UuZWxlbWVudHNEaXNqb2ludFVuaW9uKGVsZW1lbnRzRGlzam9pbnRVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNJbnRlcnNlY3Rpb249bWVyZ2VpZnkoaXRlckludGVyc2VjdGlvbik7JGjigI1fb25jZS5lbGVtZW50c0ludGVyc2VjdGlvbihlbGVtZW50c0ludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0PW1lcmdlaWZ5KGl0ZXJEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdTZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5lbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpO1xuXG5jb25zdCBzZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpKTtcblxuY29uc3QgICAgICAgIHNldElzU3VwZXJzZXQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNTdXBlcnNldCk7JGjigI1fb25jZS5zZXRJc1N1cGVyc2V0KHNldElzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIHNldElzRGlzam9pbnQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNEaXNqb2ludCk7JGjigI1fb25jZS5zZXRJc0Rpc2pvaW50KHNldElzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIHNldENvbXBhcmU9cmF3U2V0aWZ5KGVsZW1lbnRzQ29tcGFyZSk7JGjigI1fb25jZS5zZXRDb21wYXJlKHNldENvbXBhcmUpO1xuY29uc3QgICAgICAgIHNldFVuaW9uPXNldGlmeShlbGVtZW50c1VuaW9uKTskaOKAjV9vbmNlLnNldFVuaW9uKHNldFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFVuaW9uPXNldGlmeShlbGVtZW50c0Rpc2pvaW50VW5pb24pOyRo4oCNX29uY2Uuc2V0RGlzam9pbnRVbmlvbihzZXREaXNqb2ludFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXRJbnRlcnNlY3Rpb249c2V0aWZ5KGVsZW1lbnRzSW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLnNldEludGVyc2VjdGlvbihzZXRJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIHNldERpc2pvaW50U3VidHJhY3Q9c2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5zZXREaXNqb2ludFN1YnRyYWN0KHNldERpc2pvaW50U3VidHJhY3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCJdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIl0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiJdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0Il0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCJdLCJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiXSwic2V0VW5pb24iOlsic2V0VW5pb24iXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIl0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIkMOwUzwwAAM8MAADUAAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4va2V5cy9jb21wYXJlS2V5cy5qcyIsIi4uL3V0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIk0iLCJhc3NlcnRQYXR0ZXJuIiwiY2hlY2tNYXRjaGVzIiwiZGVmYXVsdExpbWl0cyIsImdldFJhbmtDb3ZlciIsImlzUGF0dGVybiIsIm1hdGNoZXMiLCJtdXN0TWF0Y2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaGFzT3duUHJvcGVydHlPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsY29tcGFyZVJhbmssZ2V0UGFzc1N0eWxlQ292ZXIsaW50ZXJzZWN0UmFua0NvdmVycyx1bmlvblJhbmtDb3ZlcnMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLGlkZW50Q2hlY2tlcixhcHBseUxhYmVsaW5nRXJyb3IsZnJvbVVuaXF1ZUVudHJpZXMsbGlzdERpZmZlcmVuY2Usa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV0sW1wiZ2V0UGFzc1N0eWxlQ292ZXJcIiwgWyRo4oCNX2EgPT4gKGdldFBhc3NTdHlsZUNvdmVyID0gJGjigI1fYSldXSxbXCJpbnRlcnNlY3RSYW5rQ292ZXJzXCIsIFskaOKAjV9hID0+IChpbnRlcnNlY3RSYW5rQ292ZXJzID0gJGjigI1fYSldXSxbXCJ1bmlvblJhbmtDb3ZlcnNcIiwgWyRo4oCNX2EgPT4gKHVuaW9uUmFua0NvdmVycyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXSxbXCIuLi91dGlscy5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChpZGVudENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImFwcGx5TGFiZWxpbmdFcnJvclwiLCBbJGjigI1fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjigI1fYSldXSxbXCJmcm9tVW5pcXVlRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaOKAjV9hKV1dLFtcImxpc3REaWZmZXJlbmNlXCIsIFskaOKAjV9hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dLFtcImtleUdUXCIsIFskaOKAjV9hID0+IChrZXlHVCA9ICRo4oCNX2EpXV0sW1wia2V5R1RFXCIsIFskaOKAjV9hID0+IChrZXlHVEUgPSAkaOKAjV9hKV1dLFtcImtleUxUXCIsIFskaOKAjV9hID0+IChrZXlMVCA9ICRo4oCNX2EpXV0sW1wia2V5TFRFXCIsIFskaOKAjV9hID0+IChrZXlMVEUgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrS2V5XCIsIFskaOKAjV9hID0+IChjaGVja0tleSA9ICRo4oCNX2EpXV0sW1wiaXNLZXlcIiwgWyRo4oCNX2EgPT4gKGlzS2V5ID0gJGjigI1fYSldXSxbXCJjaGVja1NjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoY2hlY2tTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weVNldFwiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRo4oCNX2EpXV0sW1wiY29weU1hcEtleVNldFwiLCBbJGjigI1fYSA9PiAoY29weU1hcEtleVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlCYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e3F1b3RlOnEsZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcbmNvbnN0e2VudHJpZXMsdmFsdWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8UGF0dGVybj59ICovXG5jb25zdCBwYXR0ZXJuTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogRm9yIGZvcndhcmQgcmVmZXJlbmNlcyB0byBgTWAgKi9cbmxldCBNTTtcblxuLyoqXG4gKiBUaGUgYWN0dWFsIGRlZmF1bHQgdmFsdWVzIGhlcmUgYXJlLCBhdCB0aGUgcHJlc2VudCB0aW1lLCBmYWlybHlcbiAqIGFyYml0cmFyeSBjaG9pY2VzIGFuZCBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IHNldHRsZSBkb3duLiBPZiBjb3Vyc2VcbiAqIGF0IHNvbWUgcG9pbnQgd2UnbGwgbmVlZCB0byBzdG9wIGNoYW5naW5nIHRoZW0uIEJ1dCB3ZSBzaG91bGQgZmlyc3RcbiAqIHNlZSBob3cgb3VyIHN5c3RlbSBob2xkcyB1cCB3aXRoIHRoZXNlIGNob2ljZXMuIFRoZSBtYWluIGNyaXRlcmlhXG4gKiBpcyB0aGF0IHRoZXkgYmUgYmlnIGVub3VnaCB0aGF0IFwibm9ybWFsXCIgaW5ub2NlbnQgcHJvZ3JhbXMgcmFyZWx5XG4gKiBlbmNvdW50ZXIgdGhlc2UgbGltaXRzLlxuICpcbiAqIEV4cG9ydGVkIHByaW1hcmlseSBmb3IgdGVzdGluZy5cbiAqL1xuY29uc3QgICAgICAgIGRlZmF1bHRMaW1pdHM9aGFyZGVuKHtcbmRlY2ltYWxEaWdpdHNMaW1pdDoxMDAsXG5zdHJpbmdMZW5ndGhMaW1pdDoxMDBfMDAwLFxuc3ltYm9sTmFtZUxlbmd0aExpbWl0OjEwMCxcbm51bVByb3BlcnRpZXNMaW1pdDo4MCxcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0OjEwMCxcbmFycmF5TGVuZ3RoTGltaXQ6MTBfMDAwLFxubnVtU2V0RWxlbWVudHNMaW1pdDoxMF8wMDAsXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bU1hcEVudHJpZXNMaW1pdDo1MDAwfSk7XG5cblxuLyoqXG4gKiBVc2UgdGhlIHJlc3VsdCBvbmx5IHRvIGdldCB0aGUgbGltaXRzIHlvdSBuZWVkIGJ5IGRlc3RydWN0dXJpbmcuXG4gKiBUaHVzLCB0aGUgcmVzdWx0IG9ubHkgbmVlZHMgdG8gc3VwcG9ydCBkZXN0cnVjdHVyaW5nLiBUaGUgY3VycmVudFxuICogaW1wbGVtZW50YXRpb24gdXNlcyBpbmhlcml0YW5jZSBhcyBhIGNoZWFwIGhhY2suXG4gKlxuICogQHBhcmFtIHtMaW1pdHN9IFtsaW1pdHNdXG4gKiBAcmV0dXJucyB7QWxsTGltaXRzfVxuICovJGjigI1fb25jZS5kZWZhdWx0TGltaXRzKGRlZmF1bHRMaW1pdHMpO1xuY29uc3QgbGltaXQ9KGxpbWl0cz17fSk9PlxuLyoqIEB0eXBlIHtBbGxMaW1pdHN9ICovaGFyZGVuKHtfX3Byb3RvX186ZGVmYXVsdExpbWl0cywuLi5saW1pdHN9KTtcblxuY29uc3QgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQ9KFxucGF5bG9hZCxcbm1haW5QYXlsb2FkU2hhcGUsXG5jaGVjayxcbmxhYmVsKT0+XG57XG5hc3NlcnQoQXJyYXkuaXNBcnJheShtYWluUGF5bG9hZFNoYXBlKSk7XG5pZighQXJyYXkuaXNBcnJheShwYXlsb2FkKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtxKGxhYmVsKX0gcGF5bG9hZCBtdXN0IGJlIGFuIGFycmF5OiAke3BheWxvYWR9YCk7XG4gfVxuXG4vKiBXYXMgdGhlIGZvbGxvd2luZywgYnV0IGl0cyBvdmVydXNlIG9mIHBhdHRlcm5zIGNhdXNlZCBhbiBpbmZpbml0ZSByZWdyZXNzKi9cbi8qIGNvbnN0IHBheWxvYWRMaW1pdFNoYXBlID0gaGFyZGVuKCovXG4vKiBNLnNwbGl0KCovXG4vKiBtYWluUGF5bG9hZFNoYXBlLCovXG4vKiBNLnBhcnRpYWwoaGFyZGVuKFtNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0ubnVtYmVyKCkpXSksIGhhcmRlbihbXSkpLCovXG4vKiApLCovXG4vKiApOyovXG4vKiByZXR1cm4gY2hlY2tNYXRjaGVzKHBheWxvYWQsIHBheWxvYWRMaW1pdFNoYXBlLCBjaGVjaywgbGFiZWwpOyovXG5cbmNvbnN0IG1haW5MZW5ndGg9bWFpblBheWxvYWRTaGFwZS5sZW5ndGg7XG5pZighKHBheWxvYWQubGVuZ3RoPT09bWFpbkxlbmd0aHx8cGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RoKzEpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuIH1cbmNvbnN0IGxpbWl0cz1wYXlsb2FkW21haW5MZW5ndGhdO1xucGF5bG9hZD1oYXJkZW4ocGF5bG9hZC5zbGljZSgwLG1haW5MZW5ndGgpKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighY2hlY2tNYXRjaGVzKHBheWxvYWQsbWFpblBheWxvYWRTaGFwZSxjaGVjayxsYWJlbCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmlmKGxpbWl0cz09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YobGltaXRzKT09PSdjb3B5UmVjb3JkJ3x8XG5jaGVjayhmYWxzZSxYIGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpJiZcbmVudHJpZXMobGltaXRzKS5ldmVyeShcbihba2V5LHZhbHVlXSk9PlxucGFzc1N0eWxlT2YodmFsdWUpPT09J251bWJlcid8fFxuY2hlY2soZmFsc2UsWCBgVmFsdWUgb2YgbGltaXQgJHtxKGtleSl9IGJ1dCBiZSBhIG51bWJlcjogJHtxKHZhbHVlKX1gKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWNpbWFsRGlnaXRzTGltaXRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY29uc3QgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQ9KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjayk9PntcbmlmKFxuTWF0aC5mbG9vcihNYXRoLmxvZzEwKE1hdGguYWJzKE51bWJlcihzcGVjaW1lbikpKSkrMTw9XG5kZWNpbWFsRGlnaXRzTGltaXQpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGJpZ2ludCAke3NwZWNpbWVufSBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke2RlY2ltYWxEaWdpdHNMaW1pdH0gZGlnaXRzYCk7XG5cbiB9O1xuXG4vKipcbiAqIEByZXR1cm5zIHtQYXR0ZXJuS2l0fVxuICovXG5jb25zdCBtYWtlUGF0dGVybktpdD0oKT0+e1xuLyoqXG4gKiBJZiB0aGlzIGlzIGEgcmVjb2duaXplZCBtYXRjaCB0YWcsIHJldHVybiB0aGUgTWF0Y2hIZWxwZXIuXG4gKiBPdGhlcndpc2UgcmVzdWx0IHVuZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7TWF0Y2hIZWxwZXIgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1heWJlTWF0Y2hIZWxwZXI9KHRhZyk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkhlbHBlcnNCeU1hdGNoVGFnW3RhZ107XG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gS2luZFxuICogSXQgaXMgZWl0aGVyIGEgUGFzc1N0eWxlIG90aGVyIHRoYW4gJ3RhZ2dlZCcsIG9yLCBpZiB0aGUgdW5kZXJseWluZ1xuICogUGFzc1N0eWxlIGlzICd0YWdnZWQnLCB0aGVuIHRoZSBgZ2V0VGFnYCB2YWx1ZSBmb3IgdGFncyB0aGF0IGFyZVxuICogcmVjb2duaXplZCBhdCB0aGUgc3RvcmUgbGV2ZWwgb2YgYWJzdHJhY3Rpb24uIEZvciBlYWNoIG9mIHRob3NlXG4gKiB0YWdzLCBhIHRhZ2dlZCByZWNvcmQgb25seSBoYXMgdGhhdCBraW5kIGlmIGl0IHNhdGlzZmllcyB0aGUgaW52YXJpYW50c1xuICogdGhhdCB0aGUgc3RvcmUgbGV2ZWwgYXNzb2NpYXRlcyB3aXRoIHRoYXQga2luZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPENvcHlUYWdnZWQsIEtpbmQ+fVxuICogT25seSBmb3IgdGFnZ2VkIHJlY29yZHMgb2YgcmVjb2duaXplZCBraW5kcyB3aG9zZSBzdG9yZS1sZXZlbCBpbnZhcmlhbnRzXG4gKiBoYXZlIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICovXG5jb25zdCB0YWdNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCB0YWdzLCBhbmQgb25seSBpZiB0aGUgdGFnZ2VkXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdGFnZ2VkXG4gKiBAcGFyYW0ge0tpbmR9IHRhZ1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnZ2VkPSh0YWdnZWQsdGFnLGNoZWNrKT0+e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIpe1xuLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbi8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQodGFnZ2VkLnBheWxvYWQsY2hlY2spO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4gY2hlY2tDb3B5TWFwKHRhZ2dlZCxjaGVjayk7XG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfTogJHt0YWdnZWR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIG9ubHkgYSByZWNvZ25pemVkIGtpbmQsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lbiBwYXNzZXMgdGhlXG4gKiBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICogT3RoZXJ3aXNlLCBgY2hlY2soZmFsc2UsIC4uLilgIGFuZCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtLaW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBraW5kT2Y9KHNwZWNpbWVuLGNoZWNrPWlkZW50Q2hlY2tlcik9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihwYXNzU3R5bGUhPT0ndGFnZ2VkJyl7XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH1cbi8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHNwZWNpbWVuIGlzIGEgd2VsbCBmb3JtZWQqL1xuLyogYXMgYSB0YWdnZWQgcmVjb3JkLCB3aGljaCBpcyBkZWZpbmVkIGF0IHRoZSBtYXJzaGFsIGxldmVsIG9mIGFic3RyYWN0aW9uLCovXG4vKiBzaW5jZSBgcGFzc1N0eWxlT2ZgIGNoZWNrcyB0aG9zZSBpbnZhcmlhbnRzLiovXG5pZih0YWdNZW1vLmhhcyhzcGVjaW1lbikpe1xucmV0dXJuIHRhZ01lbW8uZ2V0KHNwZWNpbWVuKTtcbiB9XG5jb25zdCB0YWc9Z2V0VGFnKHNwZWNpbWVuKTtcbmlmKGNoZWNrVGFnZ2VkKHNwZWNpbWVuLHRhZyxjaGVjaykpe1xudGFnTWVtby5zZXQoc3BlY2ltZW4sdGFnKTtcbnJldHVybiB0YWc7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuY2hlY2soZmFsc2UsWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9YCk7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuaGFyZGVuKGtpbmRPZik7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2luZH0ga2luZFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2luZD0oc3BlY2ltZW4sa2luZCxjaGVjayk9PntcbmNvbnN0IHJlYWxLaW5kPWtpbmRPZihzcGVjaW1lbixjaGVjayk7XG5pZihraW5kPT09cmVhbEtpbmQpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuLyogcXVvdGluZyB3aXRob3V0IHF1b3RlcyovXG5jb25zdCBkZXRhaWxzPVgoWyBgJHtyZWFsS2luZH0gYCxgIC0gTXVzdCBiZSBhICR7a2luZH1gXSxzcGVjaW1lbik7XG5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLZXl9IGtleUFzUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrQXNLZXlQYXR0PShzcGVjaW1lbixrZXlBc1BhdHRlcm4sY2hlY2spPT57XG5pZihrZXlFUShzcGVjaW1lbixrZXlBc1BhdHRlcm4pKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZTogJHtrZXlBc1BhdHRlcm59YCkpO1xuXG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtDaGVja1BhdHRlcm59ICovXG5jb25zdCBjaGVja1BhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vKiBBbGwga2V5cyBhcmUgcGF0dGVybnMuIEZvciB0aGVzZSwgdGhlIGtleU1lbW8gd2lsbCBkby4qL1xuLyogQWxsIHByaW1pdGl2ZXMgdGhhdCBhcmUgcGF0dGVybnMgYXJlIGFsc28ga2V5cywgd2hpY2ggdGhpcyovXG4vKiBhbHNvIHRha2VzIGNhcmUgb2Ygd2l0aG91dCBtZW1vLiBUaGUgcmVzdCBvZiBvdXIgY2hlY2tpbmcgbG9naWMqL1xuLyogaXMgb25seSBjb25jZXJuZWQgd2l0aCBub24ta2V5IHBhdHRlcm5zLiovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihwYXR0ZXJuTWVtby5oYXMocGF0dCkpe1xucmV0dXJuIHRydWU7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHJlc3VsdD1jaGVja1BhdHRlcm5JbnRlcm5hbChwYXR0LGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5wYXR0ZXJuTWVtby5hZGQocGF0dCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHQgLSBrbm93biBub3QgdG8gYmUgYSBrZXksIGFuZCB0aGVyZWZvcmUga25vd25cbiAqIG5vdCB0byBiZSBwcmltaXRpdmUuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQYXR0ZXJuSW50ZXJuYWw9KHBhdHQsY2hlY2spPT57XG4vKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4vKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4vKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbmNvbnN0IGNoZWNrSXQ9KGNoaWxkKT0+Y2hlY2tQYXR0ZXJuKGNoaWxkLGNoZWNrKTtcblxuY29uc3Qga2luZD1raW5kT2YocGF0dCxjaGVjayk7XG5zd2l0Y2goa2luZCl7XG5jYXNlIHVuZGVmaW5lZDp7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBBIGNvcHlSZWNvcmQgaXMgYSBwYXR0ZXJuIGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSovXG4vKiBwYXR0ZXJucyovXG5yZXR1cm4gdmFsdWVzKHBhdHQpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiBwYXR0LmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUga2V5cyBhbmQgdGhlcmVmb3JlIGFscmVhZHkga25vd24gdG8gYmUqL1xuLyogcGF0dGVybnMuKi9cbi8qIEEgY29weU1hcCBpcyBhIHBhdHRlcm4gaWYgaXRzIHZhbHVlcyBhcmUgcGF0dGVybnMuKi9cbnJldHVybiBjaGVja1BhdHRlcm4ocGF0dC52YWx1ZXMsY2hlY2spO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiB9XG5kZWZhdWx0OntcbmlmKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkhPT11bmRlZmluZWQpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBIHBhc3NhYmxlIG9mIGtpbmQgJHtxKGtpbmQpfSBpcyBub3QgYSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNQYXR0ZXJuPShwYXR0KT0+Y2hlY2tQYXR0ZXJuKHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuY29uc3QgYXNzZXJ0UGF0dGVybj0ocGF0dCk9PntcbmNoZWNrUGF0dGVybihwYXR0LGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1hdGNoZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzPShzcGVjaW1lbixwYXR0ZXJuLGNoZWNrLGxhYmVsPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCxbc3BlY2ltZW4scGF0dGVybixjaGVja10sbGFiZWwpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbD0oc3BlY2ltZW4scGF0dCxjaGVjayk9Pntcbi8qIFdvcnRoIGJlaW5nIGEgYml0IHZlcmJvc2UgYW5kIHJlcGV0aXRpdmUgaW4gb3JkZXIgdG8gb3B0aW1pemUqL1xuY29uc3QgcGF0dGVybktpbmQ9a2luZE9mKHBhdHQsY2hlY2spO1xuY29uc3Qgc3BlY2ltZW5LaW5kPWtpbmRPZihzcGVjaW1lbik7LyogbWF5IGJlIHVuZGVmaW5lZCovXG5zd2l0Y2gocGF0dGVybktpbmQpe1xuY2FzZSB1bmRlZmluZWQ6e1xucmV0dXJuIEZhaWwgYHBhdHRlcm4gZXhwZWN0ZWQ6ICR7cGF0dH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEZhaWwgYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIEZhaWwgYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weUJhZyc6XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogVGhlc2Uga2luZHMgYXJlIG5lY2Vzc2FyaWx5IGtleXMqL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG5jb25zdHtsZW5ndGh9PXBhdHQ7XG5pZihzcGVjaW1lbi5sZW5ndGghPT1sZW5ndGgpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSAke3NwZWNpbWVufSAtIE11c3QgYmUgYXMgbG9uZyBhcyBjb3B5QXJyYXkgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxucmV0dXJuIHBhdHQuZXZlcnkoKHAsaSk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbltpXSxwLGNoZWNrLGkpKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlSZWNvcmQgdG8gbWF0Y2ggYSBjb3B5UmVjb3JkIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbi8qIFRPRE8gRGV0ZWN0IGFuZCBhY2N1bXVsYXRlIGRpZmZlcmVuY2UgaW4gb25lIHBhc3MuKi9cbi8qIFJhdGhlciB0aGFuIHVzaW5nIHR3byBjYWxscyB0byBgbGlzdERpZmZlcmVuY2VgIHRvIGRldGVjdCBhbmQqL1xuLyogcmVwb3J0IGlmIGFuZCBob3cgdGhlc2UgbGlzdHMgZGlmZmVyLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5Ki9cbi8qIGluIHNvcnRlZCBvcmRlciwgd2Ugc2hvdWxkIGluc3RlYWQgdXNlIGFuIGFsZ29yaXRobSBsaWtlKi9cbi8qIGBpdGVyRGlzam9pbnRVbmlvbmAgZnJvbSBtZXJnZS1zb3J0LW9wZXJhdG9ycy5qcyovXG5jb25zdCBzcGVjaW1lbk5hbWVzPXJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbmNvbnN0IHBhdHROYW1lcz1yZWNvcmROYW1lcyhwYXR0KTtcbmNvbnN0IG1pc3Npbmc9bGlzdERpZmZlcmVuY2UocGF0dE5hbWVzLHNwZWNpbWVuTmFtZXMpO1xuaWYobWlzc2luZy5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWApO1xuXG4gfVxuY29uc3QgdW5leHBlY3RlZD1saXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLHBhdHROYW1lcyk7XG5pZih1bmV4cGVjdGVkLmxlbmd0aD49MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBub3QgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShcbnVuZXhwZWN0ZWQpXG4gfWApO1xuXG4gfVxuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9cmVjb3JkVmFsdWVzKHNwZWNpbWVuLHNwZWNpbWVuTmFtZXMpO1xuY29uc3QgcGF0dFZhbHVlcz1yZWNvcmRWYWx1ZXMocGF0dCxwYXR0TmFtZXMpO1xucmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsaSk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLHBhdHRWYWx1ZXNbaV0sY2hlY2ssbGFiZWwpKTtcblxuIH1cbmNhc2UnY29weU1hcCc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlNYXAnKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuY29uc3R7cGF5bG9hZDpwYXR0UGF5bG9hZH09cGF0dDtcbmNvbnN0e3BheWxvYWQ6c3BlY2ltZW5QYXlsb2FkfT1zcGVjaW1lbjtcbmNvbnN0IHBhdHRLZXlTZXQ9Y29weU1hcEtleVNldChwYXR0UGF5bG9hZCk7XG5jb25zdCBzcGVjaW1lbktleVNldD1jb3B5TWFwS2V5U2V0KHNwZWNpbWVuUGF5bG9hZCk7XG4vKiBDb21wYXJlIGtleXMgYXMgY29weVNldHMqL1xuaWYoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCxwYXR0S2V5U2V0LGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcGF0dFZhbHVlcz1wYXR0UGF5bG9hZC52YWx1ZXM7XG5jb25zdCBzcGVjaW1lblZhbHVlcz1zcGVjaW1lblBheWxvYWQudmFsdWVzO1xuLyogY29tcGFyZSB2YWx1ZXMgYXMgY29weUFycmF5cyovXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzLHBhdHRWYWx1ZXMsY2hlY2spO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG5pZihtYXRjaEhlbHBlcil7XG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQucGF5bG9hZCxjaGVjayk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgbWF0Y2hlcz0oc3BlY2ltZW4scGF0dCk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgbm9ybWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MuIE1hdGNoIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5XG4gKiB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqL1xuY29uc3QgbXVzdE1hdGNoPShzcGVjaW1lbixwYXR0LGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcixsYWJlbCkpe1xucmV0dXJuO1xuIH1cbi8qIHNob3VsZCBvbmx5IHRocm93Ki9cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGFzc2VydENoZWNrZXIsbGFiZWwpO1xuRmFpbCBgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxKHBhdHQpfWA7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZ2V0UmFua0NvdmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtHZXRSYW5rQ292ZXJ9ICovXG5jb25zdCBnZXRSYW5rQ292ZXI9KHBhdHQsZW5jb2RlUGFzc2FibGUpPT57XG5pZihpc0tleShwYXR0KSl7XG5jb25zdCBlbmNvZGVkPWVuY29kZVBhc3NhYmxlKHBhdHQpO1xuaWYoZW5jb2RlZCE9PXVuZGVmaW5lZCl7XG5yZXR1cm5bZW5jb2RlZCwgYCR7ZW5jb2RlZH1+YF07XG4gfVxuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5QXJyYXknOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weUFycmF5cy4qL1xuLyoqL1xuLyogY29uc3QgcmFua0NvdmVycyA9IHBhdHQubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiByYW5rQ292ZXJzLm1hcCgoW2xlZnQsIF9yaWdodF0pID0+IGxlZnQpLCovXG4vKiByYW5rQ292ZXJzLm1hcCgoW19sZWZ0LCByaWdodF0pID0+IHJpZ2h0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5UmVjb3Jkcy4qL1xuLyoqL1xuLyogY29uc3QgcGF0dEtleXMgPSBvd25LZXlzKHBhdHQpOyovXG4vKiBjb25zdCBwYXR0RW50cmllcyA9IGhhcmRlbihwYXR0S2V5cy5tYXAoa2V5ID0+IFtrZXksIHBhdHRba2V5XV0pKTsqL1xuLyogY29uc3QgW2xlZnRFbnRyaWVzTGltaXQsIHJpZ2h0RW50cmllc0xpbWl0XSA9Ki9cbi8qIGdldFJhbmtDb3ZlcihwYXR0RW50cmllcyk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBmcm9tVW5pcXVlRW50cmllcyhsZWZ0RW50cmllc0xpbWl0KSwqL1xuLyogZnJvbVVuaXF1ZUVudHJpZXMocmlnaHRFbnRyaWVzTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcocGF0dCk7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5U2V0cy4qL1xuLyoqL1xuLyogLy8gU2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkIGJ5IGNoZWNrUGF0dGVybi4gQnV0IGJlY2F1c2UgdGhpcyovXG4vKiAvLyBpcyBhIGNoZWNrIHRoYXQgbWF5IGxvb3NlbiBvdmVyIHRpbWUsIHdlIGFsc28gYXNzZXJ0Ki9cbi8qIC8vIGV2ZXJ5d2hlcmUgd2Ugc3RpbGwgcmVseSBvbiB0aGUgcmVzdHJpY3Rpb24uKi9cbi8qIGBgYGpzKi9cbi8qIHBhdHQucGF5bG9hZC5sZW5ndGggPT09IDEgfHwqL1xuLyogRmFpbGBOb24tc2luZ2xldG9uIGNvcHlTZXRzIHdpdGggbWF0Y2hlciBub3QgeWV0IGltcGxlbWVudGVkOiAke3BhdHR9YDsqL1xuLyogYGBgKi9cbi8qKi9cbi8qIGNvbnN0IFtsZWZ0RWxlbWVudExpbWl0LCByaWdodEVsZW1lbnRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZFswXSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIG1ha2VDb3B5U2V0KFtsZWZ0RWxlbWVudExpbWl0XSksKi9cbi8qIG1ha2VDb3B5U2V0KFtyaWdodEVsZW1lbnRMaW1pdF0pLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlNYXBzLiovXG4vKiovXG4vKiAvLyBBIG1hdGNoaW5nIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMsIG9yIGF0IG1vc3Qgb25lKi9cbi8qIC8vIG5vbi1rZXkga2V5IHBhdHRlcm4uIFRodXMgd2UgY2FuIGFzc3VtZSB0aGF0IHZhbHVlIHBvc2l0aW9ucyovXG4vKiAvLyBtYXRjaCAxLXRvLTEuKi9cbi8qIC8vKi9cbi8qIC8vIFRPRE8gSSBtYXkgYmUgb3Zlcmxvb2tpbmcgdGhhdCB0aGUgbGVzcyBwcmVjaXNlIHJhbmtPcmRlciovXG4vKiAvLyBlcXVpdmFsZW5jZSBjbGFzcyBtYXkgY2F1c2UgdmFsdWVzIHRvIGJlIG91dCBvZiBvcmRlciwqL1xuLyogLy8gbWFraW5nIHRoaXMgcmFua0NvdmVyIG5vdCBhY3R1YWxseSBjb3Zlci4gSW4gdGhhdCBjYXNlLCBmb3IqL1xuLyogLy8gYWxsIHRoZSB2YWx1ZXMgZm9yIGtleXMgYXQgdGhlIHNhbWUgcmFuaywgd2Ugc2hvdWxkIHVuaW9uIHRoZWlyKi9cbi8qIC8vIHJhbmsgY292ZXJzLiBUT0RPIFBPU1NJQkxFIFNJTEVOVCBDT1JSRUNUTkVTUyBCVUcqL1xuLyogLy8qL1xuLyogLy8gSWYgdGhpcyBpcyBhIGJ1ZywgaXQgcHJvYmFibHkgYWZmZWN0cyB0aGUgZ2V0UmFua0NvdmVyKi9cbi8qIC8vIGNhc2VzIG9mIG1hdGNoTFRFSGVscGVyIGFuZCBtYXRjaEdURUhlbHBlciBvbiBjb3B5TWFwIGFzKi9cbi8qIC8vIHdlbGwuIFNlZSBtYWtlQ29weU1hcCBmb3IgYW4gaWRlYSBvbiBmaXhpbmcqL1xuLyogLy8gdGhpcyBidWcuKi9cbi8qIGNvbnN0IFtsZWZ0UGF5bG9hZExpbWl0LCByaWdodFBheWxvYWRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZCwqL1xuLyogZW5jb2RlUGFzc2FibGUsKi9cbi8qICk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgbGVmdFBheWxvYWRMaW1pdCksKi9cbi8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCByaWdodFBheWxvYWRMaW1pdCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9fVxuXG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfVxuZGVmYXVsdDp7XG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gfTtcblxuY29uc3QgYXJyYXlFdmVyeU1hdGNoUGF0dGVybj0oYXJyYXkscGF0dCxjaGVjayxsYWJlbFByZWZpeD0nJyk9PntcbmlmKGNoZWNrS2luZChwYXR0LCdtYXRjaDphbnknLGlkZW50Q2hlY2tlcikpe1xuLyogaWYgdGhlIHBhdHRlcm4gaXMgTS5hbnkoKSwgd2Uga25vdyBpdHMgdHJ1ZSovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gYXJyYXkuZXZlcnkoKGVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhlbCxwYXR0LGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbnlIZWxwZXI9RmFyKCdtYXRjaDphbnkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KF9zcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KG1hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5tYXRjaGVyUGF5bG9hZD09PXVuZGVmaW5lZHx8XG5jaGVjayhmYWxzZSxYIGBtYXRjaDphbnkgcGF5bG9hZDogJHttYXRjaGVyUGF5bG9hZH0gLSBNdXN0IGJlIHVuZGVmaW5lZGApLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbmRIZWxwZXI9RmFyKCdtYXRjaDphbmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHRzLGNoZWNrKT0+e1xucmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KT0+Y2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsY2hlY2spKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZFBhdHRzLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0ocGF0dCk9PmNoZWNrUGF0dGVybihwYXR0LGNoZWNrKTtcbnJldHVybihcbihwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgTmVlZHMgYXJyYXkgb2Ygc3ViLXBhdHRlcm5zOiAke2FsbGVnZWRQYXR0c31gKSkmJlxuYWxsZWdlZFBhdHRzLmV2ZXJ5KGNoZWNrSXQpKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjoocGF0dHMsZW5jb2RlUGFzc2FibGUpPT5cbmludGVyc2VjdFJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpfSk7XG5cblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hPckhlbHBlcj1GYXIoJ21hdGNoOm9yIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbmNvbnN0e2xlbmd0aH09cGF0dHM7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBubyBwYXR0ZXJuIGRpc2p1bmN0cyB0byBtYXRjaDogJHtwYXR0c31gKTtcblxuIH1cbmlmKFxucGF0dHMubGVuZ3RoPT09MiYmXG4hbWF0Y2hlcyhzcGVjaW1lbixwYXR0c1swXSkmJlxuY2hlY2tLaW5kKHBhdHRzWzBdLCdtYXRjaDpraW5kJyxpZGVudENoZWNrZXIpJiZcbnBhdHRzWzBdLnBheWxvYWQ9PT0ndW5kZWZpbmVkJylcbntcbi8qIFdvcnRoIHNwZWNpYWwgY2FzaW5nIHRoZSBvcHRpb25hbCBwYXR0ZXJuIGZvciovXG4vKiBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuKi9cbnJldHVybiBjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dHNbMV0sY2hlY2spO1xuIH1cbmlmKHBhdHRzLnNvbWUoKHBhdHQpPT5tYXRjaGVzKHNwZWNpbWVuLHBhdHQpKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3BhdHRzfWApO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW5kSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG51bmlvblJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpfSk7XG5cblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOb3RIZWxwZXI9RmFyKCdtYXRjaDpub3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG5pZihtYXRjaGVzKHNwZWNpbWVuLHBhdHQpKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9ZWxzZXtcbnJldHVybiB0cnVlO1xuIH1cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja1BhdHRlcm4sXG5cbmdldFJhbmtDb3ZlcjooX3BhdHQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXI9RmFyKCdtYXRjaDpzY2FsYXIgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tTY2FsYXJLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLZXlIZWxwZXI9RmFyKCdtYXRjaDprZXkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyPUZhcignbWF0Y2g6cGF0dGVybiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1BhdHRlcm4oc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLaW5kSGVscGVyPUZhcignbWF0Y2g6a2luZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczpjaGVja0tpbmQsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkS2V5S2luZCxjaGVjayk9PlxudHlwZW9mIGFsbGVnZWRLZXlLaW5kPT09J3N0cmluZyd8fFxuY2hlY2soXG5mYWxzZSxcblggYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2ApLFxuXG5cbmdldFJhbmtDb3Zlcjooa2luZCxfZW5jb2RlUGFzc2FibGUpPT57XG5sZXQgc3R5bGU7XG5zd2l0Y2goa2luZCl7XG5jYXNlJ2NvcHlTZXQnOlxuY2FzZSdjb3B5TWFwJzp7XG5zdHlsZT0ndGFnZ2VkJztcbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuc3R5bGU9a2luZDtcbmJyZWFrO1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihzdHlsZSk7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJpZ2ludEhlbHBlcj1GYXIoJ21hdGNoOmJpZ2ludCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6YmlnaW50IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOYXRIZWxwZXI9RmFyKCdtYXRjaDpuYXQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2RlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnYmlnaW50JyxjaGVjaykmJlxuY2hlY2soXG4vKiogQHR5cGUge2JpZ2ludH0gKi9zcGVjaW1lbj49MG4sXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgbm9uLW5lZ2F0aXZlYCkmJlxuXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6bmF0IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG4vKiBUT0RPIENvdWxkIGJlIG1vcmUgcHJlY2lzZSovXG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTdHJpbmdIZWxwZXI9RmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N0cmluZ0xlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuLyogcHJldHRpZXItaWdub3JlKi9cbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnc3RyaW5nJyxjaGVjaykmJihcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbi8qKiBAdHlwZSB7c3RyaW5nfSAqL3NwZWNpbWVuLmxlbmd0aDw9c3RyaW5nTGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYHN0cmluZyAke3NwZWNpbWVufSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N0cmluZ0xlbmd0aExpbWl0fWApKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6c3RyaW5nIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3Zlcignc3RyaW5nJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTeW1ib2xIZWxwZXI9RmFyKCdtYXRjaDpzeW1ib2wgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N5bWJvbE5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ3N5bWJvbCcsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBzeW1ib2xOYW1lPW5hbWVGb3JQYXNzYWJsZVN5bWJvbChzcGVjaW1lbik7XG5cbmlmKHR5cGVvZiBzeW1ib2xOYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFBhc3NhYmxlIHN5bWJvbCAke3NwZWNpbWVufSBtdXN0IGhhdmUgYSBwYXNzYWJsZSBuYW1lYDtcbiB9XG5yZXR1cm4gY2hlY2soXG5zeW1ib2xOYW1lLmxlbmd0aDw9c3ltYm9sTmFtZUxlbmd0aExpbWl0LFxuWCBgU3ltYm9sIG5hbWUgJHtxKFxuc3ltYm9sTmFtZSlcbiB9IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3ltYm9sTmFtZUxlbmd0aExpbWl0fWApO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpzeW1ib2wgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdzeW1ib2wnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFJlbW90YWJsZUhlbHBlcj1GYXIoJ21hdGNoOnJlbW90YWJsZSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmVtb3RhYmxlRGVzYyxjaGVjayk9Pntcbi8qIFVuZm9ydHVuYXRlIGR1cGxpY2F0aW9uIG9mIGNoZWNrS2luZCBsb2dpYywgYnV0IG5vIGJldHRlciBjaG9pY2VzLiovXG5pZihjaGVja0tpbmQoc3BlY2ltZW4sJ3JlbW90YWJsZScsaWRlbnRDaGVja2VyKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihjaGVjaz09PWlkZW50Q2hlY2tlcil7XG5yZXR1cm4gZmFsc2U7XG4gfVxubGV0IHNwZWNpbWVuS2luZD1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihzcGVjaW1lbktpbmQ9PT0ndGFnZ2VkJyl7XG5zcGVjaW1lbktpbmQ9Z2V0VGFnKHNwZWNpbWVuKTtcbiB9XG5jb25zdHtsYWJlbH09cmVtb3RhYmxlRGVzYztcblxuLyogcXVvdGluZyB3aXRob3V0IHF1b3RlcyovXG5jb25zdCBkZXRhaWxzPVgoXG5bIGAke3NwZWNpbWVuS2luZH0gYCxgIC0gTXVzdCBiZSBhIHJlbW90YWJsZSAoJHtsYWJlbH0pYF0sXG5zcGVjaW1lbik7XG5cbnJldHVybiBjaGVjayhmYWxzZSxkZXRhaWxzKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZFJlbW90YWJsZURlc2MsY2hlY2spPT5cbmNoZWNrTWF0Y2hlcyhcbmFsbGVnZWRSZW1vdGFibGVEZXNjLFxuaGFyZGVuKHtsYWJlbDpNTS5zdHJpbmcoKX0pLFxuY2hlY2ssXG4nbWF0Y2g6cmVtb3RhYmxlIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9yZW1vdGFibGVEZXNjLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3JlbW90YWJsZScpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTFRFSGVscGVyPUZhcignbWF0Y2g6bHRlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdSaWdodEJvdW5kPSBgJHtlbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpfX5gO1xuaWYobmV3UmlnaHRCb3VuZCE9PXVuZGVmaW5lZCl7XG5yaWdodEJvdW5kPW5ld1JpZ2h0Qm91bmQ7XG4gfVxucmV0dXJuW2xlZnRCb3VuZCxyaWdodEJvdW5kXTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTFRIZWxwZXI9RmFyKCdtYXRjaDpsdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlMVChzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOm1hdGNoTFRFSGVscGVyLmdldFJhbmtDb3Zlcn0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEdURUhlbHBlcj1GYXIoJ21hdGNoOmd0ZSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlHVEUoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPj0gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6KHJpZ2h0T3BlcmFuZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuLyogVGhlIHByZWZlci1jb25zdCBtYWtlcyBubyBzZW5zZSB3aGVuIHNvbWUgb2YgdGhlIHZhcmlhYmxlcyBuZWVkKi9cbi8qIHRvIGJlIGBsZXRgKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QqL1xubGV0W2xlZnRCb3VuZCxyaWdodEJvdW5kXT1nZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuY29uc3QgbmV3TGVmdEJvdW5kPWVuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCk7XG5pZihuZXdMZWZ0Qm91bmQhPT11bmRlZmluZWQpe1xubGVmdEJvdW5kPW5ld0xlZnRCb3VuZDtcbiB9XG5yZXR1cm5bbGVmdEJvdW5kLHJpZ2h0Qm91bmRdO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hHVEhlbHBlcj1GYXIoJ21hdGNoOmd0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID4gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hHVEVIZWxwZXIuZ2V0UmFua0NvdmVyfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUmVjb3JkT2ZIZWxwZXI9RmFyKCdtYXRjaDpyZWNvcmRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1Qcm9wZXJ0aWVzTGltaXQscHJvcGVydHlOYW1lTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlSZWNvcmQnLGNoZWNrKSYmXG5jaGVjayhcbm93bktleXMoc3BlY2ltZW4pLmxlbmd0aDw9bnVtUHJvcGVydGllc0xpbWl0LFxuWCBgTXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxubnVtUHJvcGVydGllc0xpbWl0KVxuIH0gcHJvcGVydGllczogJHtzcGVjaW1lbn1gKSYmXG5cbmVudHJpZXMoc3BlY2ltZW4pLmV2ZXJ5KFxuKFtrZXksdmFsdWVdKT0+XG5hcHBseUxhYmVsaW5nRXJyb3IoXG5jaGVjayxcbltcbmtleS5sZW5ndGg8PXByb3BlcnR5TmFtZUxlbmd0aExpbWl0LFxuWCBgUHJvcGVydHkgbmFtZSBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAke3EoXG5wcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdClcbiB9YF0sXG5cbmtleSkmJlxuXG5jaGVja01hdGNoZXMoXG5oYXJkZW4oW2tleSx2YWx1ZV0pLFxuaGFyZGVuKFtrZXlQYXR0LHZhbHVlUGF0dF0pLFxuY2hlY2ssXG5rZXkpKSk7XG5cblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6cmVjb3JkT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5UmVjb3JkJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBcnJheU9mSGVscGVyPUZhcignbWF0Y2g6YXJyYXlPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW3N1YlBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHthcnJheUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuLyogcHJldHRpZXItaWdub3JlKi9cbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weUFycmF5JyxjaGVjaykmJihcbi8qKiBAdHlwZSB7QXJyYXl9ICovc3BlY2ltZW4ubGVuZ3RoPD1hcnJheUxlbmd0aExpbWl0fHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSBsZW5ndGggJHtzcGVjaW1lbi5sZW5ndGh9IG11c3QgYmUgPD0gbGltaXQgJHthcnJheUxlbmd0aExpbWl0fWApKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4sc3ViUGF0dCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDphcnJheU9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNldE9mSGVscGVyPUZhcignbWF0Y2g6c2V0T2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtrZXlQYXR0LGxpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7bnVtU2V0RWxlbWVudHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weVNldCcsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDxudW1TZXRFbGVtZW50c0xpbWl0LFxuWCBgU2V0IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShudW1TZXRFbGVtZW50c0xpbWl0KX0gZWxlbWVudHM6ICR7XG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aFxuIH1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4ucGF5bG9hZCxrZXlQYXR0LGNoZWNrLCdzZXQgZWxlbWVudHMnKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOnNldE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJhZ09mSGVscGVyPUZhcignbWF0Y2g6YmFnT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlCYWcnLGNoZWNrKSYmXG5jaGVjayhcbi8qKiBAdHlwZSB7QXJyYXl9ICovc3BlY2ltZW4ucGF5bG9hZC5sZW5ndGg8PVxubnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxcblggYEJhZyBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0KVxuIH0gdW5pcXVlIGVsZW1lbnRzOiAke3NwZWNpbWVufWApJiZcblxuc3BlY2ltZW4ucGF5bG9hZC5ldmVyeShcbihba2V5LGNvdW50XSxpKT0+XG5jaGVja01hdGNoZXMoa2V5LGtleVBhdHQsY2hlY2ssIGBiYWcga2V5c1ske2l9XWApJiZcbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuW2NvdW50LGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVja10sXG4gYGJhZyBjb3VudHNbJHtpfV1gKSYmXG5cbmNoZWNrTWF0Y2hlcyhjb3VudCxjb3VudFBhdHQsY2hlY2ssIGBiYWcgY291bnRzWyR7aX1dYCkpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6YmFnT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTWFwT2ZIZWxwZXI9RmFyKCdtYXRjaDptYXBPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1NYXBFbnRyaWVzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlNYXAnLGNoZWNrKSYmXG5jaGVjayhcbi8qKiBAdHlwZSB7QXJyYXl9ICovc3BlY2ltZW4ucGF5bG9hZC5rZXlzLmxlbmd0aDw9XG5udW1NYXBFbnRyaWVzTGltaXQsXG5YIGBDb3B5TWFwIG11c3QgaGF2ZSBubyBtb3JlIHRoYW4gJHtxKFxubnVtTWFwRW50cmllc0xpbWl0KVxuIH0gZW50cmllczogJHtzcGVjaW1lbn1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG5zcGVjaW1lbi5wYXlsb2FkLmtleXMsXG5rZXlQYXR0LFxuY2hlY2ssXG4nbWFwIGtleXMnKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG5zcGVjaW1lbi5wYXlsb2FkLnZhbHVlcyxcbnZhbHVlUGF0dCxcbmNoZWNrLFxuJ21hcCB2YWx1ZXMnKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKSxNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOm1hcE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9lbnRyeVBhdHQpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybltdfSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEByZXR1cm5zIHt7XG4gKiAgIHJlcXVpcmVkU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIHJlc3RTcGVjaW1lbjogUGFzc2FibGVbXVxuICogfX1cbiAqL1xuY29uc3Qgc3BsaXRBcnJheVBhcnRzPShzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KT0+e1xuY29uc3QgbnVtUmVxdWlyZWQ9cmVxdWlyZWRQYXR0Lmxlbmd0aDtcbmNvbnN0IG51bU9wdGlvbmFsPW9wdGlvbmFsUGF0dC5sZW5ndGg7XG5jb25zdCByZXF1aXJlZFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKDAsbnVtUmVxdWlyZWQpO1xuY29uc3Qgb3B0aW9uYWxTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShcbm51bVJlcXVpcmVkLFxubnVtUmVxdWlyZWQrbnVtT3B0aW9uYWwpO1xuXG5jb25zdCByZXN0U3BlY2ltZW49c3BlY2ltZW4uc2xpY2UobnVtUmVxdWlyZWQrbnVtT3B0aW9uYWwpO1xucmV0dXJuIGhhcmRlbih7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn0pO1xuIH07XG5cbi8qKlxuICogT3B0aW9uYWwgc3BlY2ltZW4gZWxlbWVudHMgd2hpY2ggYXJlIGB1bmRlZmluZWRgIHBhc3MgdW5jb25kaXRpb25hbGx5LlxuICogV2UgZW5jb2RlIHRoaXMgd2l0aCB0aGUgYE0ub3JgIHBhdHRlcm4gc28gaXQgYWxzbyBwcm9kdWNlcyBhIGdvb2RcbiAqIGNvbXByZXNzaW9uIGRpc3Rpbmd1aXNoaW5nIGB1bmRlZmluZWRgIGZyb20gYWJzZW5jZS5cbiAqXG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcmV0dXJucyB7UGF0dGVybltdfSBUaGUgcGFydGlhbFBhdHRcbiAqL1xuY29uc3QgYWRhcHRBcnJheVBhdHRlcm49KG9wdGlvbmFsUGF0dCxsZW5ndGgpPT5cbmhhcmRlbihvcHRpb25hbFBhdHQuc2xpY2UoMCxsZW5ndGgpLm1hcCgocGF0dCk9Pk1NLm9wdChwYXR0KSkpO1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTcGxpdEFycmF5SGVscGVyPUZhcignbWF0Y2g6c3BsaXRBcnJheSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PVtdLHJlc3RQYXR0PU1NLmFueSgpXSxcbmNoZWNrKT0+XG57XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QXJyYXknLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn09XG5zcGxpdEFycmF5UGFydHMoc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk7XG5jb25zdCBwYXJ0aWFsUGF0dD1hZGFwdEFycmF5UGF0dGVybihcbm9wdGlvbmFsUGF0dCxcbm9wdGlvbmFsU3BlY2ltZW4ubGVuZ3RoKTtcblxubGV0IGFyZ051bT0wO1xucmV0dXJuKFxuKHJlcXVpcmVkU3BlY2ltZW4ubGVuZ3RoPT09cmVxdWlyZWRQYXR0Lmxlbmd0aHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgRXhwZWN0ZWQgYXQgbGVhc3QgJHtxKFxucmVxdWlyZWRQYXR0Lmxlbmd0aClcbiB9IGFyZ3VtZW50czogJHtzcGVjaW1lbn1gKSkmJlxuXG5yZXF1aXJlZFBhdHQuZXZlcnkoKHAsaSk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzKi9cbmNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuW2ldLHAsY2hlY2ssIGBhcmcgJHthcmdOdW0rK31gKSkmJlxuXG5wYXJ0aWFsUGF0dC5ldmVyeSgocCxpKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuY2hlY2tNYXRjaGVzKG9wdGlvbmFsU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfT9gKSkmJlxuXG5jaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLHJlc3RQYXR0LGNoZWNrLCcuLi5yZXN0JykpO1xuXG4gfSxcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBzcGxpdEFycmF5XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbmNoZWNrSXNXZWxsRm9ybWVkOihzcGxpdEFycmF5LGNoZWNrKT0+e1xuaWYoXG5wYXNzU3R5bGVPZihzcGxpdEFycmF5KT09PSdjb3B5QXJyYXknJiYoXG5zcGxpdEFycmF5Lmxlbmd0aD49MXx8c3BsaXRBcnJheS5sZW5ndGg8PTMpKVxue1xuY29uc3RbcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD11bmRlZmluZWQscmVzdFBhdHQ9dW5kZWZpbmVkXT1cbnNwbGl0QXJyYXk7XG5pZihcbmlzUGF0dGVybihyZXF1aXJlZFBhdHQpJiZcbnBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCk9PT0nY29weUFycmF5JyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weUFycmF5JykmJihcbnJlc3RQYXR0PT09dW5kZWZpbmVkfHxpc1BhdHRlcm4ocmVzdFBhdHQpKSlcbntcbnJldHVybiB0cnVlO1xuIH1cbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYE11c3QgYmUgYW4gYXJyYXkgb2YgYSByZXF1aXJlZFBhdHQgYXJyYXksIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCBhcnJheSwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xuX3JlcXVpcmVkUGF0dCxcbl9vcHRpb25hbFBhdHQ9dW5kZWZpbmVkLFxuX3Jlc3RQYXR0PXVuZGVmaW5lZF0pPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhc3NhYmxlPn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICByZXN0U3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+XG4gKiB9fVxuICovXG5jb25zdCBzcGxpdFJlY29yZFBhcnRzPShzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KT0+e1xuLyogTm90IGZyb3plbiEgTXV0YXRlZCBpbiBwbGFjZSovXG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3QgcmVxdWlyZWRFbnRyaWVzPVtdO1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IG9wdGlvbmFsRW50cmllcz1bXTtcbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCByZXN0RW50cmllcz1bXTtcbmZvcihjb25zdFtuYW1lLHZhbHVlXW9mIGVudHJpZXMoc3BlY2ltZW4pKXtcbmlmKGhhc093blByb3BlcnR5T2YocmVxdWlyZWRQYXR0LG5hbWUpKXtcbnJlcXVpcmVkRW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfWVsc2UgaWYoaGFzT3duUHJvcGVydHlPZihvcHRpb25hbFBhdHQsbmFtZSkpe1xub3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9ZWxzZXtcbnJlc3RFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7XG5yZXF1aXJlZFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG5vcHRpb25hbFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKG9wdGlvbmFsRW50cmllcyksXG5yZXN0U3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMocmVzdEVudHJpZXMpfSk7XG5cbiB9O1xuXG4vKipcbiAqIE9wdGlvbmFsIHNwZWNpbWVuIHZhbHVlcyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge0NvcHlSZWNvcmQ8UGF0dGVybj59IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdFJlY29yZFBhdHRlcm49KG9wdGlvbmFsUGF0dCxuYW1lcyk9PlxuZnJvbVVuaXF1ZUVudHJpZXMobmFtZXMubWFwKChuYW1lKT0+W25hbWUsTU0ub3B0KG9wdGlvbmFsUGF0dFtuYW1lXSldKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0UmVjb3JkSGVscGVyPUZhcignbWF0Y2g6c3BsaXRSZWNvcmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5bcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD17fSxyZXN0UGF0dD1NTS5hbnkoKV0sXG5jaGVjayk9Plxue1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0UmVjb3JkUGFydHMoc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk7XG5cbmNvbnN0IHBhcnRpYWxOYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMob3B0aW9uYWxTcGVjaW1lbik7XG5jb25zdCBwYXJ0aWFsUGF0dD1hZGFwdFJlY29yZFBhdHRlcm4ob3B0aW9uYWxQYXR0LHBhcnRpYWxOYW1lcyk7XG5yZXR1cm4oXG5jaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbixyZXF1aXJlZFBhdHQsY2hlY2spJiZcbnBhcnRpYWxOYW1lcy5ldmVyeSgobmFtZSk9PlxuY2hlY2tNYXRjaGVzKFxub3B0aW9uYWxTcGVjaW1lbltuYW1lXSxcbnBhcnRpYWxQYXR0W25hbWVdLFxuY2hlY2ssXG4gYCR7bmFtZX0/YCkpJiZcblxuXG5jaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLHJlc3RQYXR0LGNoZWNrLCcuLi5yZXN0JykpO1xuXG4gfSxcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBzcGxpdEFycmF5XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbmNoZWNrSXNXZWxsRm9ybWVkOihzcGxpdEFycmF5LGNoZWNrKT0+e1xuaWYoXG5wYXNzU3R5bGVPZihzcGxpdEFycmF5KT09PSdjb3B5QXJyYXknJiYoXG5zcGxpdEFycmF5Lmxlbmd0aD49MXx8c3BsaXRBcnJheS5sZW5ndGg8PTMpKVxue1xuY29uc3RbcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD11bmRlZmluZWQscmVzdFBhdHQ9dW5kZWZpbmVkXT1cbnNwbGl0QXJyYXk7XG5pZihcbmlzUGF0dGVybihyZXF1aXJlZFBhdHQpJiZcbnBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCk9PT0nY29weVJlY29yZCcmJihcbm9wdGlvbmFsUGF0dD09PXVuZGVmaW5lZHx8XG5pc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSYmXG5wYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpPT09J2NvcHlSZWNvcmQnKSYmKFxucmVzdFBhdHQ9PT11bmRlZmluZWR8fGlzUGF0dGVybihyZXN0UGF0dCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCByZWNvcmQsIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCByZWNvcmQsIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuc3BsaXRBcnJheSlcbiB9YCk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KFtcbnJlcXVpcmVkUGF0dCxcbl9vcHRpb25hbFBhdHQ9dW5kZWZpbmVkLFxuX3Jlc3RQYXR0PXVuZGVmaW5lZF0pPT5cbmdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkpfSk7XG5cblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBNYXRjaEhlbHBlcj59ICovXG5jb25zdCBIZWxwZXJzQnlNYXRjaFRhZz1oYXJkZW4oe1xuJ21hdGNoOmFueSc6bWF0Y2hBbnlIZWxwZXIsXG4nbWF0Y2g6YW5kJzptYXRjaEFuZEhlbHBlcixcbidtYXRjaDpvcic6bWF0Y2hPckhlbHBlcixcbidtYXRjaDpub3QnOm1hdGNoTm90SGVscGVyLFxuXG4nbWF0Y2g6c2NhbGFyJzptYXRjaFNjYWxhckhlbHBlcixcbidtYXRjaDprZXknOm1hdGNoS2V5SGVscGVyLFxuJ21hdGNoOnBhdHRlcm4nOm1hdGNoUGF0dGVybkhlbHBlcixcbidtYXRjaDpraW5kJzptYXRjaEtpbmRIZWxwZXIsXG4nbWF0Y2g6YmlnaW50JzptYXRjaEJpZ2ludEhlbHBlcixcbidtYXRjaDpuYXQnOm1hdGNoTmF0SGVscGVyLFxuJ21hdGNoOnN0cmluZyc6bWF0Y2hTdHJpbmdIZWxwZXIsXG4nbWF0Y2g6c3ltYm9sJzptYXRjaFN5bWJvbEhlbHBlcixcbidtYXRjaDpyZW1vdGFibGUnOm1hdGNoUmVtb3RhYmxlSGVscGVyLFxuXG4nbWF0Y2g6bHQnOm1hdGNoTFRIZWxwZXIsXG4nbWF0Y2g6bHRlJzptYXRjaExURUhlbHBlcixcbidtYXRjaDpndGUnOm1hdGNoR1RFSGVscGVyLFxuJ21hdGNoOmd0JzptYXRjaEdUSGVscGVyLFxuXG4nbWF0Y2g6YXJyYXlPZic6bWF0Y2hBcnJheU9mSGVscGVyLFxuJ21hdGNoOnJlY29yZE9mJzptYXRjaFJlY29yZE9mSGVscGVyLFxuJ21hdGNoOnNldE9mJzptYXRjaFNldE9mSGVscGVyLFxuJ21hdGNoOmJhZ09mJzptYXRjaEJhZ09mSGVscGVyLFxuJ21hdGNoOm1hcE9mJzptYXRjaE1hcE9mSGVscGVyLFxuJ21hdGNoOnNwbGl0QXJyYXknOm1hdGNoU3BsaXRBcnJheUhlbHBlcixcbidtYXRjaDpzcGxpdFJlY29yZCc6bWF0Y2hTcGxpdFJlY29yZEhlbHBlcn0pO1xuXG5cbmNvbnN0IG1ha2VNYXRjaGVyPSh0YWcscGF5bG9hZCk9PntcbmNvbnN0IG1hdGNoZXI9bWFrZVRhZ2dlZCh0YWcscGF5bG9hZCk7XG5hc3NlcnRQYXR0ZXJuKG1hdGNoZXIpO1xucmV0dXJuIG1hdGNoZXI7XG4gfTtcblxuY29uc3QgbWFrZUtpbmRNYXRjaGVyPShraW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmtpbmQnLGtpbmQpO1xuXG5jb25zdCBBbnlTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6YW55Jyx1bmRlZmluZWQpO1xuY29uc3QgU2NhbGFyU2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOnNjYWxhcicsdW5kZWZpbmVkKTtcbmNvbnN0IEtleVNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDprZXknLHVuZGVmaW5lZCk7XG5jb25zdCBQYXR0ZXJuU2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOnBhdHRlcm4nLHVuZGVmaW5lZCk7XG5jb25zdCBCb29sZWFuU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdib29sZWFuJyk7XG5jb25zdCBOdW1iZXJTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ251bWJlcicpO1xuY29uc3QgQmlnSW50U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YmlnaW50JyxbXSk7XG5jb25zdCBOYXRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpuYXQnLFtdKTtcbmNvbnN0IFN0cmluZ1NoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnN0cmluZycsW10pO1xuY29uc3QgU3ltYm9sU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c3ltYm9sJyxbXSk7XG5jb25zdCBSZWNvcmRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpyZWNvcmRPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBBcnJheVNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOmFycmF5T2YnLFtBbnlTaGFwZV0pO1xuY29uc3QgU2V0U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c2V0T2YnLFtBbnlTaGFwZV0pO1xuY29uc3QgQmFnU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YmFnT2YnLFtBbnlTaGFwZSxBbnlTaGFwZV0pO1xuY29uc3QgTWFwU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6bWFwT2YnLFtBbnlTaGFwZSxBbnlTaGFwZV0pO1xuY29uc3QgUmVtb3RhYmxlU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdyZW1vdGFibGUnKTtcbmNvbnN0IEVycm9yU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdlcnJvcicpO1xuY29uc3QgUHJvbWlzZVNoYXBlPW1ha2VLaW5kTWF0Y2hlcigncHJvbWlzZScpO1xuY29uc3QgVW5kZWZpbmVkU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCd1bmRlZmluZWQnKTtcblxuLyoqXG4gKiBGb3Igd2hlbiB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBwYXlsb2FkIGlzIHRoZSBvcHRpb25hbCBsaW1pdHMsXG4gKiBzbyB0aGF0IHdoZW4gaXQgaXMgYHVuZGVmaW5lZGAgaXQgaXMgZHJvcHBlZCBmcm9tIHRoZSBlbmQgb2YgdGhlXG4gKiBwYXlsb2FkcyBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHBheWxvYWRcbiAqL1xuY29uc3QgbWFrZUxpbWl0c01hdGNoZXI9KHRhZyxwYXlsb2FkKT0+e1xuaWYocGF5bG9hZFtwYXlsb2FkLmxlbmd0aC0xXT09PXVuZGVmaW5lZCl7XG5wYXlsb2FkPWhhcmRlbihwYXlsb2FkLnNsaWNlKDAscGF5bG9hZC5sZW5ndGgtMSkpO1xuIH1cbnJldHVybiBtYWtlTWF0Y2hlcih0YWcscGF5bG9hZCk7XG4gfTtcblxuY29uc3QgbWFrZVJlbW90YWJsZU1hdGNoZXI9KGxhYmVsPXVuZGVmaW5lZCk9PlxubGFiZWw9PT11bmRlZmluZWQ/XG5SZW1vdGFibGVTaGFwZTpcbm1ha2VNYXRjaGVyKCdtYXRjaDpyZW1vdGFibGUnLGhhcmRlbih7bGFiZWx9KSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gZW1wdHlcbiAqIEBwYXJhbSB7VH0gYmFzZVxuICogQHBhcmFtIHtUfSBbb3B0aW9uYWxdXG4gKiBAcGFyYW0ge1R9IFtyZXN0XVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgbWFrZVNwbGl0UGF5bG9hZD0oXG5lbXB0eSxcbmJhc2UsXG5vcHRpb25hbD11bmRlZmluZWQsXG5yZXN0PXVuZGVmaW5lZCk9Plxue1xuaWYocmVzdCl7XG5yZXR1cm5bYmFzZSxvcHRpb25hbHx8ZW1wdHkscmVzdF07XG4gfVxuaWYob3B0aW9uYWwpe1xucmV0dXJuW2Jhc2Usb3B0aW9uYWxdO1xuIH1cbnJldHVybltiYXNlXTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7J3N5bmMnfCdhc3luYyd9IGNhbGxLaW5kXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IGFyZ0d1YXJkc1xuICogQHBhcmFtIHtBcmdHdWFyZFtdfSBbb3B0aW9uYWxBcmdHdWFyZHNdXG4gKiBAcGFyYW0ge0FyZ0d1YXJkfSBbcmVzdEFyZ0d1YXJkXVxuICogQHJldHVybnMge01ldGhvZEd1YXJkTWFrZXJ9XG4gKi9cbmNvbnN0IG1ha2VNZXRob2RHdWFyZE1ha2VyPShcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHM9dW5kZWZpbmVkLFxucmVzdEFyZ0d1YXJkPXVuZGVmaW5lZCk9PlxuXG5oYXJkZW4oe1xub3B0aW9uYWw6KC4uLm9wdEFyZ0d1YXJkcyk9Pntcbm9wdGlvbmFsQXJnR3VhcmRzPT09dW5kZWZpbmVkfHxcbkZhaWwgYENhbiBvbmx5IGhhdmUgb25lIHNldCBvZiBvcHRpb25hbCBndWFyZHNgO1xucmVzdEFyZ0d1YXJkPT09dW5kZWZpbmVkfHxcbkZhaWwgYG9wdGlvbmFsIGFyZyBndWFyZHMgbXVzdCBjb21lIGJlZm9yZSByZXN0IGFyZ2A7XG5yZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoY2FsbEtpbmQsYXJnR3VhcmRzLG9wdEFyZ0d1YXJkcyk7XG4gfSxcbnJlc3Q6KHJBcmdHdWFyZCk9PntcbnJlc3RBcmdHdWFyZD09PXVuZGVmaW5lZHx8RmFpbCBgQ2FuIG9ubHkgaGF2ZSBvbmUgcmVzdCBhcmdgO1xucmV0dXJuIG1ha2VNZXRob2RHdWFyZE1ha2VyKFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJBcmdHdWFyZCk7XG5cbiB9LFxucmV0dXJuczoocmV0dXJuR3VhcmQ9VW5kZWZpbmVkU2hhcGUpPT5cbmhhcmRlbih7XG5rbGFzczonbWV0aG9kR3VhcmQnLFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJlc3RBcmdHdWFyZCxcbnJldHVybkd1YXJkfSl9KTtcblxuXG5cbmNvbnN0IG1ha2VBd2FpdEFyZ0d1YXJkPShhcmdHdWFyZCk9PlxuaGFyZGVuKHtcbmtsYXNzOidhd2FpdEFyZycsXG5hcmdHdWFyZH0pO1xuXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7TWF0Y2hlck5hbWVzcGFjZX0gKi9cbmNvbnN0IE09aGFyZGVuKHtcbmFueTooKT0+QW55U2hhcGUsXG5hbmQ6KC4uLnBhdHRzKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmFuZCcscGF0dHMpLFxub3I6KC4uLnBhdHRzKT0+bWFrZU1hdGNoZXIoJ21hdGNoOm9yJyxwYXR0cyksXG5ub3Q6KHN1YlBhdHQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bm90JyxzdWJQYXR0KSxcblxuc2NhbGFyOigpPT5TY2FsYXJTaGFwZSxcbmtleTooKT0+S2V5U2hhcGUsXG5wYXR0ZXJuOigpPT5QYXR0ZXJuU2hhcGUsXG5raW5kOm1ha2VLaW5kTWF0Y2hlcixcbmJvb2xlYW46KCk9PkJvb2xlYW5TaGFwZSxcbm51bWJlcjooKT0+TnVtYmVyU2hhcGUsXG5iaWdpbnQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmlnaW50JyxbbGltaXRzXSk6QmlnSW50U2hhcGUsXG5uYXQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bmF0JyxbbGltaXRzXSk6TmF0U2hhcGUsXG5zdHJpbmc6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3RyaW5nJyxbbGltaXRzXSk6U3RyaW5nU2hhcGUsXG5zeW1ib2w6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3ltYm9sJyxbbGltaXRzXSk6U3ltYm9sU2hhcGUsXG5yZWNvcmQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLnJlY29yZE9mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOlJlY29yZFNoYXBlLFxuYXJyYXk6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLmFycmF5T2YoTS5hbnkoKSxsaW1pdHMpOkFycmF5U2hhcGUsXG5zZXQ6KGxpbWl0cz11bmRlZmluZWQpPT5saW1pdHM/TS5zZXRPZihNLmFueSgpLGxpbWl0cyk6U2V0U2hhcGUsXG5iYWc6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLmJhZ09mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOkJhZ1NoYXBlLFxubWFwOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5tYXBPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpNYXBTaGFwZSxcbnJlbW90YWJsZTptYWtlUmVtb3RhYmxlTWF0Y2hlcixcbmVycm9yOigpPT5FcnJvclNoYXBlLFxucHJvbWlzZTooKT0+UHJvbWlzZVNoYXBlLFxudW5kZWZpbmVkOigpPT5VbmRlZmluZWRTaGFwZSxcbm51bGw6KCk9Pm51bGwsXG5cbmx0OihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bHQnLHJpZ2h0T3BlcmFuZCksXG5sdGU6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpsdGUnLHJpZ2h0T3BlcmFuZCksXG5lcTooa2V5KT0+e1xuYXNzZXJ0S2V5KGtleSk7XG5yZXR1cm4ga2V5PT09dW5kZWZpbmVkP00udW5kZWZpbmVkKCk6a2V5O1xuIH0sXG5uZXE6KGtleSk9Pk0ubm90KE0uZXEoa2V5KSksXG5ndGU6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpndGUnLHJpZ2h0T3BlcmFuZCksXG5ndDoocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmd0JyxyaWdodE9wZXJhbmQpLFxuXG5yZWNvcmRPZjooa2V5UGF0dD1NLmFueSgpLHZhbHVlUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpyZWNvcmRPZicsW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0c10pLFxuYXJyYXlPZjooc3ViUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDphcnJheU9mJyxbc3ViUGF0dCxsaW1pdHNdKSxcbnNldE9mOihrZXlQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnNldE9mJyxba2V5UGF0dCxsaW1pdHNdKSxcbmJhZ09mOihrZXlQYXR0PU0uYW55KCksY291bnRQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJhZ09mJyxba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzXSksXG5tYXBPZjooa2V5UGF0dD1NLmFueSgpLHZhbHVlUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDptYXBPZicsW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0c10pLFxuc3BsaXRBcnJheTooYmFzZSxvcHRpb25hbD11bmRlZmluZWQscmVzdD11bmRlZmluZWQpPT5cbm1ha2VNYXRjaGVyKFxuJ21hdGNoOnNwbGl0QXJyYXknLFxubWFrZVNwbGl0UGF5bG9hZChbXSxiYXNlLG9wdGlvbmFsLHJlc3QpKSxcblxuc3BsaXRSZWNvcmQ6KGJhc2Usb3B0aW9uYWw9dW5kZWZpbmVkLHJlc3Q9dW5kZWZpbmVkKT0+XG5tYWtlTWF0Y2hlcihcbidtYXRjaDpzcGxpdFJlY29yZCcsXG5tYWtlU3BsaXRQYXlsb2FkKHt9LGJhc2Usb3B0aW9uYWwscmVzdCkpLFxuXG5zcGxpdDooYmFzZSxyZXN0PXVuZGVmaW5lZCk9PntcbmlmKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSk9PT0nY29weUFycmF5Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgaXQgc2hvdWxkIGJlIGFuIGFycmF5Ki9cbnJldHVybiBNLnNwbGl0QXJyYXkoYmFzZSxyZXN0JiZbXSxyZXN0KTtcbiB9ZWxzZXtcbnJldHVybiBNLnNwbGl0UmVjb3JkKGJhc2UscmVzdCYme30scmVzdCk7XG4gfVxuIH0sXG5wYXJ0aWFsOihiYXNlLHJlc3Q9dW5kZWZpbmVkKT0+e1xuaWYocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xucmV0dXJuIE0uc3BsaXRBcnJheShbXSxiYXNlLHJlc3QpO1xuIH1lbHNle1xucmV0dXJuIE0uc3BsaXRSZWNvcmQoe30sYmFzZSxyZXN0KTtcbiB9XG4gfSxcblxuZXJlZjoodCk9Pk0ub3IodCxNLnByb21pc2UoKSksXG5vcHQ6KHQpPT5NLm9yKE0udW5kZWZpbmVkKCksdCksXG5cbmludGVyZmFjZTooaW50ZXJmYWNlTmFtZSxtZXRob2RHdWFyZHMse3Nsb3BweT1mYWxzZX09e30pPT57XG5mb3IoY29uc3RbXyxtZXRob2RHdWFyZF1vZiBlbnRyaWVzKG1ldGhvZEd1YXJkcykpe1xubWV0aG9kR3VhcmQua2xhc3M9PT0nbWV0aG9kR3VhcmQnfHxcbkZhaWwgYHVucmVjb2duaXplIG1ldGhvZCBndWFyZCAke21ldGhvZEd1YXJkfWA7XG4gfVxucmV0dXJuIGhhcmRlbih7XG5rbGFzczonSW50ZXJmYWNlJyxcbmludGVyZmFjZU5hbWUsXG5tZXRob2RHdWFyZHMsXG5zbG9wcHl9KTtcblxuIH0sXG5jYWxsOiguLi5hcmdHdWFyZHMpPT5tYWtlTWV0aG9kR3VhcmRNYWtlcignc3luYycsYXJnR3VhcmRzKSxcbmNhbGxXaGVuOiguLi5hcmdHdWFyZHMpPT5tYWtlTWV0aG9kR3VhcmRNYWtlcignYXN5bmMnLGFyZ0d1YXJkcyksXG5cbmF3YWl0OihhcmdHdWFyZCk9Pm1ha2VBd2FpdEFyZ0d1YXJkKGFyZ0d1YXJkKX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuY2hlY2tNYXRjaGVzLFxubWF0Y2hlcyxcbm11c3RNYXRjaCxcbmFzc2VydFBhdHRlcm4sXG5pc1BhdHRlcm4sXG5nZXRSYW5rQ292ZXIsXG5NfSk7XG5cbiB9O1xuXG4vKiBPbmx5IGluY2x1ZGUgdGhvc2Ugd2hvc2UgbWVhbmluZyBpcyBpbmRlcGVuZGVudCBvZiBhbiBpbXB1dGVkIHNvcnQgb3JkZXIqL1xuLyogb2YgcmVtb3RhYmxlcywgb3Igb2YgZW5jb2Rpbmcgb2YgcGFzc2FibGUgYXMgc29ydGFibGUgc3RyaW5ncy4gVGh1cywqL1xuLyogZ2V0UmFua0NvdmVyIGlzIG9taXR0ZWQuIFRvIGdldCBvbmUsIHlvdSdkIG5lZWQgdG8gaW5zdGFudGlhdGUqL1xuLyogYG1ha2VQYXR0ZXJuS2l0KClgIHlvdXJzZWxmLiBTaW5jZSB0aGVyZSBhcmUgY3VycmVudGx5IG5vIGV4dGVybmFsKi9cbi8qIHVzZXMgb2YgYGdldFJhbmtDb3ZlcmAsIGZvciBjbGFyaXR5IGR1cmluZyBkZXZlbG9wbWVudCwgYG1ha2VQYXR0ZXJuS2l0YCovXG4vKiBpcyBub3QgY3VycmVudGx5IGV4cG9ydGVkLiovXG5jb25zdCAgICAgICB7XG5jaGVja01hdGNoZXMsXG5tYXRjaGVzLFxubXVzdE1hdGNoLFxuYXNzZXJ0UGF0dGVybixcbmlzUGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19PVxubWFrZVBhdHRlcm5LaXQoKTskaOKAjV9vbmNlLmNoZWNrTWF0Y2hlcyhjaGVja01hdGNoZXMpOyRo4oCNX29uY2UubWF0Y2hlcyhtYXRjaGVzKTskaOKAjV9vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpOyRo4oCNX29uY2UuYXNzZXJ0UGF0dGVybihhc3NlcnRQYXR0ZXJuKTskaOKAjV9vbmNlLmlzUGF0dGVybihpc1BhdHRlcm4pOyRo4oCNX29uY2UuZ2V0UmFua0NvdmVyKGdldFJhbmtDb3Zlcik7JGjigI1fb25jZS5NKE0pO1xuXG5NTT1NO1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5VGFnZ2VkfSBDb3B5VGFnZ2VkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5QXJyYXk8VD59IENvcHlBcnJheSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5SYW5rQ292ZXJ9IFJhbmtDb3ZlciAqL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQXJnR3VhcmR9IEFyZ0d1YXJkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuTWV0aG9kR3VhcmRNYWtlcn0gTWV0aG9kR3VhcmRNYWtlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLk1hdGNoZXJOYW1lc3BhY2V9IE1hdGNoZXJOYW1lc3BhY2UgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXl9IEtleSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLlBhdHRlcm59IFBhdHRlcm4gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5QYXR0ZXJuS2l0fSBQYXR0ZXJuS2l0ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ2hlY2tQYXR0ZXJufSBDaGVja1BhdHRlcm4gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5MaW1pdHN9IExpbWl0cyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkFsbExpbWl0c30gQWxsTGltaXRzICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuR2V0UmFua0NvdmVyfSBHZXRSYW5rQ292ZXIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXRjaEhlbHBlclxuICogVGhpcyBmYWN0b3JzIG91dCBvbmx5IHRoZSBwYXJ0cyBzcGVjaWZpYyB0byBlYWNoIGtpbmQgb2YgTWF0Y2hlci4gSXQgaXNcbiAqIGVuY2Fwc3VsYXRlZCwgYW5kIGl0cyBtZXRob2RzIGNhbiBtYWtlIHRoZSBzdGF0ZWQgdW5jaGVja2VyIGFzc3VtcHRpb25zXG4gKiBlbmZvcmNlZCBieSB0aGUgY29tbW9uIGNhbGxpbmcgbG9naWMuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZFBheWxvYWQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXJcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tJc1dlbGxGb3JtZWRcbiAqIFJlcG9ydHMgd2hldGhlciBgYWxsZWdlZFBheWxvYWRgIGlzIHZhbGlkIGFzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZFxuICogd2hvc2UgdGFnIGNvcnJlc3BvbmRzIHdpdGggdGhpcyBNYXRjaEhlbHBlcidzIE1hdGNoZXJzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIG1hdGNoZXJQYXlsb2FkOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyLFxuICogKSA9PiBib29sZWFufSBjaGVja01hdGNoZXNcbiAqIEFzc3VtaW5nIHZhbGlkaXR5IG9mIGBtYXRjaGVyUGF5bG9hZGAgYXMgdGhlIHBheWxvYWQgb2YgYSBNYXRjaGVyIGNvcnJlc3BvbmRpbmdcbiAqIHdpdGggdGhpcyBNYXRjaEhlbHBlciwgcmVwb3J0cyB3aGV0aGVyIGBzcGVjaW1lbmAgaXMgbWF0Y2hlZCBieSB0aGF0IE1hdGNoZXIuXG4gKlxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuLi90eXBlcycpLkdldFJhbmtDb3Zlcn0gZ2V0UmFua0NvdmVyXG4gKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsXG4gKiBpbiByYW5rIG9yZGVyLCBhbGwgcG9zc2libGUgUGFzc2FibGVzIHRoYXQgd291bGQgbWF0Y2ggdGhpcyBNYXRjaGVyLlxuICogVGhlIGxlZnQgZWxlbWVudCBtdXN0IGJlIGJlZm9yZSBvciB0aGUgc2FtZSByYW5rIGFzIGFueSBwb3NzaWJsZVxuICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWVcbiAqIHJhbmsgYXMgYW55IHBvc3NpYmxlIG1hdGNoaW5nIHNwZWNpbWVuLlxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdExpbWl0cyI6WyJkZWZhdWx0TGltaXRzIl0sImNoZWNrTWF0Y2hlcyI6WyJjaGVja01hdGNoZXMiXSwibWF0Y2hlcyI6WyJtYXRjaGVzIl0sIm11c3RNYXRjaCI6WyJtdXN0TWF0Y2giXSwiYXNzZXJ0UGF0dGVybiI6WyJhc3NlcnRQYXR0ZXJuIl0sImlzUGF0dGVybiI6WyJpc1BhdHRlcm4iXSwiZ2V0UmFua0NvdmVyIjpbImdldFJhbmtDb3ZlciJdLCJNIjpbIk0iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAIgAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlh73x+oaAADqGgAAIgAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMvdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIiwiZnJvbVVuaXF1ZUVudHJpZXMiLCJpZGVudENoZWNrZXIiLCJsaXN0RGlmZmVyZW5jZSIsIm9iamVjdE1hcCIsInRocm93TGFiZWxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLGlzUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtmcm9tRW50cmllcyxlbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qIFRPRE8gbWlncmF0ZSB0byBwcm9wZXIgaG9tZSovXG4vKiBGcm9tIHRoZSBgYWdvcmljLXNka2AgbW9ub3JlcG8uIE1vdmVkIGhlcmUgdGVtcG9yYXJpbHkgYmVjYXVzZSB0aGUgcGF0dGVybiovXG4vKiBjb2RlIGlzIG1pZ3JhdGVkIGZyb20gYEBhZ29yaWMvc3RvcmVgIHRvIGBAZW5kby9wYXR0ZXJuc2AsIGFuZCBkZXBlbmRzIG9uKi9cbi8qIHRoZSBmdW5jdGlvbmFsaXR5IGluIHRoaXMgZmlsZSwgd2hpY2ggaXMgb3RoZXJ3aXNlIGF2YWlsYWJsZSBvbmx5Ki9cbi8qIHdpdGhpbiB0aGUgYGFnb3JpYy1zZGtgIG1vbm9yZXBvLiovXG5cbi8qKlxuICogVE9ETyBhcyBsb25nIGFzIGBAZW5kby9wYXNzLXN0eWxlYCByZW1haW5zIHRoZSBwcm9wZXIgaG9tZSBvZiB0aGVcbiAqIGBDaGVja2VyYCB0eXBlLCBpdCBwcm9iYWJseSBtYWtlcyBtb3N0IHNlbnNlIHRvIG1vdmUgYGlkZW50Q2hlY2tlcmBcbiAqIGludG8gYEBlbmRvL3Bhc3Mtc3R5bGVgIGFzIHdlbGwuXG4gKlxuICogSW4gdGhlIGBhc3NlcnRGb29gL2Bpc0Zvb2AvYGNoZWNrRm9vYCBwYXR0ZXJuLCBgY2hlY2tGb29gIGhhcyBhIGBjaGVja2BcbiAqIHBhcmFtZXRlciBvZiB0eXBlIGBDaGVja2VyYC4gYGFzc2VydEZvb2AgY2FsbHMgYGNoZWNrRm9vYCBwYXNzZXNcbiAqIGBhc3NlcnRDaGVja2VyYCBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlzRm9vYCBwYXNzZXMgYGlkZW50Q2hlY2tlcmBcbiAqIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaWRlbnRDaGVja2VyYCBhY3RzIHByZWNpc2VseSBsaWtlIGFuXG4gKiBpZGVudGl0eSBmdW5jdGlvbiwgYnV0IGlzIHR5cGVkIGFzIGEgYENoZWNrZXJgIHRvIGluZGljYXRlIGl0c1xuICogaW50ZW5kZWQgdXNlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgaWRlbnRDaGVja2VyPShjb25kLF9kZXRhaWxzKT0+Y29uZDskaOKAjV9vbmNlLmlkZW50Q2hlY2tlcihpZGVudENoZWNrZXIpO1xuaGFyZGVuKGlkZW50Q2hlY2tlcik7XG5cbi8qKlxuICogVGhyb3dzIGlmIG11bHRpcGxlIGVudHJpZXMgdXNlIHRoZSBzYW1lIHByb3BlcnR5IG5hbWUuIE90aGVyd2lzZSBhY3RzXG4gKiBsaWtlIGBPYmplY3QuZnJvbUVudHJpZXNgIGJ1dCBoYXJkZW5zIHRoZSByZXN1bHQuXG4gKiBVc2UgaXQgdG8gcHJvdGVjdCBmcm9tIHByb3BlcnR5IG5hbWVzIGNvbXB1dGVkIGZyb20gdXNlci1wcm92aWRlZCBkYXRhLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssVl0+fSBhbGxFbnRyaWVzXG4gKiBAcmV0dXJucyB7e1trOiBLXTogVn19XG4gKi9cbmNvbnN0ICAgICAgICBmcm9tVW5pcXVlRW50cmllcz0oYWxsRW50cmllcyk9PntcbmNvbnN0IGVudHJpZXNBcnJheT1bLi4uYWxsRW50cmllc107XG5jb25zdCByZXN1bHQ9aGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuaWYob3duS2V5cyhyZXN1bHQpLmxlbmd0aD09PWVudHJpZXNBcnJheS5sZW5ndGgpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7XG5mb3IoY29uc3RbbmFtZSxfXW9mIGVudHJpZXNBcnJheSl7XG5pZihuYW1lcy5oYXMobmFtZSkpe1xuRmFpbCBgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiB9XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xuIH07JGjigI1fb25jZS5mcm9tVW5pcXVlRW50cmllcyhmcm9tVW5pcXVlRW50cmllcyk7XG5oYXJkZW4oZnJvbVVuaXF1ZUVudHJpZXMpO1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZlxuICogYW4gYXJyYXkgdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsXG4gKiBgb2JqZWN0TWFwYCB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgc3RyaW5nLW5hbWVkIG93biBlbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBUeXBpY2FsIHVzYWdlIGFwcGxpZXMgYG9iamVjdE1hcGAgdG8gYSBDb3B5UmVjb3JkLCBpLmUuLFxuICogYW4gb2JqZWN0IGZvciB3aGljaCBgcGFzc1N0eWxlT2Yob3JpZ2luYWwpID09PSAnY29weVJlY29yZCdgLiBGb3IgdGhlc2UsXG4gKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgZWRnZSBjYXNlcyBhcmlzZS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgQ29weVJlY29yZFxuICogd2l0aCBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnR5IG5hbWVzLCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBtYXBwZWQgZm9ybSBvZlxuICogdGhlIG9yaWdpbmFsJ3MgdmFsdWVzLlxuICpcbiAqIFdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBhIENvcHlSZWNvcmQsIHNvbWUgZWRnZSBjYXNlcyB0byBiZSBhd2FyZSBvZlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogT25seSB0aGUgc3RyaW5nLW5hbWVkIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsXG4gKiAgICAgIGFyZSBtYXBwZWQuIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIGBPYmplY3QuZW50cmllc2BcbiAqICAgICAgd2lsbCBjYXVzZSBpdHMgYGdldHRlcmAgdG8gYmUgY2FsbGVkIGFuZCB3aWxsIHVzZSB0aGUgcmVzdWx0aW5nXG4gKiAgICAgIHZhbHVlLlxuICogICAgKiBObyBtYXR0ZXIgd2hldGhlciB0aGUgb3JpZ2luYWwgcHJvcGVydHkgd2FzIGFuIGFjY2Vzc29yLCB3cml0YWJsZSxcbiAqICAgICAgb3IgY29uZmlndXJhYmxlLCBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiAgICAgIG5vbi13cml0YWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgZGF0YSBwcm9wZXJ0aWVzLlxuICogICAgKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IG1heSBoYXZlIGluaGVyaXRlZCBmcm9tLCBhbmRcbiAqICAgICAgbm8gbWF0dGVyIHdoZXRoZXIgaXQgd2FzIGEgc3BlY2lhbCBraW5kIG9mIG9iamVjdCBzdWNoIGFzIGFuIGFycmF5LFxuICogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IGluaGVyaXRpbmcgZGlyZWN0bHlcbiAqICAgICAgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYW5kIHdob3NlIHN0YXRlIGlzIG9ubHkgdGhlc2UgbmV3IG1hcHBlZFxuICogICAgICBvd24gcHJvcGVydGllcy5cbiAqXG4gKiBXaXRoIHRoZXNlIGRpZmZlcmVuY2VzLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBvYmplY3Qgd2FzIG5vdCBhIENvcHlSZWNvcmQsXG4gKiBpZiBhbGwgdGhlIG1hcHBlZCB2YWx1ZXMgYXJlIFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogYSBDb3B5UmVjb3JkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gT1xuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHRlbXBsYXRlIFIgbWFwIHJlc3VsdFxuICogQHBhcmFtIHsodmFsdWU6IE9ba2V5b2YgT10sIGtleToga2V5b2YgTykgPT4gUn0gbWFwRm5cbiAqIEByZXR1cm5zIHt7IFtQIGluIGtleW9mIE9dOiBSfX1cbiAqL1xuY29uc3QgICAgICAgIG9iamVjdE1hcD0ob3JpZ2luYWwsbWFwRm4pPT57XG5jb25zdCBlbnRzPWVudHJpZXMob3JpZ2luYWwpO1xuY29uc3QgbWFwRW50cz1lbnRzLm1hcCgoW2ssdl0pPT5bayxtYXBGbih2LGspXSk7XG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKTtcbiB9OyRo4oCNX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSBsZWZ0TmFtZXNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gcmlnaHROYW1lc1xuICovXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnROYW1lcyxyaWdodE5hbWVzKT0+e1xuY29uc3QgcmlnaHRTZXQ9bmV3IFNldChyaWdodE5hbWVzKTtcbnJldHVybiBsZWZ0TmFtZXMuZmlsdGVyKChuYW1lKT0+IXJpZ2h0U2V0LmhhcyhuYW1lKSk7XG4gfTskaOKAjV9vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcj19IEVycm9yQ29uc3RydWN0b3JcbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKiBFdmFkZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE0NTAgdXNpbmcgYmxhbmsgbGluZSovXG5jb25zdCAgICAgICAgdGhyb3dMYWJlbGVkPShpbm5lckVycixsYWJlbCxFcnJvckNvbnN0cnVjdG9yPXVuZGVmaW5lZCk9PntcbmlmKHR5cGVvZiBsYWJlbD09PSdudW1iZXInKXtcbmxhYmVsPSBgWyR7bGFiZWx9XWA7XG4gfVxuY29uc3Qgb3V0ZXJFcnI9YXNzZXJ0LmVycm9yKFxuIGAke2xhYmVsfTogJHtpbm5lckVyci5tZXNzYWdlfWAsXG5FcnJvckNvbnN0cnVjdG9yKTtcblxuYXNzZXJ0Lm5vdGUob3V0ZXJFcnIsWCBgQ2F1c2VkIGJ5ICR7aW5uZXJFcnJ9YCk7XG50aHJvdyBvdXRlckVycjtcbiB9OyRo4oCNX29uY2UudGhyb3dMYWJlbGVkKHRocm93TGFiZWxlZCk7XG5oYXJkZW4odGhyb3dMYWJlbGVkKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgQSxSXG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFJ9IGZ1bmNcbiAqIEBwYXJhbSB7QVtdfSBhcmdzXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtSfVxuICovXG5jb25zdCAgICAgICAgYXBwbHlMYWJlbGluZ0Vycm9yPShmdW5jLGFyZ3MsbGFiZWw9dW5kZWZpbmVkKT0+e1xuaWYobGFiZWw9PT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmMoLi4uYXJncyk7XG4gfVxubGV0IHJlc3VsdDtcbnRyeXtcbnJlc3VsdD1mdW5jKC4uLmFyZ3MpO1xuIH1jYXRjaChlcnIpe1xudGhyb3dMYWJlbGVkKGVycixsYWJlbCk7XG4gfVxuaWYoaXNQcm9taXNlKHJlc3VsdCkpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBJZiByZXN1bHQgaXMgYSByZWplY3RlZCBwcm9taXNlLCB0aGlzIHdpbGwqL1xuLyogcmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEgZGlmZmVyZW50IHJlamVjdGlvbiByZWFzb24uIEJ1dCB0aGlzKi9cbi8qIGNvbmZ1c2VzIFR5cGVTY3JpcHQgYmVjYXVzZSBpdCB0eXBlcyB0aGF0IGNhc2UgYXMgYFByb21pc2U8bmV2ZXI+YCovXG4vKiB3aGljaCBpcyBjb29sIGZvciBhIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyIGZ1bGZsbC4qL1xuLyogQnV0IFR5cGVTY3JpcHQgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgdGhpcyB3aWxsIG9ubHkgaGFwcGVuKi9cbi8qIHdoZW4gYHJlc3VsdGAgd2FzIGEgcmVqZWN0ZWQgcHJvbWlzZS4gSW4gb25seSB0aGlzIGNhc2UgYFJgKi9cbi8qIHNob3VsZCBhbHJlYWR5IGFsbG93IGBQcm9taXNlPG5ldmVyPmAgYXMgYSBzdWJ0eXBlLiovXG5yZXR1cm4gRS53aGVuKHJlc3VsdCx1bmRlZmluZWQsKHJlYXNvbik9PnRocm93TGFiZWxlZChyZWFzb24sbGFiZWwpKTtcbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH07JGjigI1fb25jZS5hcHBseUxhYmVsaW5nRXJyb3IoYXBwbHlMYWJlbGluZ0Vycm9yKTtcbmhhcmRlbihhcHBseUxhYmVsaW5nRXJyb3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlkZW50Q2hlY2tlciI6WyJpZGVudENoZWNrZXIiXSwiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiXSwib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdLCJsaXN0RGlmZmVyZW5jZSI6WyJsaXN0RGlmZmVyZW5jZSJdLCJ0aHJvd0xhYmVsZWQiOlsidGhyb3dMYWJlbGVkIl0sImFwcGx5TGFiZWxpbmdFcnJvciI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAClK+n3AJAABwCQAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCxtZW1vUmFjZTskaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLCBbJGjigI1fYSA9PiAobWVtb1JhY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlUHJvbWlzZUtpdFwifSk7JGjigI1fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywgJ25hbWUnLCB7dmFsdWU6IFwicmFjZVByb21pc2VzXCJ9KTskaOKAjV9vbmNlLnJhY2VQcm9taXNlcyhyYWNlUHJvbWlzZXMpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2U9Z2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZXx8UHJvbWlzZTtcblxuLyoqXG4gKiBtYWtlUHJvbWlzZUtpdCgpIGJ1aWxkcyBhIFByb21pc2Ugb2JqZWN0LCBhbmQgcmV0dXJucyBhIHJlY29yZFxuICogY29udGFpbmluZyB0aGUgcHJvbWlzZSBpdHNlbGYsIGFzIHdlbGwgYXMgc2VwYXJhdGUgZmFjZXRzIGZvciByZXNvbHZpbmdcbiAqIGFuZCByZWplY3RpbmcgaXQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3NyYy90eXBlcy5qcycpLlByb21pc2VLaXQ8VD59XG4gKi9cbmZ1bmN0aW9uICAgICAgICBtYWtlUHJvbWlzZUtpdCgpe1xuY29uc3R7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9PW1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpO1xuXG5jb25zdCBwcm9taXNlPW5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxucmV0dXJuIGhhcmRlbih7cHJvbWlzZSxyZXNvbHZlLHJlamVjdH0pO1xuIH1cbmhhcmRlbihtYWtlUHJvbWlzZUtpdCk7XG5cbi8qIE5COiBBbm90aGVyIGltcGxlbWVudGF0aW9uIGZvciBQcm9taXNlLnJhY2Ugd291bGQgYmUgdG8gdXNlIHRoZSByZWxlYXNpbmcgZXhlY3V0b3IsKi9cbi8qIEhvd2V2ZXIgd2hpbGUgaXQgd291bGQgbm8gbG9uZ2VyIGxlYWsgdGhlIHJhY2VkIHByb21pc2Ugb2JqZWN0cyB0aGVtc2VsdmVzLCBpdCB3b3VsZCovXG4vKiBzdGlsbCBsZWFrIHJlYWN0aW9ucyBvbiB0aGUgbm9uLXJlc29sdmVkIHByb21pc2VzIGNvbnRlbmRpbmcgZm9yIHRoZSByYWNlLiovXG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gICAgICAgIHJhY2VQcm9taXNlcyh2YWx1ZXMpe1xucmV0dXJuIGhhcmRlbihtZW1vUmFjZS5jYWxsKEJlc3RQaXBlbGluYWJsZVByb21pc2UsdmFsdWVzKSk7XG4gfVxuaGFyZGVuKHJhY2VQcm9taXNlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACIfYGs3wIAAN8CAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzUHJvbWlzZSwgJ25hbWUnLCB7dmFsdWU6IFwiaXNQcm9taXNlXCJ9KTskaOKAjV9vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOyAgIC8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBtYXliZVByb21pc2UgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHttYXliZVByb21pc2UgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuZnVuY3Rpb24gICAgICAgIGlzUHJvbWlzZShtYXliZVByb21pc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpPT09bWF5YmVQcm9taXNlO1xuIH1cbmhhcmRlbihpc1Byb21pc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHadN674SAAC+EgAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBJbml0aWFsIHZlcnNpb24gYXV0aG9yZWQgYnkgQnJpYW4gS2ltOlxuaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8xNzQ2OSNpc3N1ZWNvbW1lbnQtNjg1MjE2Nzc3XG4gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbiBBbnlvbmUgaXMgZnJlZSB0byBjb3B5LCBtb2RpZnksIHB1Ymxpc2gsIHVzZSwgY29tcGlsZSwgc2VsbCwgb3JcbmRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgZWl0aGVyIGluIHNvdXJjZSBjb2RlIGZvcm0gb3IgYXMgYSBjb21waWxlZFxuYmluYXJ5LCBmb3IgYW55IHB1cnBvc2UsIGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwsIGFuZCBieSBhbnlcbm1lYW5zLlxuIEluIGp1cmlzZGljdGlvbnMgdGhhdCByZWNvZ25pemUgY29weXJpZ2h0IGxhd3MsIHRoZSBhdXRob3Igb3IgYXV0aG9yc1xub2YgdGhpcyBzb2Z0d2FyZSBkZWRpY2F0ZSBhbnkgYW5kIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlXG5zb2Z0d2FyZSB0byB0aGUgcHVibGljIGRvbWFpbi4gV2UgbWFrZSB0aGlzIGRlZGljYXRpb24gZm9yIHRoZSBiZW5lZml0XG5vZiB0aGUgcHVibGljIGF0IGxhcmdlIGFuZCB0byB0aGUgZGV0cmltZW50IG9mIG91ciBoZWlycyBhbmRcbnN1Y2Nlc3NvcnMuIFdlIGludGVuZCB0aGlzIGRlZGljYXRpb24gdG8gYmUgYW4gb3ZlcnQgYWN0IG9mXG5yZWxpbnF1aXNobWVudCBpbiBwZXJwZXR1aXR5IG9mIGFsbCBwcmVzZW50IGFuZCBmdXR1cmUgcmlnaHRzIHRvIHRoaXNcbnNvZnR3YXJlIHVuZGVyIGNvcHlyaWdodCBsYXcuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxuSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Jcbk9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLFxuQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SXG5PVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byA8aHR0cDovL3VubGljZW5zZS5vcmcvPlxuKi9cblxuXG5cblxuXG5cblxuY29uc3QgaXNPYmplY3Q9KHZhbHVlKT0+T2JqZWN0KHZhbHVlKT09PXZhbHVlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWZlcnJlZFxuICogQHByb3BlcnR5IHsodmFsdWU/OiBYaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FUmVmPFQ+ICkgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHByb3BlcnR5IHsoZXJyPzogYW55ICkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IG5ldmVyXG4gKiAgfCB7c2V0dGxlZDogZmFsc2UsIGRlZmVycmVkczogU2V0PERlZmVycmVkPn1cbiAqICB8IHtzZXR0bGVkOiB0cnVlLCBkZWZlcnJlZHM/OiB1bmRlZmluZWR9XG4gKiB9IFByb21pc2VNZW1vUmVjb3JkXG4gKi9cblxuLyogS2V5cyBhcmUgdGhlIHZhbHVlcyBwYXNzZWQgdG8gcmFjZSwgdmFsdWVzIGFyZSBhIHJlY29yZCBvZiBkYXRhIGNvbnRhaW5pbmcgYSovXG4vKiBzZXQgb2YgZGVmZXJyZWRzIGFuZCB3aGV0aGVyIHRoZSB2YWx1ZSBoYXMgc2V0dGxlZC4qL1xuLyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgUHJvbWlzZU1lbW9SZWNvcmQ+fSAqL1xuY29uc3Qga25vd25Qcm9taXNlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZU1lbW9SZWNvcmQgfCB1bmRlZmluZWR9IHJlY29yZFxuICogQHJldHVybnMge1NldDxEZWZlcnJlZD59XG4gKi9cbmNvbnN0IG1hcmtTZXR0bGVkPShyZWNvcmQpPT57XG5pZighcmVjb3JkfHxyZWNvcmQuc2V0dGxlZCl7XG5yZXR1cm4gbmV3IFNldCgpO1xuIH1cblxuY29uc3R7ZGVmZXJyZWRzfT1yZWNvcmQ7XG5PYmplY3QuYXNzaWduKHJlY29yZCx7XG5kZWZlcnJlZHM6dW5kZWZpbmVkLFxuc2V0dGxlZDp0cnVlfSk7XG5cbk9iamVjdC5mcmVlemUocmVjb3JkKTtcbnJldHVybiBkZWZlcnJlZHM7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7UHJvbWlzZU1lbW9SZWNvcmR9XG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQ9KHZhbHVlKT0+e1xuaWYoIWlzT2JqZWN0KHZhbHVlKSl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIGEgcHJpbWl0aXZlLCBhdHRlbXB0aW5nIHRvIHVzZSBpdCBhcyBhIGtleSBpbiB0aGUqL1xuLyogd2Vha21hcCB3b3VsZCB0aHJvdyBhbiBlcnJvci4gTHVja2lseSwgaXQgaXMgc2FmZSB0byBjYWxsKi9cbi8qIGBQcm9taXNlLnJlc29sdmUoY29udGVuZGVyKS50aGVuYCBvbiBhIHByaW1pdGl2ZSB2YWx1ZSBtdWx0aXBsZSB0aW1lcyovXG4vKiBiZWNhdXNlIHRoZSBwcm9taXNlIGZ1bGZpbGxzIGltbWVkaWF0ZWx5LiBTbyB3ZSBmYWtlIGEgc2V0dGxlZCByZWNvcmQuKi9cbnJldHVybiBoYXJkZW4oe3NldHRsZWQ6dHJ1ZX0pO1xuIH1cblxubGV0IHJlY29yZD1rbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbmlmKCFyZWNvcmQpe1xucmVjb3JkPXtkZWZlcnJlZHM6bmV3IFNldCgpLHNldHRsZWQ6ZmFsc2V9O1xua25vd25Qcm9taXNlcy5zZXQodmFsdWUscmVjb3JkKTtcbi8qIFRoaXMgY2FsbCB0byBgdGhlbmAgaGFwcGVucyBvbmNlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHZhbHVlLiovXG5Qcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oXG4odmFsKT0+e1xuZm9yKGNvbnN0e3Jlc29sdmV9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZXNvbHZlKHZhbCk7XG4gfVxuIH0sXG4oZXJyKT0+e1xuZm9yKGNvbnN0e3JlamVjdH1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlamVjdChlcnIpO1xuIH1cbiB9KTtcblxuIH1cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3R7cmFjZX09e1xuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSBbUD1Qcm9taXNlQ29uc3RydWN0b3JdXG4gKiBAdGhpcyB7UH1cbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5yYWNlKHZhbHVlcyl7XG5sZXQgZGVmZXJyZWQ7XG4vKiogQHR5cGUge1RbXX0gKi9cbmNvbnN0IGNhY2hlZFZhbHVlcz1bXTtcbmNvbnN0IEM9dGhpcztcbmNvbnN0IHJlc3VsdD1uZXcgQygocmVzb2x2ZSxyZWplY3QpPT57XG5kZWZlcnJlZD17cmVzb2x2ZSxyZWplY3R9O1xuZm9yKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyl7XG5jYWNoZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG5jb25zdHtzZXR0bGVkLGRlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihzZXR0bGVkKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgc2V0dGxlZCAoaW5jbHVkaW5nIHByaW1pdGl2ZXMpLCBpdCBpcyBzYWZlKi9cbi8qIHRvIGNhbGwgYFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbmAgb24gaXQuKi9cbkMucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLHJlamVjdCk7XG4gfWVsc2V7XG5kZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuXG4vKiBUaGUgZmluYWxseSBjYWxsYmFjayBleGVjdXRlcyB3aGVuIGFueSB2YWx1ZSBzZXR0bGVzLCBwcmV2ZW50aW5nIGFueSBvZiovXG4vKiB0aGUgdW5yZXNvbHZlZCB2YWx1ZXMgZnJvbSByZXRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIHJlc29sdmVkIHZhbHVlLiovXG5yZXR1cm4gcmVzdWx0LmZpbmFsbHkoKCk9PntcbmZvcihjb25zdCB2YWx1ZSBvZiBjYWNoZWRWYWx1ZXMpe1xuY29uc3R7ZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKGRlZmVycmVkcyl7XG5kZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuIH19OyRo4oCNX29uY2UucmFjZShyYWNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANNDsO5pBwAAaQcAADUAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIFByb21pc2VFeGVjdXRvciBUaGUgcHJvbWlzZSBleGVjdXRvclxuICogQHBhcmFtIHsodmFsdWU6IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKSBidWlsZHMgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIHdoaWNoIGRyb3AgcmVmZXJlbmNlc1xuICogdG8gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBnYXRoZXJlZCBmcm9tIGFuIGV4ZWN1dG9yIHRvIGJlIHVzZWQgd2l0aCBhXG4gKiBwcm9taXNlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UGljazxYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPiwgJ3Jlc29sdmUnIHwgJ3JlamVjdCc+ICYgeyBleGVjdXRvcjogUHJvbWlzZUV4ZWN1dG9yPFQ+fX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKCh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVzb2x2ZTtcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgocmVhc29uOiB1bmtub3duKSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlamVjdDtcblxuLyoqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD59IHZhbHVlICovXG5jb25zdCByZXNvbHZlPSh2YWx1ZSk9PntcbmlmKGludGVybmFsUmVzb2x2ZSl7XG5pbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PW51bGwpO1xuIH1cbiB9O1xuXG4vKiogQHBhcmFtIHt1bmtub3dufSByZWFzb24gKi9cbmNvbnN0IHJlamVjdD0ocmVhc29uKT0+e1xuaWYoaW50ZXJuYWxSZWplY3Qpe1xuaW50ZXJuYWxSZWplY3QocmVhc29uKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlamVjdD09PW51bGwpO1xuIH1cbiB9O1xuXG5jb25zdCBleGVjdXRvcj0ocmVzLHJlaik9PntcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT11bmRlZmluZWQmJmludGVybmFsUmVqZWN0PT09dW5kZWZpbmVkKTtcbmludGVybmFsUmVzb2x2ZT1yZXM7XG5pbnRlcm5hbFJlamVjdD1yZWo7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9KTtcbiB9OyRo4oCNX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACYAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAMriXk9BgAAPQYAAAdAAAAQGVuZG8vc3RyZWFtLXYwLjMuMjUvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZVBpcGUiLCJtYWtlUXVldWUiLCJtYWtlU3RyZWFtIiwibWFwUmVhZGVyIiwibWFwV3JpdGVyIiwicHJpbWUiLCJwdW1wIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsbWFrZVByb21pc2VLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZXNvbHZlKHZhbHVlPzogVCB8IFByb21pc2U8VD4pOiB2b2lkLFxuICogICByZWplY3QoZXJyb3I6IEVycm9yKTogdm9pZCxcbiAqICAgcHJvbWlzZTogUHJvbWlzZTxUPlxuICogfX0gUHJvbWlzZUtpdFxuICovXG5cbi8qIFR5cGVTY3JpcHQgUmVhZE9ubHkgc2VtYW50aWNzIGFyZSBub3Qgc3VmZmljaWVudGx5IGV4cHJlc3NpdmUgdG8gZGlzdGluZ3Vpc2gqL1xuLyogYSB2YWx1ZSBvbmUgcHJvbWlzZXMgbm90IHRvIGFsdGVyIGZyb20gYSB2YWx1ZSBvbmUgbXVzdCBub3QgYWx0ZXIsKi9cbi8qIG1ha2luZyBpdCB1c2VsZXNzLiovXG5jb25zdCBmcmVlemU9LyoqIEB0eXBlIHs8VD4odjogVCB8IFJlYWRvbmx5PFQ+KSA9PiBUfSAqL09iamVjdC5mcmVlemU7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXN5bmNRdWV1ZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VRdWV1ZT0oKT0+e1xubGV0e3Byb21pc2U6dGFpbFByb21pc2UscmVzb2x2ZTp0YWlsUmVzb2x2ZX09bWFrZVByb21pc2VLaXQoKTtcbnJldHVybntcbnB1dCh2YWx1ZSl7XG5jb25zdHtyZXNvbHZlLHByb21pc2V9PW1ha2VQcm9taXNlS2l0KCk7XG50YWlsUmVzb2x2ZShmcmVlemUoe3ZhbHVlLHByb21pc2V9KSk7XG50YWlsUmVzb2x2ZT1yZXNvbHZlO1xuIH0sXG5nZXQoKXtcbmNvbnN0IHByb21pc2U9dGFpbFByb21pc2UudGhlbigobmV4dCk9Pm5leHQudmFsdWUpO1xudGFpbFByb21pc2U9dGFpbFByb21pc2UudGhlbigobmV4dCk9Pm5leHQucHJvbWlzZSk7XG5yZXR1cm4gaGFyZGVuKHByb21pc2UpO1xuIH19O1xuXG4gfTskaOKAjV9vbmNlLm1ha2VRdWV1ZShtYWtlUXVldWUpO1xuaGFyZGVuKG1ha2VRdWV1ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRSZWFkXG4gKiBAdGVtcGxhdGUgVFdyaXRlXG4gKiBAdGVtcGxhdGUgVFJlYWRSZXR1cm5cbiAqIEB0ZW1wbGF0ZSBUV3JpdGVSZXR1cm5cbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkFzeW5jUXVldWU8SXRlcmF0b3JSZXN1bHQ8VFJlYWQsIFRSZWFkUmV0dXJuPj59IGFja3NcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkFzeW5jUXVldWU8SXRlcmF0b3JSZXN1bHQ8VFdyaXRlLCBUV3JpdGVSZXR1cm4+Pn0gZGF0YVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0cmVhbT0oYWNrcyxkYXRhKT0+e1xuY29uc3Qgc3RyZWFtPWhhcmRlbih7XG4vKipcbiAqIEBwYXJhbSB7VFdyaXRlfSB2YWx1ZVxuICovXG5uZXh0KHZhbHVlKXtcbi8qIE5vdGUgdGhlIHNoYWxsb3cgZnJlZXplIHNpbmNlIHZhbHVlIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGZyZWV6YWJsZSovXG4vKiAodHlwZWQgYXJyYXlzIGFyZSBub3QpLiovXG5kYXRhLnB1dChmcmVlemUoe3ZhbHVlLGRvbmU6ZmFsc2V9KSk7XG5yZXR1cm4gYWNrcy5nZXQoKTtcbiB9LFxuLyoqXG4gKiBAcGFyYW0ge1RXcml0ZVJldHVybn0gdmFsdWVcbiAqL1xucmV0dXJuKHZhbHVlKXtcbmRhdGEucHV0KGZyZWV6ZSh7dmFsdWUsZG9uZTp0cnVlfSkpO1xucmV0dXJuIGFja3MuZ2V0KCk7XG4gfSxcbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqL1xudGhyb3coZXJyb3Ipe1xuZGF0YS5wdXQoaGFyZGVuKFByb21pc2UucmVqZWN0KGVycm9yKSkpO1xucmV0dXJuIGFja3MuZ2V0KCk7XG4gfSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtcbnJldHVybiBzdHJlYW07XG4gfX0pO1xuXG5yZXR1cm4gc3RyZWFtO1xuIH07JGjigI1fb25jZS5tYWtlU3RyZWFtKG1ha2VTdHJlYW0pO1xuaGFyZGVuKG1ha2VTdHJlYW0pO1xuXG4vKiBKU0RvYyBUeXBlU2NyaXB0IHNlZW1zIHVuYWJsZSB0byBleHByZXNzIHRoaXMgcGFydGljdWxhciBmdW5jdGlvbidzKi9cbi8qIGVudGFuZ2xlbWVudCBvZiBxdWV1ZXMsIGJ1dCB0aGUgZGVmaW5pdGlvbiBpbiB0eXBlcy5kLnRzIHdvcmtzIGZvciB0aGUgZW5kKi9cbi8qIHVzZXIuKi9cbmNvbnN0ICAgICAgICBtYWtlUGlwZT0oKT0+e1xuY29uc3QgZGF0YT1tYWtlUXVldWUoKTtcbmNvbnN0IGFja3M9bWFrZVF1ZXVlKCk7XG5jb25zdCByZWFkZXI9bWFrZVN0cmVhbShhY2tzLGRhdGEpO1xuY29uc3Qgd3JpdGVyPW1ha2VTdHJlYW0oZGF0YSxhY2tzKTtcbnJldHVybiBoYXJkZW4oW3dyaXRlcixyZWFkZXJdKTtcbiB9OyRo4oCNX29uY2UubWFrZVBpcGUobWFrZVBpcGUpO1xuaGFyZGVuKG1ha2VQaXBlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmVhZFJldHVyblxuICogQHRlbXBsYXRlIFRXcml0ZVJldHVyblxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU3RyZWFtPFRXcml0ZSwgVFJlYWQsIFRXcml0ZVJldHVybiwgVFJlYWRSZXR1cm4+fSB3cml0ZXJcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlN0cmVhbTxUUmVhZCwgVFdyaXRlLCBUUmVhZFJldHVybiwgVFdyaXRlUmV0dXJuPn0gcmVhZGVyXG4gKiBAcGFyYW0ge1RXcml0ZX0gcHJpbWVyXG4gKi9cbmNvbnN0ICAgICAgICBwdW1wPWFzeW5jKHdyaXRlcixyZWFkZXIscHJpbWVyKT0+e1xuLyoqIEBwYXJhbSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUUmVhZCwgVFJlYWRSZXR1cm4+Pn0gcHJvbWlzZSAqL1xuY29uc3QgdGljaz0ocHJvbWlzZSk9PlxuRS53aGVuKFxucHJvbWlzZSxcbihyZXN1bHQpPT57XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gd3JpdGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuIH1lbHNle1xuLyogQmVob2xkOiBtdXR1YWwgcmVjdXJzaW9uLiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIHRvY2sod3JpdGVyLm5leHQocmVzdWx0LnZhbHVlKSk7XG4gfVxuIH0sXG4oLyoqIEB0eXBlIHtFcnJvcn0gKi9lcnJvcik9PntcbnJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuIH0pO1xuXG4vKiogQHBhcmFtIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRXcml0ZSwgVFdyaXRlUmV0dXJuPj59IHByb21pc2UgKi9cbmNvbnN0IHRvY2s9KHByb21pc2UpPT5cbkUud2hlbihcbnByb21pc2UsXG4ocmVzdWx0KT0+e1xuaWYocmVzdWx0LmRvbmUpe1xucmV0dXJuIHJlYWRlci5yZXR1cm4ocmVzdWx0LnZhbHVlKTtcbiB9ZWxzZXtcbnJldHVybiB0aWNrKHJlYWRlci5uZXh0KHJlc3VsdC52YWx1ZSkpO1xuIH1cbiB9LFxuKC8qKiBAdHlwZSB7RXJyb3J9ICovZXJyb3IpPT57XG5yZXR1cm4gcmVhZGVyLnRocm93KGVycm9yKTtcbiB9KTtcblxuYXdhaXQgdGljayhyZWFkZXIubmV4dChwcmltZXIpKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfTskaOKAjV9vbmNlLnB1bXAocHVtcCk7XG5oYXJkZW4ocHVtcCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRSZWFkXG4gKiBAdGVtcGxhdGUgVFdyaXRlXG4gKiBAdGVtcGxhdGUgVFJldHVyblxuICogQHBhcmFtIHtBc3luY0dlbmVyYXRvcjxUUmVhZCwgVFJldHVybiwgVFdyaXRlPn0gZ2VuZXJhdG9yXG4gKiBAcGFyYW0ge1RXcml0ZX0gcHJpbWVyXG4gKi9cbmNvbnN0ICAgICAgICBwcmltZT0oZ2VuZXJhdG9yLHByaW1lcik9Pntcbi8qIFdlIGNhcHR1cmUgdGhlIGZpcnN0IHJldHVybmVkIHByb21pc2UuKi9cbmNvbnN0IGZpcnN0PWdlbmVyYXRvci5uZXh0KHByaW1lcik7XG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmV0dXJuPj19ICovXG5sZXQgcmVzdWx0O1xuY29uc3QgcHJpbWVkPWhhcmRlbih7XG4vKiogQHBhcmFtIHtUV3JpdGV9IHZhbHVlICovXG4gICAgICBhc3luYyBuZXh0KHZhbHVlKXtcbmlmKHJlc3VsdD09PXVuZGVmaW5lZCl7XG5yZXN1bHQ9YXdhaXQgZmlyc3Q7XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5yZXR1cm4gZ2VuZXJhdG9yLm5leHQodmFsdWUpO1xuIH0sXG4vKiogQHBhcmFtIHtUUmV0dXJufSB2YWx1ZSAqL1xuICAgICAgYXN5bmMgcmV0dXJuKHZhbHVlKXtcbmlmKHJlc3VsdD09PXVuZGVmaW5lZCl7XG5yZXN1bHQ9YXdhaXQgZmlyc3Q7XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5yZXR1cm4gZ2VuZXJhdG9yLnJldHVybih2YWx1ZSk7XG4gfSxcbi8qKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAqL1xuICAgICAgYXN5bmMgdGhyb3coZXJyb3Ipe1xuaWYocmVzdWx0PT09dW5kZWZpbmVkKXtcbnJlc3VsdD1hd2FpdCBmaXJzdDtcbmlmKHJlc3VsdC5kb25lKXtcbnRocm93IGVycm9yO1xuIH1cbiB9XG5yZXR1cm4gZ2VuZXJhdG9yLnRocm93KGVycm9yKTtcbiB9fSk7XG5cbnJldHVybiBwcmltZWQ7XG4gfTskaOKAjV9vbmNlLnByaW1lKHByaW1lKTtcbmhhcmRlbihwcmltZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRJblxuICogQHRlbXBsYXRlIFRPdXRcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlYWRlcjxUSW4+fSByZWFkZXJcbiAqIEBwYXJhbSB7KHZhbHVlOiBUSW4pID0+IFRPdXR9IHRyYW5zZm9ybVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZWFkZXI8VE91dD59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBSZWFkZXI9KHJlYWRlcix0cmFuc2Zvcm0pPT57XG5hc3luYyBmdW5jdGlvbip0cmFuc2Zvcm1HZW5lcmF0b3IoKXtcbmZvciBhd2FpdChjb25zdCB2YWx1ZSBvZiByZWFkZXIpe1xueWllbGQgdHJhbnNmb3JtKHZhbHVlKTtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBoYXJkZW4odHJhbnNmb3JtR2VuZXJhdG9yKCkpO1xuIH07JGjigI1fb25jZS5tYXBSZWFkZXIobWFwUmVhZGVyKTtcbmhhcmRlbihtYXBSZWFkZXIpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUSW5cbiAqIEB0ZW1wbGF0ZSBUT3V0XG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Xcml0ZXI8VE91dD59IHdyaXRlclxuICogQHBhcmFtIHsodmFsdWU6IFRJbikgPT4gVE91dH0gdHJhbnNmb3JtXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi90eXBlcy5qcycpLldyaXRlcjxUSW4+fVxuICovXG5jb25zdCAgICAgICAgbWFwV3JpdGVyPSh3cml0ZXIsdHJhbnNmb3JtKT0+e1xuY29uc3QgdHJhbnNmb3JtZWRXcml0ZXI9aGFyZGVuKHtcbi8qKlxuICogQHBhcmFtIHtUSW59IHZhbHVlXG4gKi9cbiAgICAgIGFzeW5jIG5leHQodmFsdWUpe1xucmV0dXJuIHdyaXRlci5uZXh0KHRyYW5zZm9ybSh2YWx1ZSkpO1xuIH0sXG4vKipcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKi9cbiAgICAgIGFzeW5jIHRocm93KGVycm9yKXtcbnJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuIH0sXG4vKipcbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSB2YWx1ZVxuICovXG4gICAgICBhc3luYyByZXR1cm4odmFsdWUpe1xucmV0dXJuIHdyaXRlci5yZXR1cm4odmFsdWUpO1xuIH0sXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7XG5yZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG4gfX0pO1xuXG5yZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG4gfTskaOKAjV9vbmNlLm1hcFdyaXRlcihtYXBXcml0ZXIpO1xuaGFyZGVuKG1hcFdyaXRlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVF1ZXVlIjpbIm1ha2VRdWV1ZSJdLCJtYWtlU3RyZWFtIjpbIm1ha2VTdHJlYW0iXSwibWFrZVBpcGUiOlsibWFrZVBpcGUiXSwicHVtcCI6WyJwdW1wIl0sInByaW1lIjpbInByaW1lIl0sIm1hcFJlYWRlciI6WyJtYXBSZWFkZXIiXSwibWFwV3JpdGVyIjpbIm1hcFdyaXRlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACLuoeSrQEAAK0BAAAcAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvbWFpbi5qc3siaW1wb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3JpbmcwL21haW4uanNcIiwgW11dLFtcIi4vcmluZzEvbWFpbi5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnc8TiV0BAABdAQAAHwAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL0UuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiQGVuZG8vZmFyIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD4tMm/qQMAAKkDAAAsAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzeW5jR2VuZXJhdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIFJldHVybiBhbiBhc3luYyBpdGVyYWJsZSB0aGF0IHByb2R1Y2VzIGl0ZXJhdG9yIHJlc3VsdHMgdmlhIGBuZXh0YC5cbiAqXG4gKiBUaGlzIHdvcmtzIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBTeW1ib2wuXG4gKlxuICogQHRlbXBsYXRlIFQsVFJldHVyblxuICogQHBhcmFtIHsoKSA9PiBJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPiB8XG4gKiAgICAgICAgICAgICAgIFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+XG4gKiB9IG5leHQgcHJvZHVjZSBhIHNpbmdsZS1zdGVwIGl0ZXJhdG9yIHJlc3VsdFxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBhc3luY0dlbmVyYXRlPShuZXh0KT0+e1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6YXN5bmMoKT0+aGFyZGVuKG5leHQoKSl9KTtcblxuIH19KTtcblxuIH07JGjigI1fb25jZS5hc3luY0dlbmVyYXRlKGFzeW5jR2VuZXJhdGUpO1xuaGFyZGVuKGFzeW5jR2VuZXJhdGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jR2VuZXJhdGUiOlsiYXN5bmNHZW5lcmF0ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACX11Tt0AEAANABAAAiAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFpbi5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIiwiLi9tYWtlcnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL0UuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIiwiLi9tYWtlcnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL0UuanNcIiwgW11dLFtcIi4vbWFrZXJzLmpzXCIsIFtdXSxbXCIuL2FzeW5jLWdlbmVyYXRlLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABvm3ti4wgAAOMIAAAkAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFrZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlTWFwIiwibWFrZVByb21pc2UiLCJtYWtlU2V0IiwibWFrZVdlYWtNYXAiLCJtYWtlV2Vha1NldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBUaGVzZSB3b3JrIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBgbmV3YC4qL1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIiAvPiovXG5cbi8qKiBAdHlwZSB7PFQ+KGV4ZWN1dG9yOiAocmVzb2x2ZTogKHZhbHVlOiBUKSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+XG4gKiB2b2lkKSA9PiB2b2lkKSA9PiBQcm9taXNlPFQ+fSAqL1xuY29uc3QgICAgICAgIG1ha2VQcm9taXNlPShleGVjdXRvcik9PmhhcmRlbihuZXcgUHJvbWlzZShleGVjdXRvcikpOyRo4oCNX29uY2UubWFrZVByb21pc2UobWFrZVByb21pc2UpO1xuaGFyZGVuKG1ha2VQcm9taXNlKTtcblxuLyoqIEB0eXBlZGVmIHs8SywgVj4oZW50cmllcz86IHJlYWRvbmx5IChyZWFkb25seSBbSywgVl0pW10pID0+IE1hcDxLLCBWPn0gTWFwRnJvbUVudHJpZXMgKi9cbi8qKiBAdHlwZWRlZiB7PEssIFY+KGl0ZXJhYmxlOiBJdGVyYWJsZTxyZWFkb25seSBbSywgVl0+KSA9PiBNYXA8SywgVj59IE1hcEZyb21JdGVyYWJsZSAqL1xuXG4vKiogQHR5cGUge01hcEZyb21FbnRyaWVzICYgTWFwRnJvbUl0ZXJhYmxlfSAqL1xuY29uc3QgICAgICAgIG1ha2VNYXA9KGVudHJpZXNPckl0ZXJhYmxlKT0+aGFyZGVuKG5ldyBNYXAoZW50cmllc09ySXRlcmFibGUpKTskaOKAjV9vbmNlLm1ha2VNYXAobWFrZU1hcCk7XG5oYXJkZW4obWFrZU1hcCk7XG5cbi8qKiBAdHlwZWRlZiB7PFQ+KHZhbHVlcz86IHJlYWRvbmx5IFRbXSkgPT4gU2V0PFQ+fSBTZXRGcm9tVmFsdWVzICovXG4vKiogQHR5cGVkZWYgezxUPihpdGVyYWJsZTogSXRlcmFibGU8VD4pID0+IFNldDxUPn0gU2V0RnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1NldEZyb21WYWx1ZXMgJiBTZXRGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZVNldD0odmFsdWVzKT0+aGFyZGVuKG5ldyBTZXQodmFsdWVzKSk7JGjigI1fb25jZS5tYWtlU2V0KG1ha2VTZXQpO1xuaGFyZGVuKG1ha2VTZXQpO1xuXG4vKiogQHR5cGVkZWYgezxLIGV4dGVuZHMge30sIFYgPSBhbnk+KGVudHJpZXM/OiByZWFkb25seSBbSywgVl1bXSB8IG51bGwpID0+IFdlYWtNYXA8SywgVj59IFdlYWtNYXBGcm9tRW50cmllcyAqL1xuLyoqIEB0eXBlZGVmIHs8SyBleHRlbmRzIHt9LCBWPihpdGVyYWJsZTogSXRlcmFibGU8W0ssIFZdPikgPT4gV2Vha01hcDxLLCBWPn0gV2Vha01hcEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtXZWFrTWFwRnJvbUVudHJpZXMgJiBXZWFrTWFwRnJvbUl0ZXJhYmxlfSAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrTWFwPShlbnRyaWVzKT0+aGFyZGVuKG5ldyBXZWFrTWFwKGVudHJpZXMpKTskaOKAjV9vbmNlLm1ha2VXZWFrTWFwKG1ha2VXZWFrTWFwKTtcbmhhcmRlbihtYWtlV2Vha01hcCk7XG5cbi8qKiBAdHlwZWRlZiB7PFQgZXh0ZW5kcyB7fT4odmFsdWVzPzogcmVhZG9ubHkgVFtdKSA9PiBXZWFrU2V0PFQ+fSBXZWFrU2V0RnJvbVZhbHVlcyAqL1xuLyoqIEB0eXBlZGVmIHs8VCBleHRlbmRzIHt9PihpdGVyYWJsZTogSXRlcmFibGU8VD4pID0+IFdlYWtTZXQ8VD59IFdlYWtTZXRGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7V2Vha1NldEZyb21WYWx1ZXMgJiBXZWFrU2V0RnJvbUl0ZXJhYmxlfSAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrU2V0PSh2YWx1ZXMpPT5oYXJkZW4obmV3IFdlYWtTZXQodmFsdWVzKSk7JGjigI1fb25jZS5tYWtlV2Vha1NldChtYWtlV2Vha1NldCk7XG5oYXJkZW4obWFrZVdlYWtTZXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlIjpbIm1ha2VQcm9taXNlIl0sIm1ha2VNYXAiOlsibWFrZU1hcCJdLCJtYWtlU2V0IjpbIm1ha2VTZXQiXSwibWFrZVdlYWtNYXAiOlsibWFrZVdlYWtNYXAiXSwibWFrZVdlYWtTZXQiOlsibWFrZVdlYWtTZXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtCz1mP4EAAD+BAAAKQAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzeyJpbXBvcnRzIjpbIi4uL3JpbmcwL21haW4uanMiXSwiZXhwb3J0cyI6WyJhc3luY0RvV2hpbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVByb21pc2U7JGjigI1faW1wb3J0cyhbW1wiLi4vcmluZzAvbWFpbi5qc1wiLCBbW1wibWFrZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIFJlc29sdmUgcmV0dXJuZWQgcHJvbWlzZSB3aXRoIHVuZGVmaW5lZCB3aGVuIGBib2R5YCByZXR1cm5zIGZhbHN5LlxuICpcbiAqIFRoaXMgd29ya3MgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIGBhd2FpdGAgbm90IGF0IHRoZSBmdW5jdGlvbi1sZXZlbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUIHwgUHJvbWlzZTxUPn0gYm9keSBwZXJmb3JtIHNpZGUtZWZmZWN0cywgYW5kIHJldHVybiB0cnV0aHkgaWZcbiAqIHdlIHNob3VsZCBydW4gYWdhaW5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5jb25zdCAgICAgICAgYXN5bmNEb1doaWxlPShib2R5KT0+e1xuY29uc3QgbG9vcD1hc3luYyhyZXNvbHZlLHJlamVjdCk9PntcbmNvbnN0IGRvQ29udGludWU9YXdhaXQgYm9keSgpO1xuaWYoIWRvQ29udGludWUpe1xuLyogUmVzb2x2ZSB0aGUgb3V0ZXJtb3N0IHByb21pc2UuKi9cbnJlc29sdmUodW5kZWZpbmVkKTtcbnJldHVybjtcbiB9XG5cbi8qIERvIHRoZSBsb29wIGFnYWluLiAgV2UgYXJlIGNhcmVmdWwgbm90IHRvIGF3YWl0IHNvIHRoYXQgd2UgZG9uJ3QgY3JlYXRlIGEqL1xuLyogcHJvbWlzZSBjaGFpbi4qL1xubG9vcChyZXNvbHZlLHJlamVjdCkuY2F0Y2gocmVqZWN0KTtcbiB9O1xuXG5yZXR1cm4gbWFrZVByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+bG9vcChyZXNvbHZlLHJlamVjdCkuY2F0Y2gocmVqZWN0KSk7XG4gfTskaOKAjV9vbmNlLmFzeW5jRG9XaGlsZShhc3luY0RvV2hpbGUpO1xuaGFyZGVuKGFzeW5jRG9XaGlsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNEb1doaWxlIjpbImFzeW5jRG9XaGlsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACWE0KycgEAAHIBAAAiAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvbWFpbi5qc3siaW1wb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vYXN5bmMtdG9vbHMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAAQtSvdgTtAAAE7QAAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAOYpWAjsLAAA7CwAAIwAAAAAAAAAAAAAApIE27QAAQGFnb3JpYy9hc3NlcnQtdjAuNi4wL3NyYy9hc3NlcnQuanNQSwECHgMKAAAAAAAAAAAABbmH7NouAADaLgAAIgAAAAAAAAAAAAAApIGy+AAAQGFnb3JpYy9hc3NlcnQtdjAuNi4wL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABT9YW/RjcAAEY3AAAmAAAAAAAAAAAAAACkgcwnAQBAYWdvcmljL2VydHAtdjAuMTYuMS9zcmMvYW1vdW50TWF0aC5qc1BLAQIeAwoAAAAAAAAAAABKlADt1QUAANUFAAAnAAAAAAAAAAAAAACkgVZfAQBAYWdvcmljL2VydHAtdjAuMTYuMS9zcmMvZGlzcGxheUluZm8uanNQSwECHgMKAAAAAAAAAAAAQzB73OgBAADoAQAAIQAAAAAAAAAAAAAApIFwZQEAQGFnb3JpYy9lcnRwLXYwLjE2LjEvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAADVdwSiYIAAAmCAAACUAAAAAAAAAAAAAAKSBl2cBAEBhZ29yaWMvZXJ0cC12MC4xNi4xL3NyYy9pc3N1ZXJLaXQuanNQSwECHgMKAAAAAAAAAAAAk7H0N40WAACNFgAAMgAAAAAAAAAAAAAApIFyiAEAQGFnb3JpYy9lcnRwLXYwLjE2LjEvc3JjL2xlZ2FjeS1wYXltZW50LWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAgMhu7rMFAACzBQAAOgAAAAAAAAAAAAAApIFPnwEAQGFnb3JpYy9lcnRwLXYwLjE2LjEvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABx52I9xwUAAMcFAAA6AAAAAAAAAAAAAACkgVqlAQBAYWdvcmljL2VydHAtdjAuMTYuMS9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAP/csPsqBgAAKgYAADYAAAAAAAAAAAAAAKSBeasBAEBhZ29yaWMvZXJ0cC12MC4xNi4xL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAmmZgvnwcAAJ8HAAA2AAAAAAAAAAAAAACkgfexAQBAYWdvcmljL2VydHAtdjAuMTYuMS9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAsDioH6UEAAClBAAAIwAAAAAAAAAAAAAApIHquQEAQGFnb3JpYy9lcnRwLXYwLjE2LjEvc3JjL3BheW1lbnQuanNQSwECHgMKAAAAAAAAAAAAD9fo7usxAADrMQAAKQAAAAAAAAAAAAAApIHQvgEAQGFnb3JpYy9lcnRwLXYwLjE2LjEvc3JjL3BheW1lbnRMZWRnZXIuanNQSwECHgMKAAAAAAAAAAAAokVFQsAPAADADwAAIQAAAAAAAAAAAAAApIEC8QEAQGFnb3JpYy9lcnRwLXYwLjE2LjEvc3JjL3B1cnNlLmpzUEsBAh4DCgAAAAAAAAAAAC5JY6kUBgAAFAYAAC0AAAAAAAAAAAAAAKSBAQECAEBhZ29yaWMvZXJ0cC12MC4xNi4xL3NyYy90cmFuc2llbnROb3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAAo7p4+EicAABInAAAmAAAAAAAAAAAAAACkgWAHAgBAYWdvcmljL2VydHAtdjAuMTYuMS9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAAAsz6lRcD8AAHA/AAApAAAAAAAAAAAAAACkgbYuAgBAYWdvcmljL2VydHAtdjAuMTYuMS9zcmMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAABFrthqSi0AAEotAAA0AAAAAAAAAAAAAACkgW1uAgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE1LjAvc3JjL2ZlZURpc3RyaWJ1dG9yLmpzUEsBAh4DCgAAAAAAAAAAAG3bYQpeKAAAXigAACcAAAAAAAAAAAAAAKSBCZwCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4xL3NyYy9jYWxsYmFjay5qc1BLAQIeAwoAAAAAAAAAAACqj91GIgYAACIGAAAlAAAAAAAAAAAAAACkgazEAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMS9zcmMvY29uZmlnLmpzUEsBAh4DCgAAAAAAAAAAABfJM4DIBAAAyAQAACQAAAAAAAAAAAAAAKSBEcsCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4xL3NyYy9kZWJ1Zy5qc1BLAQIeAwoAAAAAAAAAAABuFZifQwIAAEMCAAAkAAAAAAAAAAAAAACkgRvQAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAbco46wkuAAAJLgAALwAAAAAAAAAAAAAApIGg0gIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjEvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNQSwECHgMKAAAAAAAAAAAAafLEQCcPAAAnDwAAKwAAAAAAAAAAAAAApIH2AAMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjEvc3JjL21ldGhvZC10b29scy5qc1BLAQIeAwoAAAAAAAAAAABUOfoRLQIAAC0CAAApAAAAAAAAAAAAAACkgWYQAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMS9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAADexqKMKwcAACsHAAAqAAAAAAAAAAAAAACkgdoSAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMS9zcmMvdXBncmFkZS1hcGkuanNQSwECHgMKAAAAAAAAAAAAoumxkuM8AADjPAAAJAAAAAAAAAAAAAAApIFNGgMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjEvc3JjL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAGfQxYrVEgAA1RIAADMAAAAAAAAAAAAAAKSBclcDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4xL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1BLAQIeAwoAAAAAAAAAAACwvi9PHAcAABwHAAAkAAAAAAAAAAAAAACkgZhqAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA8rAIZVoYAABaGAAAJwAAAAAAAAAAAAAApIH2cQMAQGFnb3JpYy9ub3RpZmllci12MC42LjEvc3JjL25vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAFZ/h0h+OAAAfjgAACoAAAAAAAAAAAAAAKSBlYoDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4xL3NyYy9wdWJsaXNoLWtpdC5qc1BLAQIeAwoAAAAAAAAAAAC+ATAkgwoAAIMKAAAuAAAAAAAAAAAAAACkgVvDAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMS9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAOs+VGqwIgAAsCIAACcAAAAAAAAAAAAAAKSBKs4DAEBhZ29yaWMvbm90aWZpZXItdjAuNi4xL3NyYy9zdG9yZXN1Yi5qc1BLAQIeAwoAAAAAAAAAAAB1YuMobiQAAG4kAAAoAAAAAAAAAAAAAACkgR/xAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMS9zcmMvc3Vic2NyaWJlLmpzUEsBAh4DCgAAAAAAAAAAACeyOyPFCwAAxQsAACkAAAAAAAAAAAAAAKSB0xUEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4xL3NyYy9zdWJzY3JpYmVyLmpzUEsBAh4DCgAAAAAAAAAAACGBFnIMBgAADAYAACQAAAAAAAAAAAAAAKSB3yEEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4xL3NyYy90b3BpYy5qc1BLAQIeAwoAAAAAAAAAAAD4UQ8TPzAAAD8wAAAsAAAAAAAAAAAAAACkgS0oBABAYWdvcmljL25vdGlmaWVyLXYwLjYuMS9zcmMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAAA+Ylw2XAEAAFwBAAAgAAAAAAAAAAAAAACkgbZYBABAYWdvcmljL3N0b3JlLXYwLjkuMS9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAABqgKjv3AsAANwLAAAhAAAAAAAAAAAAAACkgVBaBABAYWdvcmljL3N0b3JlLXYwLjkuMS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA4q+AfUYLAABGCwAALAAAAAAAAAAAAAAApIFrZgQAQGFnb3JpYy9zdG9yZS12MC45LjEvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanNQSwECHgMKAAAAAAAAAAAApoNNtMIGAADCBgAAMAAAAAAAAAAAAAAApIH7cQQAQGFnb3JpYy9zdG9yZS12MC45LjEvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzUEsBAh4DCgAAAAAAAAAAAJoDutcWFgAAFhYAADEAAAAAAAAAAAAAAKSBC3kEAEBhZ29yaWMvc3RvcmUtdjAuOS4xL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAAnQOWIEEPAABBDwAAMQAAAAAAAAAAAAAApIFwjwQAQGFnb3JpYy9zdG9yZS12MC45LjEvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAAZQWnY4xIAAOMSAAA1AAAAAAAAAAAAAACkgQCfBABAYWdvcmljL3N0b3JlLXYwLjkuMS9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABtrD+9hA4AAIQOAAA1AAAAAAAAAAAAAACkgTayBABAYWdvcmljL3N0b3JlLXYwLjkuMS9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAACy12MInRkAAJ0ZAAAuAAAAAAAAAAAAAACkgQ3BBABAYWdvcmljL3N0b3JlLXYwLjkuMS9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAMUArIJYKgAAWCoAACEAAAAAAAAAAAAAAKSB9toEAEBhZ29yaWMvc3RvcmUtdjAuOS4xL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAhmCHYvwEAAL8BAAAcAAAAAAAAAAAAAACkgY0FBQBAYWdvcmljL3RpbWUtdjAuMy4xL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAMBAN+aoIgAAqCIAACMAAAAAAAAAAAAAAKSBhgcFAEBhZ29yaWMvdGltZS12MC4zLjEvc3JjL3RpbWVNYXRoLmpzUEsBAh4DCgAAAAAAAAAAAG6zHqqnBwAApwcAACUAAAAAAAAAAAAAAKSBbyoFAEBhZ29yaWMvdGltZS12MC4zLjEvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAvtREY2MoAABjKAAAKAAAAAAAAAAAAAAApIFZMgUAQGFnb3JpYy92YXQtZGF0YS12MC41LjEvc3JjL2V4by11dGlscy5qc1BLAQIeAwoAAAAAAAAAAAA74z2IkggAAJIIAAAkAAAAAAAAAAAAAACkgQJbBQBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA3vSPIFMoAABTKAAAMAAAAAAAAAAAAAAApIHWYwUAQGFnb3JpYy92YXQtZGF0YS12MC41LjEvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzUEsBAh4DCgAAAAAAAAAAAOWxCczbQwAA20MAACUAAAAAAAAAAAAAAKSBd4wFAEBhZ29yaWMvem9lLXYwLjI2LjEvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAt8K8e+IGAADiBgAAHwAAAAAAAAAAAAAApIGV0AUAQGFnb3JpYy96b25lLXYwLjIuMS9zcmMvaGVhcC5qc1BLAQIeAwoAAAAAAAAAAADY9BkwjwkAAI8JAAAgAAAAAAAAAAAAAACkgbTXBQBAYWdvcmljL3pvbmUtdjAuMi4xL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAB+JG4t0hEAANIRAAAkAAAAAAAAAAAAAACkgYHhBQBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAANwvtTx8CAAAfAgAAKgAAAAAAAAAAAAAApIGV8wUAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yL3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAAKFYIz+PEAAAjxAAAC4AAAAAAAAAAAAAAKSB/PUFAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAAOlKtTRwCAAAcAgAAGQAAAAAAAAAAAAAApIHXBgYAQGVuZG8vZXhvLXYwLjIuMi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADGt+tWYxgAAGMYAAAiAAAAAAAAAAAAAACkgSoJBgBAZW5kby9leG8tdjAuMi4yL3NyYy9leG8tbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAADGwrfJxJgAAcSYAACEAAAAAAAAAAAAAAKSBzSEGAEBlbmRvL2V4by12MC4yLjIvc3JjL2V4by10b29scy5qc1BLAQIeAwoAAAAAAAAAAABBDDOUQAIAAEACAAAeAAAAAAAAAAAAAACkgX1IBgBAZW5kby9mYXItdjAuMi4xOC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAApY8690oHAABKBwAAHQAAAAAAAAAAAAAApIH5SgYAQGVuZG8vbWFyc2hhbC12MC44LjUvaW5kZXguanNQSwECHgMKAAAAAAAAAAAADQgme5QNAACUDQAAKwAAAAAAAAAAAAAApIF+UgYAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1BLAQIeAwoAAAAAAAAAAAA7cs+A5D8AAOQ/AAAqAAAAAAAAAAAAAACkgVtgBgBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlUGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAxFOn8Pw/AAD8PwAAKwAAAAAAAAAAAAAApIGHoAYAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1BLAQIeAwoAAAAAAAAAAACzXvdrxTsAAMU7AAAtAAAAAAAAAAAAAACkgczgBgBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanNQSwECHgMKAAAAAAAAAAAACEKS/awqAACsKgAAKgAAAAAAAAAAAAAApIHcHAcAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL21hcnNoYWwtanVzdGluLmpzUEsBAh4DCgAAAAAAAAAAABPT1RvcBgAA3AYAAC0AAAAAAAAAAAAAAKSB0EcHAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1BLAQIeAwoAAAAAAAAAAAC+nmlK7DIAAOwyAAAjAAAAAAAAAAAAAACkgfdOBwBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvbWFyc2hhbC5qc1BLAQIeAwoAAAAAAAAAAABXRGQKfkAAAH5AAAAlAAAAAAAAAAAAAACkgSSCBwBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAAJgZO7M0AQAANAEAACEAAAAAAAAAAAAAAKSB5cIHAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAlHpu9zwsAAM8LAAAeAAAAAAAAAAAAAACkgVjEBwBAZW5kby9uYXQtdjQuMS4yNy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAZfKMGnwIAAB8CAAAIAAAAAAAAAAAAAAApIFj0AcAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA3ka2qpMHAACTBwAAKAAAAAAAAAAAAAAApIEd2QcAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAACD9dsszwcAAM8HAAApAAAAAAAAAAAAAACkgfbgBwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAADToDhxnREAAJ0RAAAkAAAAAAAAAAAAAACkgQzpBwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvZXJyb3IuanNQSwECHgMKAAAAAAAAAAAASjtmg1UIAABVCAAAKwAAAAAAAAAAAAAApIHr+gcAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABiTWcDThoAAE4aAAAnAAAAAAAAAAAAAACkgYkDCABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvbWFrZS1mYXIuanNQSwECHgMKAAAAAAAAAAAAApF75R0EAAAdBAAAKQAAAAAAAAAAAAAApIEcHggAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL21ha2VUYWdnZWQuanNQSwECHgMKAAAAAAAAAAAAGUAoxvUZAAD1GQAAMAAAAAAAAAAAAAAApIGAIggAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAC5usQ2DGwAAgxsAACoAAAAAAAAAAAAAAKSBwzwIAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9wYXNzU3R5bGVPZi5qc1BLAQIeAwoAAAAAAAAAAAAUsaJ9wyEAAMMhAAAoAAAAAAAAAAAAAACkgY5YCABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcmVtb3RhYmxlLmpzUEsBAh4DCgAAAAAAAAAAADXiToqaDwAAmg8AACsAAAAAAAAAAAAAAKSBl3oIAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9zYWZlLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAxx/VUEcSAABHEgAAJQAAAAAAAAAAAAAApIF6iggAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAAAlvFz7/QcAAP0HAAAlAAAAAAAAAAAAAACkgQSdCABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAHqgfmgSDQAAEg0AACkAAAAAAAAAAAAAAKSBRKUIAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAJgZO7M0AQAANAEAACQAAAAAAAAAAAAAAKSBnbIIAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACwnEJ+4goAAOIKAAAeAAAAAAAAAAAAAACkgRO0CABAZW5kby9wYXR0ZXJucy12MC4yLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAyxcZ4KRGAACkRgAAKgAAAAAAAAAAAAAApIExvwgAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL2NoZWNrS2V5LmpzUEsBAh4DCgAAAAAAAAAAAPfmwlF3GgAAdxoAAC0AAAAAAAAAAAAAAKSBHQYJAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1BLAQIeAwoAAAAAAAAAAABVIML9KhQAACoUAAApAAAAAAAAAAAAAACkgd8gCQBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY29weUJhZy5qc1BLAQIeAwoAAAAAAAAAAAAKHf6/oxAAAKMQAAApAAAAAAAAAAAAAACkgVA1CQBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY29weVNldC5qc1BLAQIeAwoAAAAAAAAAAAALKJ5teSUAAHklAAA1AAAAAAAAAAAAAACkgTpGCQBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAAAi9nVSnigAAJ4oAAA1AAAAAAAAAAAAAACkgQZsCQBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAACJDDsFM8MAADPDAAA1AAAAAAAAAAAAAACkgfeUCQBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAiAAAAAAAAAAAAAACkgX1YCgBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAJYe98fqGgAA6hoAACIAAAAAAAAAAAAAAKSB8VkKAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAClK+n3AJAABwCQAAIgAAAAAAAAAAAAAApIEbdQoAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACIfYGs3wIAAN8CAAArAAAAAAAAAAAAAACkgct+CgBAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAB2nTeu+EgAAvhIAACoAAAAAAAAAAAAAAKSB84EKAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAADTQ7DuaQcAAGkHAAA1AAAAAAAAAAAAAACkgfmUCgBAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAmAAAAAAAAAAAAAACkgbWcCgBAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAMriXk9BgAAPQYAAAdAAAAAAAAAAAAAACkgS2eCgBAZW5kby9zdHJlYW0tdjAuMy4yNS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACLuoeSrQEAAK0BAAAcAAAAAAAAAAAAAACkgVy3CgBqZXNzaWUuanMtdjAuMy4yL3NyYy9tYWluLmpzUEsBAh4DCgAAAAAAAAAAAJ3PE4ldAQAAXQEAAB8AAAAAAAAAAAAAAKSBQ7kKAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL0UuanNQSwECHgMKAAAAAAAAAAAA+LTJv6kDAACpAwAALAAAAAAAAAAAAAAApIHdugoAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanNQSwECHgMKAAAAAAAAAAAAl9dU7dABAADQAQAAIgAAAAAAAAAAAAAApIHQvgoAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAABvm3ti4wgAAOMIAAAkAAAAAAAAAAAAAACkgeDACgBqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAtCz1mP4EAAD+BAAAKQAAAAAAAAAAAAAApIEFygoAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAlhNCsnIBAAByAQAAIgAAAAAAAAAAAAAApIFKzwoAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvbWFpbi5qc1BLBQYAAAAAcQBxAOslAAD80AoAAAA=","endoZipBase64Sha512":"700711788ab4fdc366c327ae73c40aaa1be414782f330cd24449be03ade58400526da1c6d8cde4aefb05fb381f84b91ceec228ad6c1c77245a9da0c7c1c1c1e6"};
|
|
1
|
+
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAABbuV7yBO0AAATtAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMCIsCiAgICAibW9kdWxlIjogIi4vc3JjL2ZlZURpc3RyaWJ1dG9yLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Fzc2VydC12MC42LjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYXNzZXJ0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Fzc2VydC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXNzZXJ0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWE2NDc1OTNlOWZjZGM3NTEwOTIxMGUyNjZiOGU3YTljMGU5OWQwMTM2ZjczYjk5MmExNWM0NmE5ZTg3ZDAxYzljZDZmMGEyZjhhZTVhODBjNGJiYjVlYjBjYWYzNWY0MmMwNDI4ZTljY2YyMjk4NTNkMzVjMGU5NGUyYjMyMzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTEyMWQxNWRjYjEwZjg1Zjc3YjQwZDQ4ZWU4N2Q1ZDVkNzZmOWQ0OTAyZTBlOGM3ZDg4YzMxN2MwYjJmZTNhMmIwZGVlZmZhNzg3NjI5NDExOGZkZjY1MWFlNGZhYzg3MzkxNzU2OTE3MjdkYzc0OTIzNGMxNDQ1Mjg1YTg0NWEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZXJ0cC12MC4xNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2VydHAiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hbW91bnRNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hbW91bnRNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDI1ZGE2MDA5NWJjYWIyYThmNmYzNWU0NGU4Y2EzZjJmMWRlM2JkZGJkNDJhYmEwZDgyZjU4ODAwNDYzOGRmYWE2YjI0MTc5NWY1OWYwY2Y2MTQ5ZGMyMmFmYzhiMmNlNTdmNTY2MDI4MDc2NjdiNDg3OWMyYzdhNGY1NWI2MmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGlzcGxheUluZm8uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Rpc3BsYXlJbmZvLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODdmZDM2YTY0MjkxZGJjM2IyYmQ5NDkzMzBkODM5Nzk2MzRjNjE1YzhiOTBkZWE0ZWQ2M2ZjNGVmYjc2ZjI2MjhiN2U3Mjc3OGFhM2U3NDcxNDU0MTg5YTgzMzViZTJmYjJmMjRkMTk4MWQ1NDA3YzFjNTI4ZWFiYzZhYmYwMmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzNhODE0Mzc4ZjQxZTFiOGU2YmM1NjdkM2JmZDRiNGE3OGU4N2U0N2JhN2Y1MTllOTU4MDIxZWE3ZjBhMTJhZTlhYzlmNzY2YjQ3MDUyOGQ0OTg4YTc2ODgxOGYwYmFiMWExNGFjMDE1MTkwZDU0MzFjOGU1NWMxZjMzYzVjY2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXNzdWVyS2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pc3N1ZXJLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZTg5MmJmMmE1MzhmMmQ1ZmI1ZDJmMGEyYTY2OWY5NGZhZjE2ZmVlNjdiNGRkMGFlMWMyMjNjOWZjNzZlOWJmMTZmZTc3Njk4NzZlZDYyOWJkMWVhYmQ0ZGQyMmJiZDdhN2M4ZjQ4NTVjNzcyMmEzZDU0ZjlmNzMxODc2ZGJmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTQ0ZDYwNTg1MWY1ZmJiMDg0NjUwOTA4MTJiMWM3OWVkZjUxMGRiYjcwNzI2NDgxMDNmZDQyZDI2ODgwZmU5ZmY5NmJiYWE5ODhjZmNiNGE5NGYyZGE0OWI5Njk3NjJkZGQwOTExNDgxZDU5MDhjMDhlMjA1MjNlNmY5ZmNjMjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlOGJlOGRjMzYxNGRiZTM1N2EzOGFlZjNlODc1YTFjZjQ3MzE0OGU0OWIzNzE4ZjgwZDg2NzVjZjNmN2FmN2QwNzIzOWExYTcwODRkZTZhN2Q2NjQxMjNjNjFiOTYyNTg5NmQzMzc5MTQxNGFiNGQwNTBiNmQ3NmUwZTgxYjM3NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImExMTM2MWM4ODNjZGI4MDJjOWUxOTRiY2FhMTViNTVlY2I5NDdmNDVhZDIyNDA0ZjNjOTljY2NjNDZmZGMwMDZkYjhiNmQxNmY5Zjg5M2RiZmZhM2EyMzhkZDA4YzA5MmI5OWI4OGQwMzM1ZGViNWQxYTQ0ZTdkN2Q1MjRkOTZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU5MmU2MDcxM2U4NTVkNjA0NDFmOGE0ODdhMTU4OWY3Y2U5OTViNzkyZDliOTc0NzFlMGMxOWY0ZTYyZmE2NTIyMjk5NGQwYzE5MmE5OGY5ODJkNDQwZDA2OTMzMzgyZmM0YzQ3YTYxNGRkNTNjNzI1NGE0YTYxN2Q4NjliZjMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY2NDhiZDQ2ZGY5OWNkODBhMGYwMTIxZmRkNDhiYjg3ZWQ5NjI2OTM2MDhmYjFhM2E0YTZjMDk0YjU3MjlhMGQ5NmY0MGYwZjIxYmQ3NDYxNmU5MmE0MWZjN2NjNWUxMTVlMjcxZGIxZGY3N2E2NGI0Y2EyNTFiMjQ5YjVkMWRiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZmQ3Zjk5YjhiZWNhNjkzMmY3YzM3YjZhNTQyOGYxNTdkMTRiMzY3M2Y1YjE4OTUzY2RiMzg1NzlhOGNkNDYxMTk5NzU5N2RiMjMzYTNjMGRhNGIwMmFlMmFhMDJiNDdiZTkzMzdkM2YzYmM5MjI4NGFhNmRlZThmNjE2OTViNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50TGVkZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50TGVkZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjkyYzRiNTM2NjkwOWFlMWEyZWYyOTgxYjZmYjAzOTI3NzIwZGJiZDFhMzJlMTAzN2EwYmNmZWE0OWIzMDkyODUxMTFmMTBkYjEyMDFiMDhmZDNhYjc1ZjkwMzRkODk5YzhmYWNhZGMwN2YwZjVhNDc2NmRiZTEzODE0MGZiYTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVyc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1cnNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2Q3ZGRhNmE4NDE4MGM2OGU2ZDA5NzJhNjhkYzhkZWJiNTE1YjkyY2U4MGMyMTg4MTZlNTMxZjI0ZGE2NDhmNTU1ZjZmNmMyZGJiODIwMGU5NDM1OWFkNjFjMDQ2MDI2OWE0ZDRjMDY1YTkwNWRhOTRlMDU3ZDNhZjU2MjVlMjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTExYjJhNmYyOWFkNDk2YmJhZDBjNTk4ODJkZGM0OTBmM2ViZWM5NjA2YjUxZTBiNzBiZTU1ODUxMTJkMzJlNDllZGFiOGVjN2FhNTdmZjJiZDdlNDYzZjU4N2ZlNjRjMDZhYzhkNWM4NjEwMjFkYjc1ZGMwMzhjM2U0NGU1NTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU4ZTZiMjA1Yzk5MGQyNzAzZTZhMTg0YzFhM2RmMDFlOGY0ZWVhOTkyN2JlYjEyMDIxYWI2ZDBlMTgzNTA4NzU1OTZmNTgyOGI0MGUzNzRiNTFmNWNmN2VlNjI1OTFkYmQyNWMxYjQ2OWI3ZDU4YzkxMTU4ODhhM2VhNWNkNDAyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWFtYmllbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MDIxZjU0YjlhZmMwMjVjYTBlOTBkMmRjMmUwYmVkMmZiMDhiMDYzYzZkNjhhNDRiMWVjMmViNzgzOTA3Njk2YzJlNGIzY2Q4MDU2MDUxZGMxMzE4ZDZiNDVhYzU3MzEyYWY3ZjNmOWQ4NDQyYjJiZWY0MDI3NmFjZjYyNDRjMSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cC9zcmMvbGVnYWN5LXBheW1lbnQtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xlZ2FjeS1wYXltZW50LWhlbHBlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9nb3Zlcm5hbmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zdWJzY3JpYmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdHMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXRzLXYwLjE1LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy96b2VTZXJ2aWNlL3pvZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12My4xLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgImFnb3JpYyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhZ29yaWMtdjAuMjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWluLmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ZlZURpc3RyaWJ1dG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mZWVEaXN0cmlidXRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0NGYyZjc3NzRjYjg0MDEyMjY3N2NiNWJmNTYwOGE3NjkwMDc0ODFiNzk3ZTc0YmJhNmNhZmI1NGU4NGVjOWNiOTc4ZjIwNmNkNzQzNjRjMWYyNTAzMDBlNTFmOGYyOTk5M2E5NDE0ZjA5NDlhZTFhYmYzODE1MmZkMzkwNjFiIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9pbnRlcm5hbCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kdXJhYmxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9oZWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2hlYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL3ZpcnR1YWwuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdmlydHVhbC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdHJlYW0iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RyZWFtLXYwLjMuMjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0cmVhbS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RyZWFtLXYwLjMuMjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJhbnlsb2dnZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYW55bG9nZ2VyLXYwLjIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2FueWxvZ2dlci5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2FsbGJhY2suanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NhbGxiYWNrLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTBmYzA5MjA3N2ViOWQxNGNhZjVmZDQ1MzFiODA0NDcyN2JkYWE2NTU0YzRkMmZjYThmNzZmOWIyZGJhMmRkNGJhMzkwOWM1MTczOWY0MGZiOTAyOTg5ZmRjYTBiNWRlNjUyZDk2YmQyZjhiNzdjZTUwNThhOGQwMjViOGVjOGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29uZmlnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb25maWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YTMxOGUxMzc5YmU3YTg4NzJkZDhkYTllN2ZhYTBkNzkyMDViNWM4OTljNTQxMGZiOTBhNGJjODk1Yjc1ODU1Y2M3MmE3YTlmZGUzNWRhMGEwNzVkMDZjYTc3YTVmMDBkYzhiNmJiNDAwOWNlM2YxOTQzZDliZGNjY2JiY2Q1MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVidWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMDAxZWFjYTRiM2IyNDQ3OTZhZjcxYWQ0OTkxZWIwOWY5MDBkYThhZDQ2ODA0YzIyYjA4MWE4NjE5NGU0NjFiMTUxMjQ1NWVmMjNhNWZhYjEyZTM3ZmQ2MzlmNTA3ZjE5MjU2YjhjZTEwNTNmZGNkODcwOWUyMmFmZjYzYWFmMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YTEyZTNiODc5ZmIzOTQ1NDM4ZDgyNzEzYTk1YmQ3NzEyOTc0OGQ3MGY5NjFkMTVlZWRjYjJhNGM0NThmY2ZiYmI5YzcwOWU1MDFjZTc3ZWIzMzUyYjZjODdiM2JjYzcxYjA2NWFlYmVlNzAyMWI4NjQ2NDE0NGY2ODExNGJlYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODY3M2UzOWIwZWRlNTI3MjhiOWYyNTUxNTAyMmJiOWRjYjkwY2QyM2VjMDUyM2I3YjA5MjkxOTNiYTkxYzE2ZjEyMzcxZmRhZmEyNjYwMDkzYjAwZTNjOGY1ZjhiMTRkYjM4ZTJlMjU1MjUyZmUxMjc0MGMwM2JjMjU0MmU2ZmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWV0aG9kLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXRob2QtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MzY0Mzc5YWNlMjY1MmQ5MGJlZjRhY2QwOTNkOWUxYWIyM2I1MDE3NmQ5ZWQ3MDVhZGJiZmY4YTAyNTgyYTljYzgxNWExOTk1M2RlN2Y2YjZmYWZhODJiMzY0OTY2Y2ZlNDhlNTI4YWEwZjU0NGE4ZmI4ZTU0NzFkMDQ4ZjM5MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDA0N2IwZDk1ZjU5ZWUzYjZmMTA0MTc4Y2Y3M2ZjYjZjYzdiNTJiYzUzMTIxYTE4ODMxNTVkMTRmY2MzNjdjNTA1YTk2YjgyODNjN2ZiYTE3MDJkYzNmMmNmM2IzZTc4YzY1MjUwMmQ3OWFlM2Y0NjU2ODZjMmM5MjhiZWVkNjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3VwZ3JhZGUtYXBpLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjAxZWIzM2Q3MjRlMTdmMGEwYmI0Zjc3YWYxNzMzMmFlNWU2YjljOGFlZjg4NzJlMmEzZGYxYWJlZWQyMDU4NDgyMjE5MmUxNmQ5YzQ3YmQwOGY3ZmRjMmQxNTUwNzZkYzM1YWMwNDgzMDYwOTE0ZmU2YTA4MDJhYWM0ZWQ0YzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3V0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2IxMTRiYmUzYTQ5YjM5ZDhmNWQ0NmZiNjA1NWUzOWMxYWQwMTI5OGI3NGRiODRjMzlmZDE5MDBlY2M0OTVlOTU2OGIwYTQ5MDg2ODQ2MDVhYjBmZDlmODJiOTQ3ZTdmMzE0MWE4Njk5NWI0NmU2ZTI5ZmIzNTA4ODAyNDQxYmIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL25vdGlmaWVyIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy91cGdyYWRlLWFwaS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3N1YnNjcmliZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nLXN0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmctc3RvcmUtdjAuOS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvc3dpbmdTdG9yZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgwOWNiZWVjYjJiZGExN2Q1ZjVkZTVkNzg0NmIwMmU1YTIzZDdmNTRiOTAzZDQ4YTEwNGViMjYzZmNmMzUyOTlhY2VhNGEzZWIxZDU3Yzc1MGJkM2Y0ZmZhZjkyYmE5MjA3MGM1ZmJhNTI2ZmJkNDExNWIwYTk5ZDVkMGRlYTQ4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1Y2NhNGNjNjQ1Y2VlMTRlMTJhNDVmNjg4YTI3NTBmMjNjMmI4MTE0MDliZTdmMzY5ZmYwN2YxN2I5ZGEwMjM2NGE4ZTczZTBjMThhZDM0MzFjN2UwYzFhZTA5Zjk5ZGM4NDdkYjMyNWFmYmEwNjJiNjVlYTZlZGEwMjJhZTI1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZmNTY2YzZmMjAwN2YzZjc5MTMyNjE2MWNiZDIwNDE5NmI0NTkxZWVmMDk1Mjk2NDJhZjg0ZGYwYTNkYmQ3ZjczYzBmZDRlYjE2NmZhNGI3ZDk2NDRmN2VmMWQ2NzhmNzljZTkyN2VmNDU2Y2E3MDExNTdmMmExNTIyNjczYzMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFlNTJmODhlYTU0M2MxYTkyMmQxZjcxM2Y5NDcwMTQ4NzM0ZTkxMDg4YWQ1YjBmZWZhNmYxYmYyYTMxYjg3ZTQzYjUzMzk4NDQ5MDJhZTJkMWRiMjU0MmI2Yjc4MDk2ZmI2OTZlZmE0NjQ2ZGMwY2YxMDNkMjgwZGJjOWI1YWUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlZC1ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVkLW5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTUxYzVlYWJjZTE3YjM3YTc0OGExYTUwMjA4NmFlYTBkNWE0MGY0M2FkODExYzM3YjczMGQwMDRjMDZjMDdhMzFhYzdkNTg3Yzk5NmI3Nzk1YjY2MjdlMTM5NDU2YjNlMGQ2YWMyYjUwMzc1NDQwOTM4NmIzNmMxNjliNTM0YzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlc3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2M1NDA5Yjc1M2RlNjdjODU5NzkzNWZmZjQwYmJhZjRiNmI0NzgwNmZlZGI3ZWZkNWE0OWM4ZjJiZjA5YTllZjNhMTVjMWU3NjM3ZDFiM2VmNTI4Yzg5ZGQxMDA2ZDczZmViOGNkMTU1MmQyMTAxNTc2ZjkyMmNkZmEzN2JhMTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxZmY4Nzk0NmQzMTViM2E3NmVjMDcxZWYzZmY0ODEzYWJmODNmNzE0NDUxMjRkODI4OGEzMGZlZGVjMzE2NzBjNjZkY2UwZjUzYTY3OTA1YWMzZDQ3OWE4YjIwNzkxZDhiNjlhYzkyMjEyMjEyZmM1ODUwODNiNDVhOGUwMWNkNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTYxOGZjNmY1ZTcxZTVlMWI3ZjA2NDUxOWU4YzVlNzk2NTBjNmRkZjU2MjkyN2EyNmEyZWY3NDVmNTRhNTYxZTczMzdhNTM2OTA2YzQwMWZmMjZhMjI2ZGJlMDA0NmFiM2Q2YTdmNjJkNjkzNTg4NTY1NDdiMWM3NWZjM2E0MmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdG9waWMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RvcGljLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTdhMGUwNGE0YWVmMzIyNTZkMjE4Yjg0YjI1MmRmODIxZDAyNWI5MGJhMWUzNzQ1NTdlNjM1OWJlYzBlMzIxNTAzODAzOGFmOWZkZjA2MTAxMTBiNzU4ODllODE0ZjdmYzBlNWMwODJkNTc4ZjQyNDMzMWUyNDYxZmU2Zjc3NDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtYW1iaWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZlMTdiOWRiNjczYzRhMTNmM2U3ZWY5YTBjYmNlZjE3OTI3ZjE2ZTE5M2M0MzgwOWM4YzZiYmFmNGI1NWU2ZDkwMTYwZDMyMmZjNzU5ZTk2NTA0NDVlOTM3NzIzYjE0ZWFkYTI5ZGI2MTczZDJiZGQ1YWZiOWEzNWMzOWY0NjNlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3N0b3JlLXYwLjkuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9zdG9yZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saWIvZXNtL2F2YS1mYXN0LWNoZWNrLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYWE0NjBiYmE3NjQ0NDNkNWNhZmIzM2Y1MjI3OTNiYmUyOWU4ZDI0ZjJjNWU3N2M3YjZhMWVjMDQxNTBhZjgwMGM3YmYxYzA1ZmU1MDQ1MGRmZDI5OGNjZDkyYTc5ODYwMWIxYjQ4YTJmYzQ0YTlmOWJkYmI2OGUwOTBjZWEyNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMTU4M2Y2NDc2YjIwN2I4MmExOTQ1NDY3MWY0OTZlZDEyNzBjN2RhZDExMjAxODIxMmZkOWExYTU5MjJiNTkxZmU1YTVhNGUyYWZkZWIzYjUxOTdmZTQwODIwZDk4MmY5YTlhMDVmNDQyMzBhNWUzZjVhOTVkYjAyMTQ2OThhMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2E2NGZhYjlhZGFhNTUxODE4OGI4M2I2ZTRiZTIxMGJjZDk1NzBiODgxZTdhYWJkNjc5Y2I5N2RhZjc3YWM4ZjkzNzBhNDE0MDE4ODBkOGU5MjMwODNkZGRhMzBiNzViZmM0NDNmNmQxMTA5NDZhNWI3MTkyZDQxMDY3NTc0NDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWNjOWJiNmZhZjJjMjhjMTI2NDc5ZDQ3MWQ1MDdlODZlMGEyMGY3ODliMGNmOTM1YzJmMzQ0YmRkN2UxODAwN2Y5YmNjNjM1YjdlMTIzMjQ1Y2NhYTRlNWRjZDM5YWQyZjIwMjBmYzY0NDliM2JhM2U5ZGQwZGQxY2FlOWZiZjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMThkMDJiNGVjZmRhOTMxMTdjZTlhZTNmNTdjYWE3N2ViMmJhZmUzYTczZmQwZjY4MTJmNmVhZDJmMjU4ZGU3ZGY1MDMwODE5ZTc5ODE3OWUwYzVjZmJkMDFjYjEwNDkxNzIxZjk1MWE3ZTJhZWYwM2I2ZmIyYTg4MzM4Zjk3ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYzOTlhYWY2NjU1OThkNGFmZGM3Y2FhOWU1NjRiZWE4M2FjMzgxZjM5MDU3MDc4YjNkYTZhMTJmZmVhZTFkNTUxY2Y3YzJjZmExMWMzNjliNzFjNzY4Y2E5N2ZlMDY5ODQ2Y2UxOGI5YjcxODc2ZDdmMDVjMGJhNzUwMTdlYWNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZDRhOTNjYmJkNzRhMTFhYzU1MzU0ZmFkYzRmZTQyMWQ3YWQ5YTQzMzgwYmJjMTRlYmVjOGEyZDI5NWYyYjBkMDlmZDQyZmVjMWY1MzlmZmVjYjE5MWQ5YWU5OTRkNzg0ZjFhOTAxYTNmMzIxZTM5OTQ0ZWVhMThiZTU3ZmY1ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU5YTBlZGZkNTEyMTczOGMzZTVlNDk3YmQ5N2Q2M2JhN2Y0ZTY2MGFlNDQ3NDY2OWY2N2Y1ZTk1OGNhNGY3YTA4ZDQxMWExNzkwZDg4NjQ4OTBlN2NhNTI1OThlMTQ3NmUzOGQ3MzcwMWI0OGM5MDZmODIzMjRlYzdlNGY4MjIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZmUxNmE2ZDgxMjhiNTBhMjhiMzljZGY5NmE4N2QxYjIxMmE2YmJmMDZmNzUyMDJmNjhkNWU1YThjMDkyYjBhMmZmNWZjNGNmODYyMzlkMTQ0ZGUxNDQ0NWRmZTllOGQ1NjA2OGQ5Y2Q2ZGU1MGM1ZDc3YjMxZTQ5OTU3ZDNjNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMDgxZDg0NDY5ODQyYTU2NzI5YTU1ZWViNTQxMmM3ZjJmZmM1Y2I2MmUzN2YwZDMzNWM1MTM2ZWE4ZDc5Yjg3OTgyNjAwMGRhNGViYzBiY2Y3YjdiNTM3YTc3NDgyYTFlNTA0OWYwNTU3ZTQ2NDEwOGNmZDc1MzFhYTZhNDQ0MyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy90aW1lLXYwLjMuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy90aW1lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1ZGZkNGVhYjcyYTZjOGE4N2ViNzg2M2U3ZDE2ZmRhMTA3OGQwODhlNDhlZDU1MmJiZTdjYWJjNWNlZDk4Yzk2NWI4MjBkZjQ3ODcyODU5NzQ1YWY3MzQ4NGQxZDhiMjE1MzVjNmZmMWZjNGI1ZTc1NGU2NjEwZDNkMWYzNzQ2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RpbWVNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90aW1lTWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZiMjFjOGY5OTNhODk3ZjQ3OWU4ODJlMzU0MDgwNGI5OGU5MTJkMzY5YTg2N2NjOTA0NzM2NzgwOTI3MWRjMTc5MTJjMWE4ZDc2NjRiMWE5ODM2MzcwYzY3ZTdiZmE0YTU5ZWY0YWYwMTk2N2Y1MzA0M2U5NDVkYTU5ZDlhMWQwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNzIyNDE3M2I2ZDUxZmQyOWU5OGQzZWVmY2NiOTQwNTI0NzEzNTg3YWI4ODQyNTI5OGE5MmEwYzRiMWFmNzA1ZWJhNGZhMTkyOWEzYzdmMGIxNGQ4ZjZjM2ExMzg3ZTg3ZjI2MmVmMjk5MzY4OTk5NjFkMzU4NjQ1ZjFkOGZhOCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdmF0LWRhdGEiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGYyOWMwZmQ3ODEwYzM3YzljY2Y0MDg2N2EwMTk5NWU1NmJjNzM4MmY0Njk1NjliNDhhNTk1ZWU2NTc2N2RlN2M3NDBhYjdhZTllMzMwZTA5NGM0MzVhYWRiODI4OGUwYTVmMDhjOTZkZjQ2ZmRjN2QzNjlmMjAyNTQ5YWUwMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDA3YzUzY2VhMmRlNzE1ZTE5NmM2YmZjNzMzM2VhZmU4ZGFlN2Y4YjcyZjY3NTM1MjMzOTFlYzhkNTc2NzYzMjU5NjEwNjk2NTFjMzczYzM2NGUyNjNjZmYyYjE1MDI0MGYwM2ZkMjBkNmQwMzhkNjc1ZThmYWRmOWJkYWZlYjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzZlMWM4ZWE4Y2FhZGZlOTA0NDNkZDVmM2UwYzczZTJmZGNjODkxNDQ4MGQ5MTJhM2ZlMWVjOWJkZjYwYWJjNjRjNjM0ZmFhZjhmMzNlMGRhNzk3NzZlZTEzZTkzM2RkOWZhOTRmMzc1Y2RkZTBhZDc5OWE1ZjgwYmNmMjNkOGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvem9lLXYwLjI2LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvem9lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy96b2VTZXJ2aWNlL3pvZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9jYWNoZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vY2FjaGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12My4xLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDljYmY2NGYxZjA5ZWVlODIyNTY2MGI3ODMzNzY3ZTg3NTk2ZGRiMjExZGQxN2I5ZmU5MmQ3YWEwZjcwYTMyZmU0NGNiODljNzJhM2ZjNTkwYTMxYWFiNGI3MjZlNmI0YmE2NTZjMWI3ZDIzNWY0MmZjZTkwOTAwNzI4MGFhNTciCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvem9uZS12MC4yLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvem9uZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2hlYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvdmlydHVhbC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi92aXJ0dWFsLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YmUwMDFiZDZjZDI2MzVlNmFmZmU1N2M0Yjk3MzA1ODUyOGUzM2Q1ZjljMGNmYjI1YWI0Mzg0MzQ2ODYwNDQ3OTM3N2YzNmYyZGE2ZDE2NDc5Y2IxN2QzZjFjMjc4OTBjZGVjMTUzNGY1YWVhOTcyNzJlOWMyY2E5NzFhZDIwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NmZjYTA2ZWFmOWE0MjY0OTQ4YWM0MjNiYTBmYWY5OGFjYmY1NDU0MDIyNzM3OTYzNDhkZDQ3ZTNjMDJkYzQwNTc2NWViYTA3NTE5Mjc1Zjg5NDY1OTExM2JmYTE4ZTAzOWIwMTQzZTdmNDViZTM5MjI0MTIxODJlOGYzOTg1YiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNTM2ODQ4MjZjYjU2NjA5ZjYyYjdkNmI0ZGUzM2RhZDIyYzIwYWRhYTJlYjM4ODAwYzM2NGNlYzUwOTczODNlOTczZjA1OGIzMzVkNGU0YzQ4MDMwZTQyOGY3Yjk4ZGRhMmJmMjI4OGRiYTMwMDhhY2I1N2I0YWU3MjIwNjRjYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uby1zaGltLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uby1zaGltLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmUyODIwMmNlYjIzZTA2NGQ1ZGNjYmUwMjFhZTdkMWE1ZmRjY2MwMjM0MjcwZGM1NjI0ZmQ5MWRmMjM2ZjkwN2RjYzVkMjU0MzI2ZDFjZDMyYWM1MTE3NjAyZDJmYTIzOWU2ZjMyMDMzMjgyZmQ2N2UyNGYxYTdhNGRlOTU2MzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhY2stdHVybnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYWNrLXR1cm5zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDc5ZDNhMjllYjdiZjNiYThhMzlmMmY4YWVmODUwYThhOWNmZTEwZjk1NzIzZDI3MWQ0NGUyMTIyYTJlOGQyZGU0OTQyNmMxYzRkNDhjYTU5YzhiYTZmZjBkZjkyOTk1NTI4ZDM0OWVlZmUxZDBkNTAzYmRmYTgxZjg0ZmVlNmUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V4by12MC4yLjIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V4byIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9leG8tdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2IxOWMwZDc0Y2M1MDg4MjdiMGM5OGMzNDViZDU3NzU1MGU1ZWEyMTBhOTUxNTM3MDgyZDM5MDZkYmRiN2IwZjI4M2FjNzZiNzUxNDhmMjRkYzhmMjcyM2IyYjU0ODc2ODg4MGJlYmNiY2NiZjgyMGQwNjVhYzAxNWUzMTJmYzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLW1ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLW1ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFiNmRmMTdjZWM3MDYyMzdiODZlZmJlMGYzYTNiOWVjOGZlNTE2YzVlMDUxNjA3YjgxOWFlY2IyZTYwZDMyNzUzMDMzNWNlOTFmYWI3NzhmZjFmNTE0NWYwZGM3ODNjOGU2Mjc3YmU2NmVlODdiNmU2YjUwMDRhZTVmOGZjZmI1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODY2YmRjM2ViMzVlMGJkMTk4NzIzZDRhNTY5MDI0NjgyNmY0ZjBkNjhjMGQ3YzU0OGY0OTM4YWQzYzk1YjRjYmY4YjkxODMyNmE4NGJiMDBiNGIwNDgzZDc4NTQ2ZjY3NjBmYjM0YjZlNDc1ZWQyZWVjODA5Njg1MzJiNmRmM2IiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Zhci12MC4yLjE4IjogewogICAgICAibmFtZSI6ICJAZW5kby9mYXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjg3NDk3ZTNiZjY4YzUyNzlmMzZkNDBlMjhlNGE3NDM5NzE1ODQwMzFmNjQwZWU0OTcyZDkyNTVhMjllOTFiYWQxOGZkNDY5OWM0YmRjYjNiMzY4MmMxOTY1ZDc2YzI5OWQ0N2ZiNTgyZDI2MjhiZmZjNGZjYjdjMGYzZDZmMWMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjAuOC41IjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmVjMmY3NmJmZWUzN2Y0NGE4ZDNhZjI3YjI3ODY2YTdkMzNmNzg2OWVhODcyODVlNGZjZmYxYzNkMDc2NGMxYmMzYTVkYzE3NTMxYzcxZDMzZTFlYzY0Yjc1OTYwY2JhZjdmZWVlMDRiN2Q1Y2YzMDViYjgwNGQzMDVhNzgwYTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MzVhNjk2MmQ3MmQ5ZDI0MDUxYjk3NDk5MzIzMjcxOWVmNmQ5NjQ4YmFlZjM4MzIyYTYzNTg3MDExOGQ2ODJhM2M5NjYyYjEwMjA1NzVlMzhhYmFkMDZjZDU0M2NjMjFmZjEyZGVlNTFmYWEyNDdhNjM0OTZhN2Q3NzI4YzI3MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YTAyZWMxYjFiMTNlYzhlMWU3YmQ3NWZmMDdhMDNkZWVlNTE4OGZjZDYyMDFlNGI1YTBjYzRmYTRiNjE1NTNlZDBlMmI4MjRiOTEzMmM1ZWQ5ZmQ3MDkwMGJhYjE2ZmQzYzE0YTQ3MWIwMDNjMjVjZTI2MWFmNDIwMzMxYWU0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlhOGRkMmEyZmY4YWIwNWQ4MTI1ODk3ZjE3MmFhMGE5ZmE0Mjk2ZGFmODI5ZjQ2ODI2N2I1OTNkNDVhODZjMGU0Nzg4MjRkZDBhYmY1NWRmMThkODBmMTc5MDMyNjQ4NmE1M2M1MDBjZmQ3NTk3ZmQ3YmIzZmZjNTgwZjU0N2Y5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiMjMzYTVjNTYyMjIxMjRhYWI1ZGU0OWUyMWY3NmQ2N2I2ZTNjZjFkZTBmMjQ1ZjIxYjg2YmZiNDM2YzAyMGY1MGMwY2M1OTBhOTZhMGRiYWE5M2U2ZDM5NDM5NTU4MWZlNzY5MTQ5MDAzNDc1NDc1ODgyZTIyM2E2NzAzNDVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJiODJkNTk1ZDJhZmQ1ZDljMDJjNWNiZTAyZTdmN2M5NjA4N2M2MGNkMDkwOTFiOTk3ODJiZDhhN2MxMjZiMjM5MjYyZTk4ZDBmNDYwYTQ4OTgxYjVjZjM1MTFiN2I3OGNkMGYwMDFiMmZhMGU1ZTkzODE0MzVkYTE2ZGIxNjdjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZkNjMyZDY0Zjc2MzlkYjI3OTAwNzZmN2Y1OTMxYjQ1Y2NlMmQ4NDM4N2NkYTJjNzhjOTFhNDIyOWY4MTYzNDQxNzZiYjQ3MDA4ZTE5NzcwNGY2YjdkYWFmZDI3NDNkZWI0NWFkMDZjNWJjNmI4OGMwMzhkZjBlNmRmYmEyN2YzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMjYxNDcwNzE0ZDY1ZDMzY2U2YzhkZmQ5ZGI0Y2NiZmNhNGJjODhiMzE5OTliZjAxOTdiOTViZDAyNzNmY2FlYzM5YzRlODY2NjlmOTc3MGJhNzEyYjBiNWI2Y2QyMzIzZDViYzRiYTJmNTBjN2JlMWQ1NzM3ZmU5YTQ3ZjYwMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVmMDg2YTYwY2QwZjM5ZDcyNjBiODdmOWJhMjAwMDcyYjE5ZmFjYzc0YmNjMGE2Mjc2Y2QwYjEwZmEzOWQ5MWM5ZmU3ZTM3OThjNzgwMDhhMGZhMWIyN2NlYzQ1NjIzZTVhMmFhZTgxYzU0NTYwMzBkZDE0NzViODk1MWYxMmI0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4YTg1MWJkYmYyZjRkZDA5YTEzYjUyMTEzMGUyOTlmOWQxOTU1YWUxOTI5MTYyN2NkMjhkZjRmYjVkNDg3OGVjZGY3Y2UyYjIyYTU2NzBiNDM5N2JmNDkwYjgwZDg5ODI0ODFkYjVjZWIyMjRiMTBhZmRlZmU1YzQ0NTA2MjY1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjQuMS4yNyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MjUwODJmNGM4Y2E2YWE3ZWNmYWI5MGFjMTE2NWFmZDU4YzcwMGMwNWZiNDZjMzgwYThlYTQyN2QwY2I3YzAyYWRiMTMzNjM1MGI3MzQ0ZjY5MjU2MWMyYTk4ZmEyN2ZkZGQxOTRjM2E2MTM1NWZmZDgyYjRmNzM3ZWJhOTQ5OSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Bhc3Mtc3R5bGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGliL2VzbS9hdmEtZmFzdC1jaGVjay5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzZiNzMyMDNiM2FjMWU3NjAxMDg3MmYxNjY0NTdkNTU1MzI4ZjQ1OWNmNTBhNTcyZmZhMDEwNDFlYzA5MzNhN2Y1NzkxNzBhY2UwYjZlNzZhZjc5MmUxMmJiYmUxYWY1NWJkNmQyYzY4YzRlZjExYjQwZGRhOTRlZmRjNjFiNzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5QXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMzhiYjYwZjc4NTRiNGE3YjYxYTFmZDMzYjI0YTdlOWQwNThkYTc5MGU2ZjBhMjk2NDQzZjcwOWYyMDZmZWY3MzE1MGI3ZTJkZWQ3OTljNjM5YjU4ODQ4ZGM0NWE0ZjNmY2FhOTlhMGYxZTcyNWEyYWQ5YTQzZGNlNjkwODM5MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTRiODEyNWQwOWQ3M2IwMjVjODM5ZjYyNTFkY2MwNmE1M2RjZDI1YWU5MThjOTczZTM2MDE2MTE2MzA4YTQ4YzE4MzBhZDMzODczZDliOGVlZTA2YWQ1MGI4MjlkNDUwMzZlOGM0ODYwMzYzOWUyYTU0ODJlZTJiYTljZGQzMGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzRlNjI3MjdjY2E4Y2YzYzJiNWEzYTc4YTViMjc5ZjM2NzkzYTM4ZDM2NzE4MTUyYWNhNWIxZTE4NjY2NWIzMDYzOGRkMTI0YTFiYjhjYzk0NGMxMTFhNzEyNjg2YjQ0ZDBmN2NhYWI0ZjJmNWYwMjczYTA0ZjQyNzZmMjczOGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NzZlYmYzNGU3M2QwNTAzOTM3NDdlOWVhZjM1ZDk3MDdhMTkwNWQ0Y2MxYzUxMGE0ZjE5ZTE1ZmMzNTBlY2IxZGI0OWIyZjUxZjg0ZmFhZWNiOWI2N2FmNTQ4YWNjMmU1MTJmYWIyZmExNjEwYjM2OGRkMWExNzllYTBmMzM0ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOGVlZGEzNmRlZGNhYmNlZmZhOWYyNmU2MzUyNWU2ODg3MWEzMmNiZWRjZDdjMWFkNmI2ZDU5NDM2NmIyNzI0OGMxZDQzNmUxZjlkY2YzYjA5NzEwN2UzODAxZDIyOTgxNDQ1YzhjMzMyY2JkMDUzMDA3NTk5ZGU1MzJiYWYxMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmQwZTRiYzZlNDdlM2Y2NDc5NDZlMWE0YjlhMGNlYTY0N2MzNTMwN2U5NTUzZTU4ZjNjMTMyMTYxODM2YjlkM2I4YzdlNzAxYjNlNjg2MDcxYjYwMWY0YjBiODAyMzMyNmY5YmE0ODdhZWM4MDI1MmM5NWNhYWQ4ZmQ5OTYxNDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDk1YWVkODc0YjQ5NTc2NDhmMGU1NWM4Yzc1OTJkYzdlMWI2NTMwNzllMjU4NjU5NWJkY2Y4OTM3ZjcyMmMyYmU4NjdhZGNhMTYzZDA0MDQzMjUxMDY2MTMwZTAyZGRjOGNiNzY2M2NmOGQ4NzY0YjEwYmY2YTI2YTk2MjRmMTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2MwYzc4YjA2ZmZmMmIxNzVkODQzYTliMTNmZjg3Mzk3MGM2YzJlZWIyZTBhMmEyMDdlOWFjYjI1YTliMGE2MjFkNGVjOGQyMWUwY2NhODgzZDIwMTFiZmVlMDdmN2RiNzI4ZTJlYzBiNDViMjRkMjU4ZWNiZmUwZGVlMDAzNTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTg0MmZlODI1MWQ0ZTA5NmYxM2NiZTVlYmY3ZTBiMzBjNmI1MzBhMDBiMzRmYTA3YmU4MDRkNWQ3YjQwMGEwMmIyNmZmNDI2OGIxNGRkODc3ZTk2ZTFhZTMzYWQwOGVmMmFiODgxMjk2MzJkNjI4NzU5NTJlYWZkMDE3MjExYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjliNzM0MWY4OWVmN2RhYTVhM2EwMTgwZTFiZmY3MWM1MmQwODg3MWViMGFmY2U1Nzc0NzAzZDk1MTgyZGQwYzAyYzA1MDgzM2VmNjE5OWJmMzEyYWM1YzAyZGJlNDUyM2U0ZDhhMGYxOTY5MTI1ZWM3NzU5NmNjYjc2NTAzZmM1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjk5MTliNzhkMDczNjljNjdjYmU2OGU4NjgwYjJjOTE5ZDYwOWQyZGJjYmIyMWQyYzgwY2ZmMjYyYTM2NDUzNDdhNTMwZTczOTFkNDFlNzhhNDQ4ZDc1MTgzMjZhMWNlM2VjYjljOTlkMTYzNDM5MDE2Mzk2NTQ5MmFkZTA0OWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMzlmMzA1YmM3OWYxZGI5YTZjZmJmOTUyNTE5MjViMmVlNTZiZDI5YmIxNTU3ZjI0NDY5OGZjMjM1ZDBhZjllNzI3YWM1NzIwMjI2ZTMyZGM4MGZjOGFmMzYxN2IwYTRkNTNjZTc3MmU3MDNlMjVmZjBiOWViZWQ3NGM3NTczOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTQxNzBjNGUxNmQ1Mzc5NWE4NDc5ZDBjMWE3OWQxOWIxOTBkOTIyZTE2MzAxZTdhMGJiOGI4MTZkM2M0OWJkMjVmZTBiODRlODc5ZGE3ODBjM2ZjMDY0MWFkNjljYzU3ZGQxZTc5NWVjZTdlOGJiMjgxMmY3NDMwNThhZmYwMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGF0dGVybnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjMTEwNTVmY2E1ODRhZjRkNDczOTljNTRiYzUwZDgxYWE2OGM2MDNhNTUwYmY2OWEwOWIyN2M4OWY2ODVlOTc0NDU0NWE3NTNhZDVlOGZlMzMzMWFkYmQ5ZDRkY2ExNDNhNTg3ZGQ2MDkzNGZiNDFjODJmNGExZTllYjFkZTUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZTcyYTVkY2Q2NGUxZDdkMjU0NWNlMzBjYzM3MDI0ODQzOTBjOWQ1Y2RkYjlkMDVjZWEzMzZlODhlZThlOTMzYmMzMTUwM2M0YzI1YzM3ZTBhMWNhYzhjZGUzMWNiYmY0NzgxODY0ZDBkODlkNzFmZWU1ODRmNTliMDE5MzQyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDJkMzcyODdhMmVhYzlmNDFjYzQ0YTkyMDFmOTlkZjIyMWE2NzZhNDdjZTc5ZDgwNjBiN2M1NjdjMmU2M2Y3ZGViZDkyNmZmZTM1MjIzZWE3ZjM1OWZmNmE5YjMwYTgzNjhhMzk2YWI2ZGRmYzRiOGIxMjI2NDFmODVjOWI4ZTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZGU0ZjgyZjJjNGQ0OWRiM2E5ODE0YmRiY2YxZWM2NGQ3MWQ4ZmFkNTIxZTExMGU2ODEyZDNiMzczZWQ5MjhiODYxZDc1ZjA3YTY3ZTNjZjRjM2ZlZDZhZGU0NTU3YmJmNGFkOTQ1NzM1YTIzOGRlZGRkMDUzYzA5MzJlNmEwNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRlYWI3ZWMyODRjYWRlMWIwNGRmNGYzYmU2ODZjMTcyYjA0MzkxZjBlZWQ4NTQ4ZTQ5ZjkzMWIzYzJjNGM1MTgzZTg0MTFlZTY1YTBiOWI2ZGZiNWZkZjFhZGI4ZTRhMzYxMjUwYWUwMTkxZTJlYzYwYzU4MTQxOGU4Y2E1MDQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGI5ODkyYjNhMjViZjZiYWQzMjM1ZDZhMzc2NTZmMTFhNDNlNDRhMzhmZThkNWM4ZTQzNWIxZjA5Y2JmMmI0MmY2YWQ2NDk0NDY0ZDU3YWQxOTQ3Zjc4YzhhMTAxOTZiYmQ4ZjUwYjY0ZTI1MTA2NzYzZWRhOTNkZTI3YWRlYmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YjFiNDE3YzZkZDkzMmRiODFmOWRhMTE0YzAyMGM3ZDAyNzhiZjEyYmE4YzQ2MDdmZjQwYWJjNWUzMDE1OTUxZGNkZmJhMmUwMWEwMTUzZjRkMGZmOWEzNzU0ZWJjMDA0NjA3N2Y3YTg0MjMxN2IzMWJiN2EzZjFjYjBmYzkyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMyNzZjNmZiYzYzYjViYmY4M2FjZjBlOTkzMTdlOTAzNWZmMzhkMDRhN2I2MWIyOWY4MDAzNTM4NTAxZmVjZGYyYmU5OTc2YWRmOWUyMmE5MDA5YWI0ZjUxMWI5OGU3ZWZjNjQ5ZmE3M2UyYTlhYzMyMzYzY2NkZThhYWE1MTNhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4YTg1MWJkYmYyZjRkZDA5YTEzYjUyMTEzMGUyOTlmOWQxOTU1YWUxOTI5MTYyN2NkMjhkZjRmYjVkNDg3OGVjZGY3Y2UyYjIyYTU2NzBiNDM5N2JmNDkwYjgwZDg5ODI0ODFkYjVjZWIyMjRiMTBhZmRlZmU1YzQ0NTA2MjY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjExNGIzYTQwNDM4MjJmOGZiZmQyMmFiNjAxOWNjMWE3ZTYwYWRjZjdhNTdkNzBkMjdlOGVmMWMxMTIyNjI3NWY3ZTMxMzc2ZDg0MzZhMTQ3OTk4Y2E5YTA0NjA3NjkyMWQzNjcyZWM5MWRmNmQ2ZjMyMTEwNWJjZGFiM2Q2NzMwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOWZmZTU1YTMxMDM3M2E0NTdhYTlkMDc3MTYxMTg1MDU0ZWIzNmY4MzUzMjhmY2ExNGVmZDExNDUxYzYxNTAyYTEyMGI4M2M3NDgyMDRmYTA4NzdhZmM3MDUyZWIyMmE0ZDdiMGUxYjBiNjE4ZGI5MDIxN2Q2ZThjZTc3YTI5MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTgxNGRkMTQzZGZmNzNkZTNlZTRjMWYwNzcwN2U1NzdjYWFjYWEzYWJmNGIwNTkwY2RlZGUxMGI5MTk5YTkyZDc5N2YwYzExYmI3MzgyOTVjNDlmMWU3ZWY5MGYzZDExNmUyOGU3NGMwODY3MzRlYmNhOGJjZGExZGM5MzlkNDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZWE1NWZhMmNjMWI3MzZlMDJiYjgzMjI0NmRjYzZmY2Q0YTBhMWViYzI0MWUzODFlZjZmNjRiZDhlYzQ2YTE1ZDNmNzk3ZWMyMmEzNWM5YzVjOTUxNDI0ZTM5ZmQ2YTY4N2NkYjQxNTVjOGRiNzFmNmVmZTdkM2ZlOTdlOTQ1YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NWU4MzM2Y2JjNDFjZDJmNjMxMTc3YzA2MTA5Y2YzZjhiNTE4MTRjYjMzZTIyMDgyYzhlOWVlZTA3MmVjNDg5MTlkMDhkNDNkMjlkNTY1NTE4MjZjODk1MTM1ODM1NGQ2OGU1YWEwOTZjNmFhNTY2MTM0OWUwZmExMDgxNmY3OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OGE4NTFiZGJmMmY0ZGQwOWExM2I1MjExMzBlMjk5ZjlkMTk1NWFlMTkyOTE2MjdjZDI4ZGY0ZmI1ZDQ4NzhlY2RmN2NlMmIyMmE1NjcwYjQzOTdiZjQ5MGI4MGQ4OTgyNDgxZGI1Y2ViMjI0YjEwYWZkZWZlNWM0NDUwNjI2NSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vc3RyZWFtLXYwLjMuMjUiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3N0cmVhbSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MC4zLjI1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdHJlYW0vcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MC4zLjI1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMDk0MTMyY2I5YWNlN2YyYWE4ZmIyNGE4NWE4NjBkNDhkZDdjM2U1NDQwMDFmZWNmZWQwYTk3ZGMxYTM3YzJmZTNkM2QxYzBlNDQwOTkwYTg2MGU1ZjQzZTdlNmI1N2UzYTBlMTQ2MDI0YjA1ZDk4ODMwNmM2ZjkwNjhiNWEyZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiamVzc2llLmpzLXYwLjMuMiI6IHsKICAgICAgIm5hbWUiOiAiamVzc2llLmpzIiwKICAgICAgImxhYmVsIjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAxZGNiZTM0ZjRjMjI0ZDZkNmZmZGRlY2IzZGU1YmRmMmZmMzEzODY2N2Y1NmY0OTk1NTY5ZjBjMmQ5ZmNlM2I0ZGVjNDMzZjBkNDU2YTE4Yjk1ZDdmM2YyMzdjMTE5NmM0ODdiYzQ0ZTQ0NmYyOTVjZjYzZDJkNTgzZDc4ODg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMjEyNGJjY2M4NDYwMTkwMDYxZjRjZGJkOGRmNDliZDcyM2QxYzY1NWFiOTlkMDI2NzZmOGExMTFhMGY3NGU0NzYyY2FjNDNlY2RlZWI4NWQyOTNmMzdjODJlYmMyNWZjNGUwNTJjOTkyMzc4YmM3ZWJlMTBlNjgxY2Q4MzAzNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5YTk1ZDFkYmNjOGY0YmU4MTQyMDRmNjgzMmMxZWFjMzA2MjFmY2NiMDMyOGMwZWM0MWVhNWEwMzkxNDk5OGM4ZWZmOTAxOWVmZjY1YWQ2NjI4OWMwMTU5MTgxZDliNDlkYjJjZDk2ZjNmYjU5ZTIxYWRiODRkOWE0YzBlODk3ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmY3MTYzNzgyZjY3MmY2Mjg0NDkyNWI2YmI0ZmQ5ZDAxN2I4YjY0MmZmMzM2NDRmMjU5ZWUwMDdlMmJiNWE4MWIyNGJmZTA2NDE3NDA1YjA1MDUxOWZiNTNjMjBhODNmMjlkZTEyZjgzYzNiOWQ2OTZjZjdmODRlOThkZTUxMTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MzU3YmJmNmIxMWJiY2JjYTNiOTU5YzVlZTFhZWE0ZmFlYzM0ZmUzNDZiODM4MTk0MDJlOTNkZmJiZGU3ZmY4ZmRjZTM5ZTFmNjA4ZGJiNzY1NDBhODFjYTQ5OGVmZDQ2OTI5ZjQxZTc4OWUyOWJiNmRhZjY3YWQzYzE3NWE1ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9hc3luYy10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MGJmMTIxYTdhNTY5NTE0YzJlMGMxYWE1MWQxNmUzZTBkMTNhYzVlYWY5MDE1M2ExYzI1N2M2OWFjYmFjYWIwZjRhMmRjNjE1MDNiMzM3MmViMGE5ODA2YTYxNTI2NTFmNzAxOWEzN2JlOTJkZTg0ZDhhMjI1NWU3ZjMzMTA3MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWUxNDQ5MGNlNTNhZjQyYmU1MjQ2YzcxNjkyODgzNDY2ZjcxNGU4OTgyNGM3MzNiYzQzM2VhMjk1YjIyMjljZDRmN2MzYjhiYTAyYzY5OTdjNzJmZjAyNzk0YTEyNjdlOWU1ZTRmMTNhMjVkYzQ2YmRlNGRmZTUyM2NkZTU1NDgiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAAA5ilYCOwsAADsLAAAjAAAAQGFnb3JpYy9hc3NlcnQtdjAuNi4wL3NyYy9hc3NlcnQuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhaWwiLCJOb25OdWxsaXNoIiwiYW4iLCJhc3NlcnQiLCJkZXRhaWxzIiwiaWRlbnRDaGVja2VyIiwibWFrZUFzc2VydCIsInEiLCJxdW90ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGFuLCAnbmFtZScsIHt2YWx1ZTogXCJhblwifSk7JGjigI1fb25jZS5hbihhbik7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge0Fzc2VydH0gKi9cbmNvbnN0IGdsb2JhbEFzc2VydD1nbG9iYWxUaGlzLmFzc2VydDskaOKAjV9vbmNlLmdsb2JhbEFzc2VydChnbG9iYWxBc3NlcnQpO1xuXG5pZihnbG9iYWxBc3NlcnQ9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbml0aWFsaXplIEBhZ29yaWMvYXNzZXJ0LCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0LCBpbXBvcnQgJ3NlcycgYmVmb3JlICdAYWdvcmljL2Fzc2VydCdgKTtcblxuIH1cblxuY29uc3QgbWlzc2luZz0vKiogQHR5cGUge2NvbnN0fSAqL1tcbidmYWlsJyxcbidlcXVhbCcsXG4ndHlwZW9mJyxcbidzdHJpbmcnLFxuJ25vdGUnLFxuJ2RldGFpbHMnLFxuJ0ZhaWwnLFxuJ3F1b3RlJyxcbidtYWtlQXNzZXJ0J10uXG5maWx0ZXIoKG5hbWUpPT5nbG9iYWxBc3NlcnRbbmFtZV09PT11bmRlZmluZWQpO1xuaWYobWlzc2luZy5sZW5ndGg+MCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGFnb3JpYy9hc3NlcnQsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbicsICcpXG4gfWApO1xuXG4gfVxuXG5jb25zdHtkZXRhaWxzLEZhaWwscXVvdGUsbWFrZUFzc2VydH09Z2xvYmFsQXNzZXJ0OyRo4oCNX29uY2UuZGV0YWlscyhkZXRhaWxzKTskaOKAjV9vbmNlLkZhaWwoRmFpbCk7JGjigI1fb25jZS5xdW90ZShxdW90ZSk7JGjigI1fb25jZS5tYWtlQXNzZXJ0KG1ha2VBc3NlcnQpO1xuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgICAgICAgIE5vbk51bGxpc2g9KHZhbCxvcHREZXRhaWxzPSBgdW5leHBlY3RlZCAke3F1b3RlKHZhbCl9YCk9PntcbmlmKHZhbCE9bnVsbCl7XG4vKiBUaGlzIGAhPSBudWxsYCBpZGlvbSBjaGVja3MgdGhhdCBgdmFsYCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuKi9cbnJldHVybiB2YWw7XG4gfVxuYXNzZXJ0LmZhaWwob3B0RGV0YWlscyk7XG4gfTskaOKAjV9vbmNlLk5vbk51bGxpc2goTm9uTnVsbGlzaCk7XG5oYXJkZW4oTm9uTnVsbGlzaCk7XG5cbi8qKlxuICogUHJlcGVuZCB0aGUgY29ycmVjdCBpbmRlZmluaXRlIGFydGljbGUgb250byBhIG5vdW4sIHR5cGljYWxseSBhIHR5cGVvZiByZXN1bHRcbiAqIGUuZy4sIFwiYW4gT2JqZWN0XCIgdnMuIFwiYSBOdW1iZXJcIlxuICpcbiAqIEBkZXByZWNhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBub3VuIHRvIHByZXBlbmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBub3VuIHByZXBlbmRlZCB3aXRoIGEvYW5cbiAqL1xuZnVuY3Rpb24gYW4oc3RyKXtcbnN0cj0gYCR7c3RyfWA7XG5pZihzdHIubGVuZ3RoPj0xJiYnYWVpb3VBRUlPVScuaW5jbHVkZXMoc3RyWzBdKSl7XG5yZXR1cm4gYGFuICR7c3RyfWA7XG4gfVxucmV0dXJuIGBhICR7c3RyfWA7XG4gfVxuZnJlZXplKGFuKTtcblxuXG4vKipcbiAqIEluIHRoZSBgYXNzZXJ0Rm9vYC9gaXNGb29gL2BjaGVja0Zvb2AgcGF0dGVybiwgYGNoZWNrRm9vYCBoYXMgYSBgY2hlY2tgXG4gKiBwYXJhbWV0ZXIgb2YgdHlwZSBgQ2hlY2tlcmAuIGBhc3NlcnRGb29gIGNhbGxzIGBjaGVja0Zvb2AgcGFzc2VzXG4gKiBgYXNzZXJ0Q2hlY2tlcmAgYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpc0Zvb2AgcGFzc2VzIGBpZGVudENoZWNrZXJgXG4gKiBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlkZW50Q2hlY2tlcmAgYWN0cyBwcmVjaXNlbHkgbGlrZSBhblxuICogaWRlbnRpdHkgZnVuY3Rpb24sIGJ1dCBpcyB0eXBlZCBhcyBhIGBDaGVja2VyYCB0byBpbmRpY2F0ZSBpdHNcbiAqIGludGVuZGVkIHVzZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGlkZW50Q2hlY2tlcj0oY29uZCxfZGV0YWlscyk9PmNvbmQ7JGjigI1fb25jZS5pZGVudENoZWNrZXIoaWRlbnRDaGVja2VyKTtcbmhhcmRlbihpZGVudENoZWNrZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydCI6WyJnbG9iYWxBc3NlcnQiXSwiZGV0YWlscyI6WyJkZXRhaWxzIl0sIkZhaWwiOlsiRmFpbCJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sIm1ha2VBc3NlcnQiOlsibWFrZUFzc2VydCJdLCJhbiI6WyJhbiJdLCJOb25OdWxsaXNoIjpbIk5vbk51bGxpc2giXSwiaWRlbnRDaGVja2VyIjpbImlkZW50Q2hlY2tlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAFuYfs2i4AANouAAAiAAAAQGFnb3JpYy9hc3NlcnQtdjAuNi4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiBCYXNlZCBvbiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9IRUFEL3BhY2thZ2VzL3Nlcy9zcmMvZXJyb3IvdHlwZXMuanMqL1xuLyogQ29vcmRpbmF0ZSBlZGl0cyB1bnRpbCB3ZSByZWZhY3RvciB0byBhdm9pZCB0aGlzIGR1cGxpY2F0aW9uKi9cbi8qIEF0IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc3NCovXG4vKiBpcyBhIHJlY29yZCBvZiBhIGZhaWxlZCBhdHRlbXB0IHRvIHJlbW92ZSB0aGlzIGR1cGxpY2F0aW9uLiovXG5cbi8qKlxuICogQGNhbGxiYWNrIEJhc2VBc3NlcnRcbiAqIFRoZSBgYXNzZXJ0YCBmdW5jdGlvbiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIHsqfSBmbGFnIFRoZSB0cnV0aHkvZmFsc3kgdmFsdWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXSBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHthc3NlcnRzIGZsYWd9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBc3NlcnRNYWtlRXJyb3JPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vycm9yTmFtZV1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRNYWtlRXJyb3JcbiAqXG4gKiBUaGUgYGFzc2VydC5lcnJvcmAgbWV0aG9kLCByZWNvcmRpbmcgZGV0YWlscyBmb3IgdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcuXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBbRXJyb3JDb25zdHJ1Y3Rvcl0gQW4gb3B0aW9uYWwgYWx0ZXJuYXRlIGVycm9yXG4gKiBjb25zdHJ1Y3RvciB0byB1c2UuXG4gKiBAcGFyYW0ge0Fzc2VydE1ha2VFcnJvck9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEZhaWxcbiAqXG4gKiBUaGUgYGFzc2VydC5mYWlsYCBtZXRob2QuXG4gKlxuICogRmFpbCBhbiBhc3NlcnRpb24sIHJlY29yZGluZyBmdWxsIGRldGFpbHMgdG8gdGhlIGNvbnNvbGUgYW5kXG4gKiByYWlzaW5nIGFuIGV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBpbiB3aGljaCBgZGV0YWlsc2Agc3Vic3RpdHV0aW9uIHZhbHVlc1xuICogaGF2ZSBiZWVuIG1hc2tlZC5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggdGhlIG5vZGVqcyBhc3NlcnRpb24gbGlicmFyeS5cbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIG9mIHdoYXQgd2FzIGFzc2VydGVkXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXSBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRFcXVhbFxuICogVGhlIGBhc3NlcnQuZXF1YWxgIG1ldGhvZFxuICpcbiAqIEFzc2VydCB0aGF0IHR3byB2YWx1ZXMgbXVzdCBiZSBgT2JqZWN0LmlzYC5cbiAqIEBwYXJhbSB7Kn0gYWN0dWFsIFRoZSB2YWx1ZSB3ZSByZWNlaXZlZFxuICogQHBhcmFtIHsqfSBleHBlY3RlZCBXaGF0IHdlIHdhbnRlZFxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc10gVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyogVHlwZSBhbGwgdGhlIG92ZXJsb2FkcyBvZiB0aGUgYXNzZXJ0VHlwZW9mIGZ1bmN0aW9uLiovXG4vKiBUaGVyZSBtYXkgZXZlbnR1YWxseSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgYnV0Ki9cbi8qIHRoZW1zIHRoZSBicmVha3Mgd2l0aCBUeXBlc2NyaXB0IDQuMC4qL1xuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mQmlnaW50XG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2JpZ2ludCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYmlnaW50fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJvb2xlYW5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnYm9vbGVhbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYm9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZGdW5jdGlvblxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydmdW5jdGlvbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgRnVuY3Rpb259XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mTnVtYmVyXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J251bWJlcid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgbnVtYmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk9iamVjdFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydvYmplY3QnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIFJlY29yZDxhbnksIGFueT4gfCBudWxsfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZlN0cmluZ1xuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydzdHJpbmcnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN0cmluZ31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZTeW1ib2xcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnc3ltYm9sJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzeW1ib2x9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3VuZGVmaW5lZCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgdW5kZWZpbmVkfVxuICovXG5cbi8qKlxuICogVGhlIGBhc3NlcnQudHlwZW9mYCBtZXRob2RcbiAqXG4gKiBAdHlwZWRlZiB7QXNzZXJ0VHlwZW9mQmlnaW50ICYgQXNzZXJ0VHlwZW9mQm9vbGVhbiAmIEFzc2VydFR5cGVvZkZ1bmN0aW9uICYgQXNzZXJ0VHlwZW9mTnVtYmVyICYgQXNzZXJ0VHlwZW9mT2JqZWN0ICYgQXNzZXJ0VHlwZW9mU3RyaW5nICYgQXNzZXJ0VHlwZW9mU3ltYm9sICYgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkfSBBc3NlcnRUeXBlb2ZcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRTdHJpbmdcbiAqIFRoZSBgYXNzZXJ0LnN0cmluZ2AgbWV0aG9kLlxuICpcbiAqIGBhc3NlcnQuc3RyaW5nKHYpYCBpcyBlcXVpdmFsZW50IHRvIGBhc3NlcnQudHlwZW9mKHYsICdzdHJpbmcnKWAuIFdlXG4gKiBzcGVjaWFsIGNhc2UgdGhpcyBvbmUgYmVjYXVzZSBpdCBpcyB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQuXG4gKlxuICogQXNzZXJ0IGFuIGV4cGVjdGVkIHR5cGVvZiByZXN1bHQuXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW4gVGhlIHZhbHVlIHRvIGdldCB0aGUgdHlwZW9mXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgc3RyaW5nfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydE5vdGVcbiAqIFRoZSBgYXNzZXJ0Lm5vdGVgIG1ldGhvZC5cbiAqXG4gKiBBbm5vdGF0ZSBhbiBlcnJvciB3aXRoIGRldGFpbHMsIHBvdGVudGlhbGx5IHRvIGJlIHVzZWQgYnkgYW5cbiAqIGF1Z21lbnRlZCBjb25zb2xlIHN1Y2ggYXMgdGhlIGNhdXNhbCBjb25zb2xlIG9mIGBjb25zb2xlLmpzYCwgdG9cbiAqIHByb3ZpZGUgZXh0cmEgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGxvZ2dlZCBlcnJvcnMuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqIEBwYXJhbSB7RGV0YWlsc30gZGV0YWlsc05vdGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e319IERldGFpbHNUb2tlblxuICogQSBjYWxsIHRvIHRoZSBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCBtYWtlcyBhbmQgcmV0dXJucyBhIGZyZXNoIGRldGFpbHNcbiAqIHRva2VuLCB3aGljaCBpcyBhIGZyb3plbiBlbXB0eSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhhdFxuICogYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgZXhwcmVzc2lvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCBEZXRhaWxzVG9rZW59IERldGFpbHNcbiAqIEVpdGhlciBhIHBsYWluIHN0cmluZywgb3IgbWFkZSBieSB0aGUgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgdGFnLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RyaW5nYWJsZVBheWxvYWRcbiAqIEhvbGRzIHRoZSBwYXlsb2FkIHBhc3NlZCB0byBxdW90ZSBzbyB0aGF0IGl0cyBwcmludGVkIGZvcm0gaXMgdmlzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSB0b1N0cmluZyBIb3cgdG8gcHJpbnQgdGhlIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIFRvIFwiZGVjbGFzc2lmeVwiIGFuZCBxdW90ZSBhIHN1YnN0aXR1dGlvbiB2YWx1ZSB1c2VkIGluIGFcbiAqIGBgYCBkZXRhaWxzYC4uLmAgYGBgIHRlbXBsYXRlIGxpdGVyYWwsIGVuY2xvc2UgdGhhdCBzdWJzdGl0dXRpb24gZXhwcmVzc2lvblxuICogaW4gYSBjYWxsIHRvIGBxdW90ZWAuIFRoaXMgbWFrZXMgdGhlIHZhbHVlIGFwcGVhciBxdW90ZWRcbiAqIChhcyBpZiB3aXRoIGBKU09OLnN0cmluZ2lmeWApIGluIHRoZSBtZXNzYWdlIG9mIHRoZSB0aHJvd24gZXJyb3IuIFRoZVxuICogcGF5bG9hZCBpdHNlbGYgaXMgc3RpbGwgcGFzc2VkIHVucXVvdGVkIHRvIHRoZSBjb25zb2xlIGFzIGl0IHdvdWxkIGJlXG4gKiB3aXRob3V0IGBxdW90ZWAuXG4gKlxuICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgd2lsbCByZXZlYWwgdGhlIGV4cGVjdGVkIHNreSBjb2xvciwgYnV0IG5vdCB0aGVcbiAqIGFjdHVhbCBpbmNvcnJlY3Qgc2t5IGNvbG9yLCBpbiB0aGUgdGhyb3duIGVycm9yJ3MgbWVzc2FnZTpcbiAqIGBgYGpzXG4gKiBza3kuY29sb3IgPT09IGV4cGVjdGVkQ29sb3IgfHwgRmFpbGAke3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cXVvdGUoZXhwZWN0ZWRDb2xvcil9YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBub3JtYWwgY29udmVudGlvbiBpcyB0byBsb2NhbGx5IHJlbmFtZSBgZGV0YWlsc2AgdG8gYFhgIGFuZCBgcXVvdGVgIHRvIGBxYFxuICogbGlrZSBgY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSB9ID0gYXNzZXJ0O2AsIHNvIHRoZSBhYm92ZSBleGFtcGxlIHdvdWxkIHRoZW4gYmVcbiAqIGBgYGpzXG4gKiBza3kuY29sb3IgPT09IGV4cGVjdGVkQ29sb3IgfHwgRmFpbGAke3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cShleHBlY3RlZENvbG9yKX1gO1xuICogYGBgXG4gKlxuICogQGNhbGxiYWNrIEFzc2VydFF1b3RlXG4gKiBAcGFyYW0geyp9IHBheWxvYWQgV2hhdCB0byBkZWNsYXNzaWZ5XG4gKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gW3NwYWNlc11cbiAqIEByZXR1cm5zIHtTdHJpbmdhYmxlUGF5bG9hZH0gVGhlIGRlY2xhc3NpZmllZCBwYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmFpc2VcbiAqXG4gKiBUbyBtYWtlIGFuIGBhc3NlcnRgIHdoaWNoIHRlcm1pbmF0ZXMgc29tZSBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvblxuICogbGlrZSBhIHRyYW5zYWN0aW9uLCB2YXQsIG9yIHByb2Nlc3MsIGNhbGwgYG1ha2VBc3NlcnRgIHdpdGggYSBgUmFpc2VgXG4gKiBjYWxsYmFjaywgd2hlcmUgdGhhdCBjYWxsYmFjayBhY3R1YWxseSBwZXJmb3JtcyB0aGF0IGxhcmdlciB0ZXJtaW5hdGlvbi5cbiAqIElmIHBvc3NpYmxlLCB0aGUgY2FsbGJhY2sgc2hvdWxkIGFsc28gcmVwb3J0IGl0cyBgcmVhc29uYCBwYXJhbWV0ZXIgYXNcbiAqIHRoZSBhbGxlZ2VkIHJlYXNvbiBmb3IgdGhlIHRlcm1pbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IHJlYXNvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VBc3NlcnRcbiAqXG4gKiBNYWtlcyBhbmQgcmV0dXJucyBhbiBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3QgdGhhdCBzaGFyZXMgdGhlIGJvb2trZWVwaW5nXG4gKiBzdGF0ZSBkZWZpbmVkIGJ5IHRoaXMgbW9kdWxlIHdpdGggb3RoZXIgYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0cyBtYWRlIGJ5XG4gKiBgbWFrZUFzc2VydGAuIFRoaXMgc3RhdGUgaXMgcGVyLW1vZHVsZS1pbnN0YW5jZSBhbmQgaXMgZXhwb3NlZCBieSB0aGVcbiAqIGBsb2dnZWRFcnJvckhhbmRsZXJgIGFib3ZlLiBXZSByZWZlciB0byBgYXNzZXJ0YCBhcyBhIFwiZnVuY3Rpb24gb2JqZWN0XCJcbiAqIGJlY2F1c2UgaXQgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBhcyBhIGZ1bmN0aW9uLCBidXQgYWxzbyBoYXMgbWV0aG9kcyB0aGF0XG4gKiBjYW4gYmUgY2FsbGVkLlxuICpcbiAqIElmIGBvcHRSYWlzZWAgaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5lZCBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3Qgd2lsbCBjYWxsXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgYmVmb3JlIHRocm93aW5nIHRoZSBlcnJvci4gVGhpcyBlbmFibGVzIGBvcHRSYWlzZWAgdG9cbiAqIGVuZ2FnZSBpbiBldmVuIG1vcmUgdmlvbGVudCB0ZXJtaW5hdGlvbiBiZWhhdmlvciwgbGlrZSB0ZXJtaW5hdGluZyB0aGUgdmF0LFxuICogdGhhdCBwcmV2ZW50cyBleGVjdXRpb24gZnJvbSByZWFjaGluZyB0aGUgZm9sbG93aW5nIHRocm93LiBIb3dldmVyLCBpZlxuICogYG9wdFJhaXNlYCByZXR1cm5zIG5vcm1hbGx5LCB3aGljaCB3b3VsZCBiZSB1bnVzdWFsLCB0aGUgdGhyb3cgZm9sbG93aW5nXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgd291bGQgc3RpbGwgaGFwcGVuLlxuICpcbiAqIEBwYXJhbSB7UmFpc2V9IFtvcHRSYWlzZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VucmVkYWN0ZWRdXG4gKiBAcmV0dXJucyB7QXNzZXJ0fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyh0ZW1wbGF0ZTogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmdbXSwgLi4uYXJnczogYW55KSA9PiBEZXRhaWxzVG9rZW59IERldGFpbHNUYWdcbiAqXG4gKiBVc2UgdGhlIGBkZXRhaWxzYCBmdW5jdGlvbiBhcyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIHRvIGNyZWF0ZVxuICogaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZXMuIFRoZSBhc3NlcnRpb24gZnVuY3Rpb25zIHRha2Ugc3VjaCBtZXNzYWdlc1xuICogYXMgb3B0aW9uYWwgYXJndW1lbnRzOlxuICogYGBganNcbiAqIGFzc2VydChza3kuaXNCbHVlKCksIGRldGFpbHNgJHtza3kuY29sb3J9IHNob3VsZCBiZSBcImJsdWVcImApO1xuICogYGBgXG4gKiBvciBmb2xsb3dpbmcgdGhlIG5vcm1hbCBjb252ZW50aW9uIHRvIGxvY2FsbHkgcmVuYW1lIGBkZXRhaWxzYCB0byBgWGBcbiAqIGFuZCBgcXVvdGVgIHRvIGBxYCBsaWtlIGBjb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxIH0gPSBhc3NlcnQ7YDpcbiAqIGBgYGpzXG4gKiBhc3NlcnQoc2t5LmlzQmx1ZSgpLCBYYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgXCJibHVlXCJgKTtcbiAqIGBgYFxuICogSG93ZXZlciwgbm90ZSB0aGF0IGluIG1vc3QgY2FzZXMgaXQgaXMgcHJlZmVyYWJsZSB0byBpbnN0ZWFkIHVzZSB0aGUgYEZhaWxgXG4gKiB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyAod2hpY2ggaGFzIHRoZSBzYW1lIGlucHV0IHNpZ25hdHVyZSBhcyBgZGV0YWlsc2BcbiAqIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYW5kIHRocm93cyBhbiBlcnJvcik6XG4gKiBgYGBqc1xuICogc2t5LmlzQmx1ZSgpIHx8IEZhaWxgJHtza3kuY29sb3J9IHNob3VsZCBiZSBcImJsdWVcImA7XG4gKiBgYGBcbiAqXG4gKiBUaGUgZGV0YWlscyB0ZW1wbGF0ZSB0YWcgcmV0dXJucyBhIGBEZXRhaWxzVG9rZW5gIG9iamVjdCB0aGF0IGNhbiBwcmludFxuICogaXRzZWxmIHdpdGggdGhlIGZvcm1hdHRlZCBtZXNzYWdlIGluIHR3byB3YXlzLlxuICogSXQgd2lsbCByZXBvcnQgZnVsbCBkZXRhaWxzIHRvIHRoZSBjb25zb2xlLCBidXRcbiAqIG1hc2sgZW1iZWRkZWQgc3Vic3RpdHV0aW9uIHZhbHVlcyB3aXRoIHRoZWlyIHR5cGVvZiBpbmZvcm1hdGlvbiBpbiB0aGUgdGhyb3duIGVycm9yXG4gKiB0byBwcmV2ZW50IHJldmVhbGluZyBzZWNyZXRzIHVwIHRoZSBleGNlcHRpb25hbCBwYXRoLiBJbiB0aGUgZXhhbXBsZVxuICogYWJvdmUsIHRoZSB0aHJvd24gZXJyb3IgbWF5IHJldmVhbCBvbmx5IHRoYXQgYHNreS5jb2xvcmAgaXMgYSBzdHJpbmcsXG4gKiB3aGVyZWFzIHRoZSBzYW1lIGRpYWdub3N0aWMgcHJpbnRlZCB0byB0aGUgY29uc29sZSByZXZlYWxzIHRoYXQgdGhlXG4gKiBza3kgd2FzIGdyZWVuLiBUaGlzIG1hc2tpbmcgY2FuIGJlIGRpc2FibGVkIGZvciBhbiBpbmRpdmlkdWFsIHN1YnN0aXR1dGlvbiB2YWx1ZVxuICogdXNpbmcgYHF1b3RlYC5cbiAqXG4gKiBUaGUgYHJhd2AgcHJvcGVydHkgb2YgYW4gaW5wdXQgdGVtcGxhdGUgYXJyYXkgaXMgaWdub3JlZCwgc28gYSBzaW1wbGVcbiAqIGFycmF5IG9mIHN0cmluZ3MgbWF5IGJlIHByb3ZpZGVkIGRpcmVjdGx5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyh0ZW1wbGF0ZTogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmdbXSwgLi4uYXJnczogYW55KSA9PiBuZXZlcn0gRmFpbFRhZ1xuICpcbiAqIFVzZSB0aGUgYEZhaWxgIGZ1bmN0aW9uIGFzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdG8gZWZmaWNpZW50bHlcbiAqIGNyZWF0ZSBhbmQgdGhyb3cgYSBgZGV0YWlsc2Atc3R5bGUgZXJyb3Igb25seSB3aGVuIGEgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQuXG4gKiBgYGBqc1xuICogY29uZGl0aW9uIHx8IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqIGBgYFxuICogVGhpcyBhdm9pZHMgdGhlIG92ZXJoZWFkIG9mIGNyZWF0aW5nIHVzdWFsbHktdW5uZWNlc3NhcnkgZXJyb3JzIGxpa2VcbiAqIGBgYGpzXG4gKiBhc3NlcnQoY29uZGl0aW9uLCBkZXRhaWxzYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiB3aGlsZSBpbXByb3ZpbmcgcmVhZGFiaWxpdHkgb3ZlciBhbHRlcm5hdGl2ZXMgbGlrZVxuICogYGBganNcbiAqIGNvbmRpdGlvbiB8fCBhc3NlcnQuZmFpbChkZXRhaWxzYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKlxuICogSG93ZXZlciwgZHVlIHRvIGN1cnJlbnQgd2Vha25lc3MgaW4gVHlwZVNjcmlwdCwgc3RhdGljIHJlYXNvbmluZ1xuICogaXMgbGVzcyBwb3dlcmZ1bCB3aXRoIHRoZSBgfHxgIHBhdHRlcm5zIHRoYW4gd2l0aCBhbiBgYXNzZXJ0YCBjYWxsLlxuICogVW50aWwvdW5sZXNzIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTE0MjYgaXMgZml4ZWQsXG4gKiBmb3IgYHx8YC1zdHlsZSBhc3NlcnRpb25zIHdoZXJlIHRoaXMgbG9zcyBvZiBzdGF0aWMgcmVhc29uaW5nIGlzIGEgcHJvYmxlbSxcbiAqIGluc3RlYWQgZXhwcmVzcyB0aGUgYXNzZXJ0aW9uIGFzXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmRpdGlvbikge1xuICogICAgIEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKiBvciwgaWYgbmVlZGVkLFxuICogYGBganNcbiAqICAgaWYgKCFjb25kaXRpb24pIHtcbiAqICAgICAvLyBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cywgYnV0IGl0IGltcHJvdmVzIHN0YXRpYyBhbmFseXNpc1xuICogICAgIHRocm93IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKi9cblxuLyoqXG4gKiBhc3NlcnQgdGhhdCBleHByIGlzIHRydXRoeSwgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWxzIHRvIGRlc2NyaWJlXG4gKiB0aGUgYXNzZXJ0aW9uLiBJdCBpcyBhIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsIGxpa2VcbiAqIGBgYGpzXG4gKiBhc3NlcnQoZXhwciwgZGV0YWlsc2AuLi4uYCk7YFxuICogYGBgXG4gKlxuICogVGhlIGxpdGVyYWwgcG9ydGlvbnMgb2YgdGhlIHRlbXBsYXRlIGFyZSBhc3N1bWVkIG5vbi1zZW5zaXRpdmUsIGFzXG4gKiBhcmUgdGhlIGB0eXBlb2ZgIHR5cGVzIG9mIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzLiBUaGVzZSBhcmVcbiAqIGFzc2VtYmxlZCBpbnRvIHRoZSB0aHJvd24gZXJyb3IgbWVzc2FnZS4gVGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGVcbiAqIHN1YnN0aXR1dGlvbiB2YWx1ZXMgYXJlIGFzc3VtZWQgc2Vuc2l0aXZlLCB0byBiZSByZXZlYWxlZCB0b1xuICogdGhlIGNvbnNvbGUgb25seS4gV2UgYXNzdW1lIG9ubHkgdGhlIHZpcnR1YWwgcGxhdGZvcm0ncyBvd25lciBjYW4gcmVhZFxuICogd2hhdCBpcyB3cml0dGVuIHRvIHRoZSBjb25zb2xlLCB3aGVyZSB0aGUgb3duZXIgaXMgaW4gYSBwcml2aWxlZ2VkXG4gKiBwb3NpdGlvbiBvdmVyIGNvbXB1dGF0aW9uIHJ1bm5pbmcgb24gdGhhdCBwbGF0Zm9ybS5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggdGhlIG5vZGVqcyBhc3NlcnRpb24gbGlicmFyeS5cbiAqXG4gKiBAdHlwZWRlZiB7IEJhc2VBc3NlcnQgJiB7XG4gKiAgIHR5cGVvZjogQXNzZXJ0VHlwZW9mLFxuICogICBlcnJvcjogQXNzZXJ0TWFrZUVycm9yLFxuICogICBmYWlsOiBBc3NlcnRGYWlsLFxuICogICBlcXVhbDogQXNzZXJ0RXF1YWwsXG4gKiAgIHN0cmluZzogQXNzZXJ0U3RyaW5nLFxuICogICBub3RlOiBBc3NlcnROb3RlLFxuICogICBkZXRhaWxzOiBEZXRhaWxzVGFnLFxuICogICBGYWlsOiBGYWlsVGFnLFxuICogICBxdW90ZTogQXNzZXJ0UXVvdGUsXG4gKiAgIG1ha2VBc3NlcnQ6IE1ha2VBc3NlcnQsXG4gKiB9IH0gQXNzZXJ0XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAU/WFv0Y3AABGNwAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzeyJpbXBvcnRzIjpbIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiQW1vdW50TWF0aCIsIkFzc2V0S2luZCIsImFzc2VydEFzc2V0S2luZCIsImFzc2VydFZhbHVlR2V0SGVscGVycyIsImdldEFzc2V0S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZW1vdGFibGUgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1wiLCBbW1wibmF0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKG5hdE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcInNldE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChzZXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChjb3B5U2V0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlCYWdNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAoY29weUJhZ01hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIENvbnN0YW50cyBmb3IgdGhlIGtpbmRzIG9mIGFzc2V0cyB3ZSBzdXBwb3J0LlxuICpcbiAqIEB0eXBlIHt7IE5BVDogJ25hdCcsIFNFVDogJ3NldCcsIENPUFlfU0VUOiAnY29weVNldCcsIENPUFlfQkFHOiAnY29weUJhZycgfX1cbiAqL1xuY29uc3QgQXNzZXRLaW5kPWhhcmRlbih7XG5OQVQ6J25hdCcsXG5TRVQ6J3NldCcsXG5DT1BZX1NFVDonY29weVNldCcsXG5DT1BZX0JBRzonY29weUJhZyd9KTskaOKAjV9vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuXG5jb25zdCBhc3NldEtpbmROYW1lcz1oYXJkZW4oT2JqZWN0LnZhbHVlcyhBc3NldEtpbmQpLnNvcnQoKSk7XG5cbi8qKlxuICogQHBhcmFtIHtBc3NldEtpbmR9IGFsbGVnZWRBS1xuICovXG5jb25zdCBhc3NlcnRBc3NldEtpbmQ9KGFsbGVnZWRBSyk9PntcbmFzc2V0S2luZE5hbWVzLmluY2x1ZGVzKGFsbGVnZWRBSyl8fFxuRmFpbCBgVGhlIGFzc2V0S2luZCAke2FsbGVnZWRBS30gbXVzdCBiZSBvbmUgb2YgJHtxKGFzc2V0S2luZE5hbWVzKX1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKipcbiAqIEFtb3VudHMgZGVzY3JpYmUgZGlnaXRhbCBhc3NldHMuIEZyb20gYW4gYW1vdW50LCB5b3UgY2FuIGxlYXJuIHRoZVxuICogYnJhbmQgb2YgZGlnaXRhbCBhc3NldCBhcyB3ZWxsIGFzIFwiaG93IG11Y2hcIiBvciBcImhvdyBtYW55XCIuIEFtb3VudHNcbiAqIGhhdmUgdHdvIHBhcnRzOiBhIGJyYW5kIChsb29zZWx5IHNwZWFraW5nLCB0aGUgdHlwZSBvZiBkaWdpdGFsXG4gKiBhc3NldCkgYW5kIHRoZSB2YWx1ZSAodGhlIGFuc3dlciB0byBcImhvdyBtdWNoXCIpLiBGb3IgZXhhbXBsZSwgaW5cbiAqIHRoZSBwaHJhc2UgXCI1IGJ1Y2tzXCIsIFwiYnVja3NcIiB0YWtlcyB0aGUgcm9sZSBvZiB0aGUgYnJhbmQgYW5kIHRoZVxuICogdmFsdWUgaXMgNS4gQW1vdW50cyBjYW4gZGVzY3JpYmUgZnVuZ2libGUgYW5kIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiBhc3NldHMuIEFtb3VudHMgYXJlIHBhc3MtYnktY29weSBhbmQgY2FuIGJlIG1hZGUgYnkgYW5kIHNlbnQgdG9cbiAqIGFueW9uZS5cbiAqXG4gKiBUaGUgaXNzdWVyIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBvZiB0aGUgYW1vdW50IGluIHBheW1lbnRzXG4gKiBhbmQgcHVyc2VzLiBUaGUgaXNzdWVyIG11c3QgYmUgYWJsZSB0byBkbyB0aGluZ3Mgc3VjaCBhcyBhZGRcbiAqIGRpZ2l0YWwgYXNzZXRzIHRvIGEgcHVyc2UgYW5kIHdpdGhkcmF3IGRpZ2l0YWwgYXNzZXRzIGZyb20gYSBwdXJzZS5cbiAqIFRvIGRvIHNvLCBpdCBtdXN0IGtub3cgaG93IHRvIGFkZCBhbmQgc3VidHJhY3QgZGlnaXRhbCBhc3NldHMuXG4gKiBSYXRoZXIgdGhhbiBoYXJkLWNvZGluZyBhIHBhcnRpY3VsYXIgc29sdXRpb24sIHdlIGNob3NlIHRvXG4gKiBwYXJhbWV0ZXJpemUgdGhlIGlzc3VlciB3aXRoIGEgY29sbGVjdGlvbiBvZiBwb2x5bW9ycGhpYyBmdW5jdGlvbnMsXG4gKiB3aGljaCB3ZSBjYWxsIGBBbW91bnRNYXRoYC4gVGhlc2UgbWF0aCBmdW5jdGlvbnMgaW5jbHVkZSBjb25jZXB0c1xuICogbGlrZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uXG4gKlxuICogV2UgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjb25mdXNpb24gYXMgdG8gd2hhdCBraW5kIG9mXG4gKiBhc3NldCB3ZSBhcmUgdXNpbmcuIFRodXMsIEFtb3VudE1hdGggaW5jbHVkZXMgY2hlY2tzIG9mIHRoZVxuICogYGJyYW5kYCwgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0LiBJZlxuICogdGhlIHdyb25nIGJyYW5kIGlzIHVzZWQgaW4gQW1vdW50TWF0aCwgYW4gZXJyb3IgaXMgdGhyb3duIGFuZCB0aGVcbiAqIG9wZXJhdGlvbiBkb2VzIG5vdCBzdWNjZWVkLlxuICpcbiAqIEFtb3VudE1hdGggdXNlcyBtYXRoSGVscGVycyB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLCBidXQgdGhlbiBhZGRzXG4gKiB0aGUgYnJhbmQgdG8gdGhlIHJlc3VsdC4gVGhlIGZ1bmN0aW9uIGB2YWx1ZWAgZ2V0cyB0aGUgdmFsdWUgZnJvbVxuICogdGhlIGFtb3VudCBieSByZW1vdmluZyB0aGUgYnJhbmQgKGFtb3VudCAtPiB2YWx1ZSksIGFuZCB0aGVcbiAqIGZ1bmN0aW9uIGBtYWtlYCBhZGRzIHRoZSBicmFuZCB0byBwcm9kdWNlIGFuIGFtb3VudCAodmFsdWUgLT5cbiAqIGFtb3VudCkuIFRoZSBmdW5jdGlvbiBgY29lcmNlYCB0YWtlcyBhbiBhbW91bnQgYW5kIGNoZWNrcyBpdCxcbiAqIHJldHVybmluZyBhbiBhbW91bnQgKGFtb3VudCAtPiBhbW91bnQpLlxuICpcbiAqIEVhY2ggaXNzdWVyIG9mIGRpZ2l0YWwgYXNzZXRzIGhhcyBhbiBhc3NvY2lhdGVkIGJyYW5kIGluIGFcbiAqIG9uZS10by1vbmUgbWFwcGluZy4gSW4gdW50cnVzdGVkIGNvbnRleHRzLCBzdWNoIGFzIGluIGFuYWx5emluZ1xuICogcGF5bWVudHMgYW5kIGFtb3VudHMsIHdlIGNhbiBnZXQgdGhlIGJyYW5kIGFuZCBmaW5kIHRoZSBpc3N1ZXJcbiAqIHdoaWNoIG1hdGNoZXMgdGhlIGJyYW5kLiBUaGUgaXNzdWVyIGFuZCB0aGUgYnJhbmQgbXV0dWFsbHkgdmFsaWRhdGVcbiAqIGVhY2ggb3RoZXIuXG4gKi9cblxuY29uc3QgaGVscGVycz17XG5uYXQ6bmF0TWF0aEhlbHBlcnMsXG5zZXQ6c2V0TWF0aEhlbHBlcnMsXG5jb3B5U2V0OmNvcHlTZXRNYXRoSGVscGVycyxcbmNvcHlCYWc6Y29weUJhZ01hdGhIZWxwZXJzfTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlIHsodmFsdWU6IFYpID0+IEFzc2V0S2luZEZvclZhbHVlPFY+fVxuICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZD0odmFsdWUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsdWUpO1xuaWYocGFzc1N0eWxlPT09J2JpZ2ludCcpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiduYXQnO1xuIH1cbmlmKHBhc3NTdHlsZT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nc2V0JztcbiB9XG5pZihtYXRjaGVzKHZhbHVlLE0uc2V0KCkpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nY29weVNldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLmJhZygpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlCYWcnO1xuIH1cbi8qIFRPRE8gVGhpcyBpc24ndCBxdWl0ZSB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSwgaW4gY2FzZSB2YWx1ZVBhc3NTdHlsZSovXG4vKiBpcyAndGFnZ2VkJy4gV2Ugd291bGQgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgdGFnZ2VkKi9cbi8qIG9iamVjdCBpdCBpcy4qL1xuLyogQWxzbywgdGhpcyBraW5kIG9mIG1hbnVhbCBsaXN0aW5nIGlzIGEgbWFpbnRlbmFuY2UgaGF6YXJkIHdlKi9cbi8qIChUT0RPKSB3aWxsIGVuY291bnRlciB3aGVuIHdlIGV4dGVuZCB0aGUgbWF0aCBoZWxwZXJzIGZ1cnRoZXIuKi9cbnRocm93IEZhaWwgYHZhbHVlICR7dmFsdWV9IG11c3QgYmUgYSBiaWdpbnQsIGNvcHlTZXQsIGNvcHlCYWcsIG9yIGFuIGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHZhbHVlIGlzIGEgdmFsaWQgQW1vdW50TWF0aCBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaGVscGVycy5cbiAqXG4gKiBNYWRlIGF2YWlsYWJsZSBvbmx5IGZvciB0ZXN0aW5nLCBidXQgaXQgaXMgaGFybWxlc3MgZm9yIG90aGVyIHVzZXMuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHBhcmFtIHtWfSB2YWx1ZVxuICogQHJldHVybnMge01hdGhIZWxwZXJzPFY+fVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0VmFsdWVHZXRIZWxwZXJzPSh2YWx1ZSk9PlxuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbmhlbHBlcnNbYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpXTtcblxuLyoqIEB0eXBlIHsoYWxsZWdlZEJyYW5kOiBCcmFuZCwgYnJhbmQ/OiBCcmFuZCkgPT4gdm9pZH0gKi8kaOKAjV9vbmNlLmFzc2VydFZhbHVlR2V0SGVscGVycyhhc3NlcnRWYWx1ZUdldEhlbHBlcnMpO1xuY29uc3Qgb3B0aW9uYWxCcmFuZENoZWNrPShhbGxlZ2VkQnJhbmQsYnJhbmQpPT57XG5pZihicmFuZCE9PXVuZGVmaW5lZCl7XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hbGxlZ2VkQnJhbmQ9PT1icmFuZHx8XG5GYWlsIGBhbW91bnQncyBicmFuZCAke3EoYWxsZWdlZEJyYW5kKX0gZGlkIG5vdCBtYXRjaCBleHBlY3RlZCBicmFuZCAke3EoXG5icmFuZClcbiB9YDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPiB8IHVuZGVmaW5lZH0gYnJhbmRcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczwqPn1cbiAqL1xuY29uc3QgY2hlY2tMUkFuZEdldEhlbHBlcnM9KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0UmVjb3JkKGxlZnRBbW91bnQsJ2xlZnRBbW91bnQnKTtcbmFzc2VydFJlY29yZChyaWdodEFtb3VudCwncmlnaHRBbW91bnQnKTtcbmNvbnN0e3ZhbHVlOmxlZnRWYWx1ZSxicmFuZDpsZWZ0QnJhbmR9PWxlZnRBbW91bnQ7XG5jb25zdHt2YWx1ZTpyaWdodFZhbHVlLGJyYW5kOnJpZ2h0QnJhbmR9PXJpZ2h0QW1vdW50O1xuYXNzZXJ0UmVtb3RhYmxlKGxlZnRCcmFuZCwnbGVmdEJyYW5kJyk7XG5hc3NlcnRSZW1vdGFibGUocmlnaHRCcmFuZCwncmlnaHRCcmFuZCcpO1xub3B0aW9uYWxCcmFuZENoZWNrKGxlZnRCcmFuZCxicmFuZCk7XG5vcHRpb25hbEJyYW5kQ2hlY2socmlnaHRCcmFuZCxicmFuZCk7XG5sZWZ0QnJhbmQ9PT1yaWdodEJyYW5kfHxcbkZhaWwgYEJyYW5kcyBpbiBsZWZ0ICR7cShsZWZ0QnJhbmQpfSBhbmQgcmlnaHQgJHtxKFxucmlnaHRCcmFuZClcbiB9IHNob3VsZCBtYXRjaCBidXQgZG8gbm90YDtcbmNvbnN0IGxlZnRIZWxwZXJzPWFzc2VydFZhbHVlR2V0SGVscGVycyhsZWZ0VmFsdWUpO1xuY29uc3QgcmlnaHRIZWxwZXJzPWFzc2VydFZhbHVlR2V0SGVscGVycyhyaWdodFZhbHVlKTtcbmxlZnRIZWxwZXJzPT09cmlnaHRIZWxwZXJzfHxcbkZhaWwgYFRoZSBsZWZ0ICR7bGVmdEFtb3VudH0gYW5kIHJpZ2h0IGFtb3VudCAke3JpZ2h0QW1vdW50fSBoYWQgZGlmZmVyZW50IGFzc2V0S2luZHNgO1xucmV0dXJuIGxlZnRIZWxwZXJzO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7TWF0aEhlbHBlcnM8QXNzZXRWYWx1ZUZvcktpbmQ8Sz4+fSBoXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcmV0dXJucyB7W0ssIEtdfVxuICovXG5jb25zdCBjb2VyY2VMUj0oaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KT0+e1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBhcmJpdHJhcnkgc3VidHlwZSovXG5yZXR1cm5baC5kb0NvZXJjZShsZWZ0QW1vdW50LnZhbHVlKSxoLmRvQ29lcmNlKHJpZ2h0QW1vdW50LnZhbHVlKV07XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZVxuICogcmlnaHRBbW91bnQuIFRoZSBub3Rpb24gb2YgXCJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cIiBkZXBlbmRzXG4gKiBvbiB0aGUga2luZCBvZiBhbW91bnQsIGFzIGRlZmluZWQgYnkgdGhlIE1hdGhIZWxwZXJzLiBGb3IgZXhhbXBsZSxcbiAqIHdoZXRoZXIgcmVjdGFuZ2xlIEEgaXMgZ3JlYXRlciB0aGFuIHJlY3RhbmdsZSBCIGRlcGVuZHMgb24gd2hldGhlciByZWN0YW5nbGVcbiAqIEEgaW5jbHVkZXMgcmVjdGFuZ2xlIEIgYXMgZGVmaW5lZCBieSB0aGUgbG9naWMgaW4gTWF0aEhlbHBlcnMuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc0dURT0obGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xucmV0dXJuIGguZG9Jc0dURSguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbiB9O1xuXG4vKipcbiAqIExvZ2ljIGZvciBtYW5pcHVsYXRpbmcgYW1vdW50cy5cbiAqXG4gKiBBbW91bnRzIGFyZSB0aGUgY2Fub25pY2FsIGRlc2NyaXB0aW9uIG9mIHRyYWRhYmxlIGdvb2RzLiBUaGV5IGFyZSBtYW5pcHVsYXRlZFxuICogYnkgaXNzdWVycyBhbmQgbWludHMsIGFuZCByZXByZXNlbnQgdGhlIGdvb2RzIGFuZCBjdXJyZW5jeSBjYXJyaWVkIGJ5IHB1cnNlc1xuICogYW5kXG4gKiBwYXltZW50cy4gVGhleSBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgdGhpbmdzIGxpa2UgY3VycmVuY3ksIHN0b2NrLCBhbmQgdGhlXG4gKiBhYnN0cmFjdCByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgZXhjaGFuZ2UuXG4gKi9cbmNvbnN0IEFtb3VudE1hdGg9e1xuLyoqXG4gKiBNYWtlIGFuIGFtb3VudCBmcm9tIGEgdmFsdWUgYnkgYWRkaW5nIHRoZSBicmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59IGFsbGVnZWRWYWx1ZVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuLyogYWxsZWdlZFZhbHVlIGhhcyBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gZm9yIHR5cGUgd2lkZW5pbmcsIHRvIHByZXZlbnQgViBiZWluZyBib3VuZCB0byBhIGEgbGl0ZXJhbCBsaWtlIDFuKi9cbm1ha2U6KGJyYW5kLGFsbGVnZWRWYWx1ZSk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmNvbnN0IGg9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFsbGVnZWRWYWx1ZSk7XG5jb25zdCB2YWx1ZT1oLmRvQ29lcmNlKGFsbGVnZWRWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIE1ha2Ugc3VyZSB0aGlzIGFtb3VudCBpcyB2YWxpZCBlbm91Z2gsIGFuZCByZXR1cm4gYSBjb3JyZXNwb25kaW5nXG4gKiB2YWxpZCBhbW91bnQgaWYgc28uXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYWxsZWdlZEFtb3VudFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuY29lcmNlOihicmFuZCxhbGxlZ2VkQW1vdW50KT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0UmVjb3JkKGFsbGVnZWRBbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQ6YWxsZWdlZEJyYW5kLHZhbHVlOmFsbGVnZWRWYWx1ZX09YWxsZWdlZEFtb3VudDtcbmJyYW5kPT09YWxsZWdlZEJyYW5kfHxcbkZhaWwgYFRoZSBicmFuZCBpbiB0aGUgYWxsZWdlZEFtb3VudCAke2FsbGVnZWRBbW91bnR9IGluICdjb2VyY2UnIGRpZG4ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIGJyYW5kICR7YnJhbmR9LmA7XG4vKiBXaWxsIHRocm93IG9uIGluYXBwcm9wcmlhdGUgdmFsdWUqL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCxhbGxlZ2VkVmFsdWUpO1xuIH0sXG4vKipcbiAqIEV4dHJhY3QgYW5kIHJldHVybiB0aGUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59XG4gKi9cbmdldFZhbHVlOihicmFuZCxhbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbW91bnQpLnZhbHVlLFxuLyoqXG4gKiBSZXR1cm4gdGhlIGFtb3VudCByZXByZXNlbnRpbmcgYW4gZW1wdHkgYW1vdW50LiBUaGlzIGlzIHRoZVxuICogaWRlbnRpdHkgZWxlbWVudCBmb3IgTWF0aEhlbHBlcnMuYWRkIGFuZCBNYXRIZWxwZXJzLnN1YnRyYWN0LlxuICpcbiAqIEB0eXBlIHt7XG4gKiAgIChicmFuZDogQnJhbmQpOiBBbW91bnQ8J25hdCc+O1xuICogICA8SyBleHRlbmRzIEFzc2V0S2luZD4oYnJhbmQ6IEJyYW5kLCBhc3NldEtpbmQ6IEspOiBBbW91bnQ8Sz47XG4gKiB9fVxuICovXG5tYWtlRW1wdHk6KGJyYW5kLGFzc2V0S2luZD0vKiogQHR5cGUge2NvbnN0fSAqLyduYXQnKT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5jb25zdCB2YWx1ZT1oZWxwZXJzW2Fzc2V0S2luZF0uZG9NYWtlRW1wdHkoKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudCwgdXNpbmcgYW5vdGhlclxuICogYW1vdW50IGFzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGJyYW5kIGFuZCBhc3NldEtpbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbW91bnRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1ha2VFbXB0eUZyb21BbW91bnQ6KGFtb3VudCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQsdmFsdWV9PWFtb3VudDtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5jb25zdCBhc3NldEtpbmQ9YXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgQW1vdW50IGlzIGVtcHR5LiBPdGhlcndpc2UgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzRW1wdHk6KGFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kOmFsbGVnZWRCcmFuZCx2YWx1ZX09YW1vdW50O1xuYXNzZXJ0UmVtb3RhYmxlKGFsbGVnZWRCcmFuZCwnYnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhhbGxlZ2VkQnJhbmQsYnJhbmQpO1xuY29uc3QgaD1hc3NlcnRWYWx1ZUdldEhlbHBlcnModmFsdWUpO1xucmV0dXJuIGguZG9Jc0VtcHR5KGguZG9Db2VyY2UodmFsdWUpKTtcbiB9LFxuaXNHVEUsXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBlcXVhbHMgdGhlIHJpZ2h0QW1vdW50LiBXZSBhc3N1bWVcbiAqIHRoYXQgaWYgaXNHVEUgaXMgdHJ1ZSBpbiBib3RoIGRpcmVjdGlvbnMsIGlzRXF1YWwgaXMgYWxzbyB0cnVlXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0VxdWFsOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5yZXR1cm4gaC5kb0lzRXF1YWwoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgdW5pb24gb2YgYm90aCBsZWZ0QW1vdW50IGFuZCByaWdodEFtb3VudC5cbiAqXG4gKiBGb3IgZnVuZ2libGUgYW1vdW50IHRoaXMgbWVhbnMgYWRkaW5nIHRoZSB2YWx1ZXMuIEZvciBvdGhlciBraW5kcyBvZlxuICogYW1vdW50LCBpdCB1c3VhbGx5IG1lYW5zIGluY2x1ZGluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gYm90aFxuICogbGVmdCBhbmQgcmlnaHQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbmFkZDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb0FkZCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSBsZWZ0QW1vdW50IG1pbnVzIHRoZSByaWdodEFtb3VudFxuICogKGkuZS4gZXZlcnl0aGluZyBpbiB0aGUgbGVmdEFtb3VudCB0aGF0IGlzIG5vdCBpbiB0aGVcbiAqIHJpZ2h0QW1vdW50KS4gSWYgbGVmdEFtb3VudCBkb2Vzbid0IGluY2x1ZGUgcmlnaHRBbW91bnRcbiAqIChzdWJ0cmFjdGlvbiByZXN1bHRzIGluIGEgbmVnYXRpdmUpLCB0aHJvdyAgYW4gZXJyb3IuIEJlY2F1c2UgdGhlXG4gKiBsZWZ0IGFtb3VudCBtdXN0IGluY2x1ZGUgdGhlIHJpZ2h0IGFtb3VudCwgdGhpcyBpcyBOT1QgZXF1aXZhbGVudFxuICogdG8gc2V0IHN1YnRyYWN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5zdWJ0cmFjdDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb1N1YnRyYWN0KC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQ6bGVmdEFtb3VudC5icmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbiB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IHhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB5XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5taW46KHgseSxicmFuZD11bmRlZmluZWQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5pc0dURSh4LHksYnJhbmQpP1xueTpcbmlzR1RFKHkseCxicmFuZCk/XG54OlxuRmFpbCBgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYCxcbi8qKlxuICogUmV0dXJucyB0aGUgbWF4IHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHlcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1heDooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbmlzR1RFKHgseSxicmFuZCk/XG54OlxuaXNHVEUoeSx4KT9cbnk6XG5GYWlsIGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgfTskaOKAjV9vbmNlLkFtb3VudE1hdGgoQW1vdW50TWF0aCk7XG5cbmhhcmRlbihBbW91bnRNYXRoKTtcblxuLyoqXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKi9cbmNvbnN0IGdldEFzc2V0S2luZD0oYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHt2YWx1ZX09YW1vdW50O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuIH07JGjigI1fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkFzc2V0S2luZCI6WyJBc3NldEtpbmQiXSwiYXNzZXJ0QXNzZXRLaW5kIjpbImFzc2VydEFzc2V0S2luZCJdLCJBbW91bnRNYXRoIjpbIkFtb3VudE1hdGgiXSwiZ2V0QXNzZXRLaW5kIjpbImdldEFzc2V0S2luZCJdLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiOlsiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEqUAO3VBQAA1QUAACcAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvZGlzcGxheUluZm8uanN7ImltcG9ydHMiOlsiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29lcmNlRGlzcGxheUluZm8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFpbCxtdXN0TWF0Y2gsRGlzcGxheUluZm9TaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkRpc3BsYXlJbmZvU2hhcGVcIiwgWyRo4oCNX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGFsbGVnZWREaXNwbGF5SW5mb1xuICogQHBhcmFtIHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHJldHVybnMge0Rpc3BsYXlJbmZvfVxuICovXG5jb25zdCAgICAgICAgY29lcmNlRGlzcGxheUluZm89KGFsbGVnZWREaXNwbGF5SW5mbyxhc3NldEtpbmQpPT57XG5tdXN0TWF0Y2goYWxsZWdlZERpc3BsYXlJbmZvLERpc3BsYXlJbmZvU2hhcGUsJ2Rpc3BsYXlJbmZvJyk7XG5cbmlmKGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQhPT11bmRlZmluZWQpe1xuYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZD09PWFzc2V0S2luZHx8XG5GYWlsIGBkaXNwbGF5SW5mby5hc3NldEtpbmQgd2FzIHByZXNlbnQgKCR7YWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZH0pIGFuZCBkaWQgbm90IG1hdGNoIHRoZSBhc3NldEtpbmQgYXJndW1lbnQgKCR7YXNzZXRLaW5kfSlgO1xuIH1cbmNvbnN0IGRpc3BsYXlJbmZvPWhhcmRlbih7Li4uYWxsZWdlZERpc3BsYXlJbmZvLGFzc2V0S2luZH0pO1xuXG5pZihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzIT09dW5kZWZpbmVkKXtcbk51bWJlci5pc1NhZmVJbnRlZ2VyKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMpfHxcbkZhaWwgYGRlY2ltYWxQbGFjZXMgJHtkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzfSBpcyBub3QgYSBzYWZlIGludGVnZXJgO1xuIH1cblxucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH07JGjigI1fb25jZS5jb2VyY2VEaXNwbGF5SW5mbyhjb2VyY2VEaXNwbGF5SW5mbyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29lcmNlRGlzcGxheUluZm8iOlsiY29lcmNlRGlzcGxheUluZm8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQzB73OgBAADoAQAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtdXSxbXCIuL2lzc3VlcktpdC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA1XcEomCAAAJggAAAlAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2lzc3VlcktpdC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbImhhc0lzc3VlciIsIm1ha2VEdXJhYmxlSXNzdWVyS2l0IiwibWFrZUlzc3VlcktpdCIsInByZXBhcmVJc3N1ZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LGFzc2VydFBhdHRlcm4sbWFrZVNjYWxhckJpZ01hcFN0b3JlLEFzc2V0S2luZCxhc3NlcnRBc3NldEtpbmQsY29lcmNlRGlzcGxheUluZm8scHJlcGFyZVBheW1lbnRMZWRnZXI7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0QXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChhc3NlcnRBc3NldEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9kaXNwbGF5SW5mby5qc1wiLCBbW1wiY29lcmNlRGlzcGxheUluZm9cIiwgWyRo4oCNX2EgPT4gKGNvZXJjZURpc3BsYXlJbmZvID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudExlZGdlci5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRMZWRnZXJcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVQYXltZW50TGVkZ2VyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlclJlY29yZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kXG4gKiBAcHJvcGVydHkge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmQ8Sz59IGlzc3VlclJlY29yZFxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3Qgc2V0dXBJc3N1ZXJLaXQ9KFxue25hbWUsYXNzZXRLaW5kLGRpc3BsYXlJbmZvLGVsZW1lbnRTaGFwZX0sXG5pc3N1ZXJCYWdnYWdlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5hc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcblxuLyogQWRkIGFzc2V0S2luZCB0byBkaXNwbGF5SW5mbywgb3Igb3ZlcnJpZGUgaWYgcHJlc2VudCovXG5jb25zdCBjbGVhbkRpc3BsYXlJbmZvPWNvZXJjZURpc3BsYXlJbmZvKGRpc3BsYXlJbmZvLGFzc2V0S2luZCk7XG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwnZnVuY3Rpb24nKTtcbiB9XG5cbmlmKGVsZW1lbnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gfVxuXG4vKiBBdHRlbnVhdGUgdGhlIHBvd2VyZnVsIGF1dGhvcml0eSB0byBtaW50IGFuZCBjaGFuZ2UgYmFsYW5jZXMqL1xuLyoqIEB0eXBlIHtQYXltZW50TGVkZ2VyPEs+fSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuY29uc3R7aXNzdWVyLG1pbnQsYnJhbmQsbWludFJlY292ZXJ5UHVyc2V9PXByZXBhcmVQYXltZW50TGVkZ2VyKFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5jbGVhbkRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5icmFuZCxcbmlzc3Vlcixcbm1pbnQsXG5taW50UmVjb3ZlcnlQdXJzZSxcbmRpc3BsYXlJbmZvOmNsZWFuRGlzcGxheUluZm99KTtcblxuIH07XG5oYXJkZW4oc2V0dXBJc3N1ZXJLaXQpO1xuXG4vKiogVGhlIGtleSBhdCB3aGljaCB0aGUgaXNzdWVyIHJlY29yZCBpcyBzdG9yZWQuICovXG5jb25zdCBJTlNUQU5DRV9LRVk9J2lzc3Vlcic7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgaXNzdWVyUmVjb3JkPWlzc3VlckJhZ2dhZ2UuZ2V0KElOU1RBTkNFX0tFWSk7XG5yZXR1cm4gc2V0dXBJc3N1ZXJLaXQoaXNzdWVyUmVjb3JkLGlzc3VlckJhZ2dhZ2Usb3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVJc3N1ZXJLaXQocHJlcGFyZUlzc3VlcktpdCk7XG5oYXJkZW4ocHJlcGFyZUlzc3VlcktpdCk7XG5cbi8qKlxuICogRG9lcyBiYWdnYWdlIGFscmVhZHkgaGF2ZSBhbiBpc3N1ZXIgZnJvbSBwcmVwYXJlSXNzdWVyS2l0KCk/XG4gKiBUaGF0IGlzOiBkb2VzIGl0IGhhdmUgdGhlIHJlbGV2YW50IGtleXMgZGVmaW5lZD9cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuY29uc3QgICAgICAgIGhhc0lzc3Vlcj0oYmFnZ2FnZSk9PmJhZ2dhZ2UuaGFzKElOU1RBTkNFX0tFWSk7XG5cbi8qKlxuICogQHR5cGVkZWYge1BhcnRpYWw8e2VsZW1lbnRTaGFwZTogUGF0dGVybn0+fSBJc3N1ZXJPcHRpb25zUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldCBkZXNjcmlwdGlvbnMuXG4gKiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS5cbiAqIEZvciBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXRcbiAqIGl0IGlzIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmdcbiAqIHRvIHRoYXQgaXNzdWVyIGFuZCBicmFuZC5cbiAqXG4gKiBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVyc1xuICogZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9QXNzZXRLaW5kLk5BVF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm89e31dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi8kaOKAjV9vbmNlLmhhc0lzc3VlcihoYXNJc3N1ZXIpO1xuY29uc3QgICAgICAgIG1ha2VEdXJhYmxlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBpc3N1ZXJEYXRhPWhhcmRlbih7bmFtZSxhc3NldEtpbmQsZGlzcGxheUluZm8sZWxlbWVudFNoYXBlfSk7XG5pc3N1ZXJCYWdnYWdlLmluaXQoSU5TVEFOQ0VfS0VZLGlzc3VlckRhdGEpO1xucmV0dXJuIHNldHVwSXNzdWVyS2l0KGlzc3VlckRhdGEsaXNzdWVyQmFnZ2FnZSxvcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcbiB9OyRo4oCNX29uY2UubWFrZUR1cmFibGVJc3N1ZXJLaXQobWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9J25hdCddXG4gKiBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0IGRlc2NyaXB0aW9ucy5cbiAqIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLlxuICogRm9yIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dFxuICogaXQgaXMgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZ1xuICogdG8gdGhhdCBpc3N1ZXIgYW5kIGJyYW5kLlxuICpcbiAqIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzXG4gKiBmcm9tIHRoZSBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZVxuICogZGVmYXVsdCwgaXMgdXNlZCBmb3IgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9J25hdCddXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvPXt9XVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUlzc3VlcktpdD0oXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG5cbm1ha2VEdXJhYmxlSXNzdWVyS2l0KFxubWFrZVNjYWxhckJpZ01hcFN0b3JlKCdkcm9wcGVkIGlzc3VlciBraXQnLHtkdXJhYmxlOnRydWV9KSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG57ZWxlbWVudFNoYXBlfSk7JGjigI1fb25jZS5tYWtlSXNzdWVyS2l0KG1ha2VJc3N1ZXJLaXQpO1xuXG5oYXJkZW4obWFrZUlzc3VlcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZUlzc3VlcktpdCI6WyJwcmVwYXJlSXNzdWVyS2l0Il0sImhhc0lzc3VlciI6WyJoYXNJc3N1ZXIiXSwibWFrZUR1cmFibGVJc3N1ZXJLaXQiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiXSwibWFrZUlzc3VlcktpdCI6WyJtYWtlSXNzdWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJOx9DeNFgAAjRYAADIAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbGVnYWN5LXBheW1lbnQtaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsiY2xhaW0iLCJjb21iaW5lIiwic3BsaXQiLCJzcGxpdE1hbnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbXVzdE1hdGNoLEUsQW1vdW50TWF0aDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEBmaWxlXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgc2FmZXIgaGVscGVyIGZ1bmN0aW9uIGFsdGVybmF0aXZlcyB0byB0aGVcbiAqIHNpbWlsYXJseSBuYW1lZCBtZXRob2RzIG9uIGlzc3Vlci5cbiAqIFRoZXNlIGFyZSBwYXJhbWV0ZXJpemVkIGJ5IGEgcHVyc2UgdXNlZCBmb3IgcmVjb3ZlcmluZyBsb3N0IHBheW1lbnRzLCB3aGljaFxuICogd2UgY2FsbCBhIGByZWNvdmVyeVB1cnNlYC4gQW55IHBheW1lbnRzIGNyZWF0ZWQgYnkgdGhlc2VcbiAqIGhlbHBlciBmdW5jdGlvbnMgYXJlIGluIHRoZSByZWNvdmVyeSBzZXQgb2YgdGhhdCBgcmVjb3ZlcnlQdXJzZWAgdW50aWxcbiAqIG90aGVyd2lzZSB1c2VkIHVwLlxuICpcbiAqIE9uZSBvZiB0aGVzZSBoZWxwZXIgZnVuY3Rpb25zIGlzIGxlc3Mgc2FmZSBpbiBvbmUgd2F5OlxuICogYGNvbWJpbmVgIGlzIG5vdCBmYWlsdXJlIGF0b21pYy4gSWYgdGhlIGBjb21iaW5lYCBoZWxwZXIgZnVuY3Rpb25cbiAqIGZhaWxzLCBzb21lIG9mIHRoZSBpbnB1dCBwYXltZW50cyBtYXkgaGF2ZSBiZWVuIHVzZWQgdXAuIEhvd2V2ZXIsIGV2ZW5cbiAqIGluIHRoYXQgY2FzZSwgbm8gYXNzZXRzIHdvdWxkIGJlIGxvc3QuIFRoZSBhc3NldHMgZnJvbSB0aGUgdXNlZCB1cCBwYXltZW50c1xuICogd2lsbCBiZSBpbiB0aGUgYXJndW1lbnQgYHJlY292ZXJ5UHVyc2VgLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7RVJlZjxQdXJzZTxLPj59IHJlY292ZXJ5UHVyc2VcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+Pn0gc3JjUGF5bWVudFBcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cbmNvbnN0ICAgICAgICBjbGFpbT1hc3luYyhcbnJlY292ZXJ5UHVyc2UsXG5zcmNQYXltZW50UCxcbm9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCk9Plxue1xuY29uc3Qgc3JjUGF5bWVudD1hd2FpdCBzcmNQYXltZW50UDtcbnJldHVybiBFLndoZW4oRShyZWNvdmVyeVB1cnNlKS5kZXBvc2l0KHNyY1BheW1lbnQsb3B0QW1vdW50U2hhcGUpLChhbW91bnQpPT5cbkUocmVjb3ZlcnlQdXJzZSkud2l0aGRyYXcoYW1vdW50KSk7XG5cbiB9OyRo4oCNX29uY2UuY2xhaW0oY2xhaW0pO1xuaGFyZGVuKGNsYWltKTtcblxuLyoqXG4gKiBOb3RlOiBOb3QgZmFpbHVyZSBhdG9taWMuIEJ1dCBhcyBsb25nIGFzIHlvdSBkb24ndCBsb3NlIHRoZSBhcmd1bWVudFxuICogYHJlY292ZXJ5UHVyc2VgLCBubyBhc3NldHMgYXJlIGxvc3QuXG4gKiBJZiBhbnkgb2YgdGhlIGRlcG9zaXRzIGZhaWwsIG9yIHRoZSB0b3RhbCBkb2VzIG5vdFxuICogbWF0Y2ggb3B0VG90YWxBbW91bnQsIHNvbWUgcGF5bWVudHMgbWF5IHN0aWxsIGhhdmUgYmVlbiBkZXBvc2l0ZWQuIFRob3NlXG4gKiBhc3NldHMgd2lsbCBiZSBpbiB0aGUgYXJndW1lbnQgYHJlY292ZXJ5UHVyc2VgLiBBbGwgdW5kZXBvc2l0ZWQgcGF5bWVudHNcbiAqIHdpbGwgc3RpbGwgYmUgaW4gdGhlIHJlY292ZXJ5IHNldHMgb2YgdGhlaXIgcHVyc2VzIG9mIG9yaWdpbi5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtFUmVmPFB1cnNlPEs+Pn0gcmVjb3ZlcnlQdXJzZVxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+W119IHNyY1BheW1lbnRzUHNcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdFRvdGFsQW1vdW50XVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cbmNvbnN0ICAgICAgICBjb21iaW5lPWFzeW5jKFxucmVjb3ZlcnlQdXJzZSxcbnNyY1BheW1lbnRzUHMsXG5vcHRUb3RhbEFtb3VudD11bmRlZmluZWQpPT5cbntcbmNvbnN0IGJyYW5kUD1FKHJlY292ZXJ5UHVyc2UpLmdldEFsbGVnZWRCcmFuZCgpO1xuY29uc3RbYnJhbmQsZGlzcGxheUluZm8sLi4uc3JjUGF5bWVudHNdPWF3YWl0IFByb21pc2UuYWxsKFtcbmJyYW5kUCxcbkUoYnJhbmRQKS5nZXREaXNwbGF5SW5mbygpLFxuLi4uc3JjUGF5bWVudHNQc10pO1xuXG5jb25zdCBlbXB0eUFtb3VudD1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxkaXNwbGF5SW5mby5hc3NldEtpbmQpO1xuY29uc3QgYW1vdW50UHM9c3JjUGF5bWVudHMubWFwKChzcmNQYXltZW50KT0+XG5FKHJlY292ZXJ5UHVyc2UpLmRlcG9zaXQoc3JjUGF5bWVudCkpO1xuXG5jb25zdCBhbW91bnRzPWF3YWl0IFByb21pc2UuYWxsKGFtb3VudFBzKTtcbmNvbnN0IHRvdGFsPWFtb3VudHMucmVkdWNlKFxuKHgseSk9PkFtb3VudE1hdGguYWRkKHgseSxicmFuZCksXG5lbXB0eUFtb3VudCk7XG5cbmlmKG9wdFRvdGFsQW1vdW50IT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaCh0b3RhbCxvcHRUb3RhbEFtb3VudCwnYW1vdW50Jyk7XG4gfVxucmV0dXJuIEUocmVjb3ZlcnlQdXJzZSkud2l0aGRyYXcodG90YWwpO1xuIH07JGjigI1fb25jZS5jb21iaW5lKGNvbWJpbmUpO1xuaGFyZGVuKGNvbWJpbmUpO1xuXG4vKipcbiAqIE5vdGU6IE5vdCBmYWlsdXJlIGF0b21pYy4gQnV0IGFzIGxvbmcgYXMgeW91IGRvbid0IGxvc2UgdGhlIGFyZ3VtZW50XG4gKiBgcmVjb3ZlcnlQdXJzZWAsIG5vIGFzc2V0cyBhcmUgbG9zdC5cbiAqIElmIHRoZSBhbW91bnQgaW4gYHNyY1BheW1lbnRQYCBpcyBub3QgPj0gYHBheW1lbnRBbW91bnRBYCwgdGhlIHBheW1lbnQgbWF5XG4gKiBzdGlsbCBiZSBkZXBvc2l0ZWQgYW55d2F5LCBiZWZvcmUgZmFpbGluZyBpbiB0aGUgc3Vic2VxdWVudCBzdWJ0cmFjdC5cbiAqIEluIHRoYXQgY2FzZSwgdGhvc2VcbiAqIGFzc2V0cyB3aWxsIGJlIGluIHRoZSBhcmd1bWVudCBgcmVjb3ZlcnlQdXJzZWAuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7RVJlZjxQdXJzZTxLPj59IHJlY292ZXJ5UHVyc2VcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+Pn0gc3JjUGF5bWVudFBcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBwYXltZW50QW1vdW50QVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPltdPn1cbiAqL1xuY29uc3QgICAgICAgIHNwbGl0PWFzeW5jKHJlY292ZXJ5UHVyc2Usc3JjUGF5bWVudFAscGF5bWVudEFtb3VudEEpPT57XG5jb25zdCBzcmNQYXltZW50PWF3YWl0IHNyY1BheW1lbnRQO1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNzE5MyB3aGljaCBleHBsYWlucyovXG4vKiBob3cgd2Ugd291bGQgbGlrZSB0byB3cml0ZSB0aGUgZm9sbG93aW5nIGxpbmUsIGFuZCB3aHkgd2UgY2Fubm90IHlldCBkbyBzby4qL1xuY29uc3Qgc3JjQW1vdW50PWF3YWl0IEUocmVjb3ZlcnlQdXJzZSkuZGVwb3NpdChzcmNQYXltZW50KTtcbmNvbnN0IHBheW1lbnRBbW91bnRCPUFtb3VudE1hdGguc3VidHJhY3Qoc3JjQW1vdW50LHBheW1lbnRBbW91bnRBKTtcbnJldHVybiBQcm9taXNlLmFsbChbXG5FKHJlY292ZXJ5UHVyc2UpLndpdGhkcmF3KHBheW1lbnRBbW91bnRBKSxcbkUocmVjb3ZlcnlQdXJzZSkud2l0aGRyYXcocGF5bWVudEFtb3VudEIpXSk7XG5cbiB9OyRo4oCNX29uY2Uuc3BsaXQoc3BsaXQpO1xuaGFyZGVuKHNwbGl0KTtcblxuLyoqXG4gKiBOb3RlOiBOb3QgZmFpbHVyZSBhdG9taWMuIEJ1dCBhcyBsb25nIGFzIHlvdSBkb24ndCBsb3NlIHRoZSBhcmd1bWVudFxuICogYHJlY292ZXJ5UHVyc2VgLCBubyBhc3NldHMgYXJlIGxvc3QuXG4gKiBJZiB0aGUgYW1vdW50IGluIGBzcmNQYXltZW50UGAgaXMgZXhhY3RseSB0aGUgc3VtIG9mIHRoZSBhbW91bnRzLFxuICogdGhlIHBheW1lbnQgbWF5XG4gKiBzdGlsbCBiZSBkZXBvc2l0ZWQgYW55d2F5LCBiZWZvcmUgZmFpbGluZyBpbiB0aGUgc3Vic2VxdWVudCBlcXVhbGl0eSBjaGVjay5cbiAqIEluIHRoYXQgY2FzZSwgdGhvc2VcbiAqIGFzc2V0cyB3aWxsIGJlIGluIHRoZSBhcmd1bWVudCBgcmVjb3ZlcnlQdXJzZWAuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7RVJlZjxQdXJzZTxLPj59IHJlY292ZXJ5UHVyc2VcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+Pn0gc3JjUGF5bWVudFBcbiAqIEBwYXJhbSB7QW1vdW50PEs+W119IGFtb3VudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnRbXT59XG4gKi9cbmNvbnN0ICAgICAgICBzcGxpdE1hbnk9YXN5bmMocmVjb3ZlcnlQdXJzZSxzcmNQYXltZW50UCxhbW91bnRzKT0+e1xuY29uc3Qgc3JjUGF5bWVudD1hd2FpdCBzcmNQYXltZW50UDtcbi8qIElmIHdlIGNvdWxkIGNhbGN1bGF0ZSBgdG90YWxgIGJlZm9yZSB0aGUgYGRlcG9zaXRgLCB0aGVuIHdlKi9cbi8qIGNvdWxkIHVzZSB0aGUgYHRvdGFsYCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBkZXBvc2l0YCBhbmQgYmUqL1xuLyogZmFpbHVyZSBhdG9taWMuIEJ1dCB0aGlzIHdvdWxkIHJlcXVpcmUgbWFraW5nIGFuIGVtcHR5IGFtb3VudCBmaXJzdCwqL1xuLyogd2hpY2ggaXMgcG9zc2libGUsIGJ1dCB0b28gbXVjaCB0cm91YmxlIGZvciBhIGRlcHJlY2F0ZWQgbGVnYWN5IHN1cHBvcnQqL1xuLyogbWV0aG9kLiovXG5jb25zdCBzcmNBbW91bnQ9YXdhaXQgRShyZWNvdmVyeVB1cnNlKS5kZXBvc2l0KHNyY1BheW1lbnQpO1xuY29uc3QgYnJhbmQ9c3JjQW1vdW50LmJyYW5kO1xuY29uc3QgZW1wdHlBbW91bnQ9QW1vdW50TWF0aC5tYWtlRW1wdHlGcm9tQW1vdW50KHNyY0Ftb3VudCk7XG5jb25zdCB0b3RhbD1hbW91bnRzLnJlZHVjZShcbih4LHkpPT5BbW91bnRNYXRoLmFkZCh4LHksYnJhbmQpLFxuZW1wdHlBbW91bnQpO1xuXG5BbW91bnRNYXRoLmlzRXF1YWwoc3JjQW1vdW50LHRvdGFsKXx8XG5GYWlsIGByaWdodHMgd2VyZSBub3QgY29uc2VydmVkOiAke3RvdGFsfSB2cyAke3NyY0Ftb3VudH1gO1xuXG5yZXR1cm4gUHJvbWlzZS5hbGwoYW1vdW50cy5tYXAoKGFtb3VudCk9PkUocmVjb3ZlcnlQdXJzZSkud2l0aGRyYXcoYW1vdW50KSkpO1xuIH07JGjigI1fb25jZS5zcGxpdE1hbnkoc3BsaXRNYW55KTtcbmhhcmRlbihzcGxpdE1hbnkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNsYWltIjpbImNsYWltIl0sImNvbWJpbmUiOlsiY29tYmluZSJdLCJzcGxpdCI6WyJzcGxpdCJdLCJzcGxpdE1hbnkiOlsic3BsaXRNYW55Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIDIbu6zBQAAswUAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGtleUVRLG1ha2VDb3B5QmFnLG11c3RNYXRjaCxNLGdldENvcHlCYWdFbnRyaWVzLGJhZ0lzU3VwZXJiYWcsYmFnVW5pb24sYmFnRGlzam9pbnRTdWJ0cmFjdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5QmFnXCIsIFskaOKAjV9hID0+IChtYWtlQ29weUJhZyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5QmFnRW50cmllcyA9ICRo4oCNX2EpXV0sW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjigI1fYSA9PiAoYmFnSXNTdXBlcmJhZyA9ICRo4oCNX2EpXV0sW1wiYmFnVW5pb25cIiwgWyRo4oCNX2EgPT4gKGJhZ1VuaW9uID0gJGjigI1fYSldXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChiYWdEaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q29weUJhZ30gKi9cbmNvbnN0IGVtcHR5PW1ha2VDb3B5QmFnKFtdKTtcblxuLyoqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weUJhZz59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5QmFnTWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihiYWcpPT57XG5tdXN0TWF0Y2goYmFnLE0uYmFnKCksJ2JhZyBvZiBhbW91bnQnKTtcbnJldHVybiBiYWc7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooYmFnKT0+Z2V0Q29weUJhZ0VudHJpZXMoYmFnKS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpiYWdJc1N1cGVyYmFnLFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6YmFnVW5pb24sXG5kb1N1YnRyYWN0OmJhZ0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLmNvcHlCYWdNYXRoSGVscGVycyhjb3B5QmFnTWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlCYWdNYXRoSGVscGVycyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAcediPccFAADHBQAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQga2V5RVEsbWFrZUNvcHlTZXQsbXVzdE1hdGNoLE0sZ2V0Q29weVNldEtleXMsc2V0SXNTdXBlcnNldCxzZXREaXNqb2ludFVuaW9uLHNldERpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaOKAjV9hKV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2EgPT4gKHNldElzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50VW5pb25cIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50VW5pb24gPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50U3VidHJhY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtDb3B5U2V0fSAqL1xuY29uc3QgZW1wdHk9bWFrZUNvcHlTZXQoW10pO1xuXG4vKipcbiAqIEB0eXBlIHtNYXRoSGVscGVyczxDb3B5U2V0Pn1cbiAqL1xuY29uc3QgICAgICAgIGNvcHlTZXRNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KHNldCk9Pntcbm11c3RNYXRjaChzZXQsTS5zZXQoKSwnc2V0IG9mIGFtb3VudCcpO1xucmV0dXJuIHNldDtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihzZXQpPT5nZXRDb3B5U2V0S2V5cyhzZXQpLmxlbmd0aD09PTAsXG5kb0lzR1RFOnNldElzU3VwZXJzZXQsXG5kb0lzRXF1YWw6a2V5RVEsXG5kb0FkZDpzZXREaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDpzZXREaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5U2V0TWF0aEhlbHBlcnMiOlsiY29weVNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP/csPsqBgAAKgYAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm5hdE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxpc05hdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXSxbXCJpc05hdFwiLCBbJGjigI1fYSA9PiAoaXNOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5jb25zdCBlbXB0eT0wbjtcblxuLyoqXG4gKiBGdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB1c2UgdGhlIG5hdE1hdGhIZWxwZXJzIHRvIG1hbmFnZSBiYWxhbmNlcyAtXG4gKiB0aGUgb3BlcmF0aW9ucyBhcmUgbWVyZWx5IGFyaXRobWV0aWMgb24gbmF0dXJhbCwgbm9uLW5lZ2F0aXZlXG4gKiBudW1iZXJzLlxuICpcbiAqIE5hdHVyYWwgbnVtYmVycyBhcmUgdXNlZCBmb3IgZnVuZ2libGUgZXJpZ2h0cyBzdWNoIGFzIG1vbmV5IGJlY2F1c2VcbiAqIHJvdW5kaW5nIGlzc3VlcyBtYWtlIGZsb2F0cyBwcm9ibGVtYXRpYy4gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGJlXG4gKiBkb25lIHdpdGggdGhlIHNtYWxsZXN0IHdob2xlIHVuaXQgc3VjaCB0aGF0IHRoZSBgbmF0TWF0aEhlbHBlcnNgIG5ldmVyXG4gKiBkZWFscyB3aXRoIGZyYWN0aW9uYWwgcGFydHMuXG4gKlxuICogQHR5cGUge01hdGhIZWxwZXJzPE5hdFZhbHVlPn1cbiAqL1xuY29uc3QgICAgICAgIG5hdE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobmF0KT0+e1xuLyogVE9ETzogdGlnaHRlbiB0aGUgZGVmaW5pdGlvbiBvZiBOYXQgaW4gQGFnb3JpYy9uYXQgdG8gdGhyb3cgb24gYG51bWJlcmAqL1xuYXNzZXJ0LnR5cGVvZihuYXQsJ2JpZ2ludCcpO1xuaXNOYXQobmF0KXx8RmFpbCBgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmA7XG5yZXR1cm4gTmF0KG5hdCk7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eToobmF0KT0+bmF0PT09ZW1wdHksXG5kb0lzR1RFOihsZWZ0LHJpZ2h0KT0+bGVmdD49cmlnaHQsXG5kb0lzRXF1YWw6KGxlZnQscmlnaHQpPT5sZWZ0PT09cmlnaHQsXG4vKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuZG9BZGQ6KGxlZnQscmlnaHQpPT5sZWZ0K3JpZ2h0LFxuZG9TdWJ0cmFjdDoobGVmdCxyaWdodCk9Pk5hdChsZWZ0LXJpZ2h0KX0pOyRo4oCNX29uY2UubmF0TWF0aEhlbHBlcnMobmF0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACaZmC+fBwAAnwcAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsic2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0S2V5LGVsZW1lbnRzSXNTdXBlcnNldCxlbGVtZW50c0Rpc2pvaW50VW5pb24sZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LGNvZXJjZVRvRWxlbWVudHMsZWxlbWVudHNDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChlbGVtZW50c0lzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNEaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fYSA9PiAoY29lcmNlVG9FbGVtZW50cyA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsIFskaOKAjV9hID0+IChlbGVtZW50c0NvbXBhcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIE9wZXJhdGlvbnMgZm9yIGFycmF5cyB3aXRoIHVuaXF1ZSBvYmplY3RzIGlkZW50aWZ5aW5nIGFuZCBwcm92aWRpbmcqL1xuLyogaW5mb3JtYXRpb24gYWJvdXQgZGlnaXRhbCBhc3NldHMuIFVzZWQgZm9yIFpvZSBpbnZpdGVzLiovXG4vKiogQHR5cGUge1NldFZhbHVlfSAqL1xuY29uc3QgZW1wdHk9aGFyZGVuKFtdKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlIGFycmF5LWJhc2VkIFNldE1hdGggd2l0aCBDb3B5U2V0LWJhc2VkIENvcHlTZXRNYXRoXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8U2V0VmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgc2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihsaXN0KT0+e1xubGlzdD1jb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuLyogQXNzZXJ0IHRoYXQgbGlzdCBjb250YWlucyBvbmx5Ki9cbi8qICogcGFzcy1ieS1jb3B5IHByaW1pdGl2ZXMsKi9cbi8qICogcGFzcy1ieS1jb3B5IGNvbnRhaW5lcnMgY29udGFpbmluZyBrZXlzLCovXG4vKiAqIHJlbW90YWJsZXMuKi9cbmFzc2VydEtleShsaXN0KTtcbnJldHVybiBsaXN0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGxpc3QpPT5wYXNzU3R5bGVPZihsaXN0KT09PSdjb3B5QXJyYXknJiZsaXN0Lmxlbmd0aD09PTAsXG5kb0lzR1RFOmVsZW1lbnRzSXNTdXBlcnNldCxcbmRvSXNFcXVhbDooeCx5KT0+ZWxlbWVudHNDb21wYXJlKHgseSk9PT0wLFxuZG9BZGQ6ZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDplbGVtZW50c0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLnNldE1hdGhIZWxwZXJzKHNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRNYXRoSGVscGVycyI6WyJzZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACwOKgfpQQAAKUEAAAjAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHByZXBhcmVFeG9DbGFzczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBQYXltZW50SVxuICogQHJldHVybnMgeygpID0+IFBheW1lbnQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUGF5bWVudEtpbmQ9KGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk9PntcbmNvbnN0IG1ha2VQYXltZW50PXByZXBhcmVFeG9DbGFzcyhcbmlzc3VlckJhZ2dhZ2UsXG4gYCR7bmFtZX0gcGF5bWVudGAsXG5QYXltZW50SSxcbmluaXRFbXB0eSxcbntcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH19KTtcblxuXG5yZXR1cm4gbWFrZVBheW1lbnQ7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQYXltZW50S2luZChwcmVwYXJlUGF5bWVudEtpbmQpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50S2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRLaW5kIjpbInByZXBhcmVQYXltZW50S2luZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAP1+ju6zEAAOsxAAApAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9wYXltZW50LmpzIiwiLi9wdXJzZS5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLG11c3RNYXRjaCxNLGtleUVRLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHByZXBhcmVFeG8scHJvdmlkZSxBbW91bnRNYXRoLHByZXBhcmVQYXltZW50S2luZCxwcmVwYXJlUHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9cIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG8gPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudC5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRLaW5kXCIsIFskaOKAjV9hID0+IChwcmVwYXJlUGF5bWVudEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1wicHJlcGFyZVB1cnNlS2luZFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZVB1cnNlS2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLCBbJGjigI1fYSA9PiAoQnJhbmRJID0gJGjigI1fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLCBbJGjigI1fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKi9cbmNvbnN0IGFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZT0oYnJhbmQsYXNzZXRLaW5kLGVsZW1lbnRTaGFwZSk9PntcbmxldCB2YWx1ZVNoYXBlO1xuc3dpdGNoKGFzc2V0S2luZCl7XG5jYXNlJ25hdCc6e1xudmFsdWVTaGFwZT1NLm5hdCgpO1xuZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkfHxcbkZhaWwgYEZ1bmdpYmxlIGFzc2V0cyBjYW5ub3QgaGF2ZSBhbiBlbGVtZW50U2hhcGU6ICR7cShlbGVtZW50U2hhcGUpfWA7XG5icmVhaztcbiB9XG5jYXNlJ3NldCc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmFycmF5T2YoTS5hbmQoTS5rZXkoKSxlbGVtZW50U2hhcGUpKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlTZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uc2V0KCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uc2V0T2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYmFnKCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uYmFnT2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbkZhaWwgYHVuZXhwZWN0ZWQgYXNzZXQga2luZCAke3EoYXNzZXRLaW5kKX1gO1xuIH19XG5cblxuY29uc3QgYW1vdW50U2hhcGU9aGFyZGVuKHtcbmJyYW5kLC8qIG1hdGNoZXMgb25seSB0aGlzIGV4YWN0IGJyYW5kKi9cbnZhbHVlOnZhbHVlU2hhcGV9KTtcblxucmV0dXJuIGFtb3VudFNoYXBlO1xuIH07XG5cbi8qKlxuICogTWFrZSB0aGUgcGF5bWVudExlZGdlciwgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGJhbGFuY2VzIG9mXG4gKiBwYXltZW50cy4gQWxsIG1pbnRpbmcgYW5kIHRyYW5zZmVyIGF1dGhvcml0eSBvcmlnaW5hdGVzIGhlcmUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge0Rpc3BsYXlJbmZvPEs+fSBkaXNwbGF5SW5mb1xuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdXG4gKiBAcmV0dXJucyB7UGF5bWVudExlZGdlcjxLPn1cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVQYXltZW50TGVkZ2VyPShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5lbGVtZW50U2hhcGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuLyoqIEB0eXBlIHtCcmFuZDxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIGNhbGxXaGVuKi9cbmNvbnN0IGJyYW5kPXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gYnJhbmRgLEJyYW5kSSx7XG5pc015SXNzdWVyKGFsbGVnZWRJc3N1ZXIpe1xuLyogQnJhbmRJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBhbGxlZ2VkSXNzdWVyYCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gYWxsZWdlZElzc3Vlcj09PWlzc3VlcjtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG4vKiBHaXZlIGluZm9ybWF0aW9uIHRvIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuKi9cbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbmdldEFtb3VudFNoYXBlKCl7XG5yZXR1cm4gYW1vdW50U2hhcGU7XG4gfX0pO1xuXG5cbmNvbnN0IGFtb3VudFNoYXBlPWFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZShcbmJyYW5kLFxuYXNzZXRLaW5kLFxuZWxlbWVudFNoYXBlKTtcblxuXG5jb25zdHtJc3N1ZXJJLE1pbnRJLFBheW1lbnRJLFB1cnNlSUtpdH09bWFrZUlzc3VlckludGVyZmFjZXMoXG5icmFuZCxcbmFzc2V0S2luZCxcbmFtb3VudFNoYXBlKTtcblxuXG5jb25zdCBtYWtlUGF5bWVudD1wcmVwYXJlUGF5bWVudEtpbmQoaXNzdWVyQmFnZ2FnZSxuYW1lLGJyYW5kLFBheW1lbnRJKTtcblxuLyoqIEB0eXBlIHtTaHV0ZG93bldpdGhGYWlsdXJlfSAqL1xuY29uc3Qgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZT0ocmVhc29uKT0+e1xuLyogVE9ETyBUaGlzIHNob3VsZCBhbHNvIGRlc3Ryb3kgbGVkZ2VyIHN0YXRlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0Ki9cbmlmKG9wdFNodXRkb3duV2l0aEZhaWx1cmUhPT11bmRlZmluZWQpe1xudHJ5e1xub3B0U2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pO1xuIH1jYXRjaChlcnJJblNodXRkb3duKXtcbmFzc2VydC5ub3RlKGVyckluU2h1dGRvd24sWCBgQ2F1c2VkIGJ5OiAke3JlYXNvbn1gKTtcbnRocm93IGVyckluU2h1dGRvd247XG4gfVxuIH1cbnRocm93IHJlYXNvbjtcbiB9O1xuXG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBBbW91bnQ+fSAqL1xuY29uc3QgcGF5bWVudExlZGdlcj1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShcbmlzc3VlckJhZ2dhZ2UsXG4ncGF5bWVudExlZGdlcicsXG57dmFsdWVTaGFwZTphbW91bnRTaGFwZX0pO1xuXG5cbi8qKlxuICogQSB3aXRoZHJhd24gbGl2ZSBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjb3Zlcnkgc2V0IG9mXG4gKiB0aGUgcHVyc2UgaXQgd2FzIHdpdGhkcmF3biBmcm9tLiBMZXQncyBjYWxsIHRoZXNlIFwicmVjb3ZlcmFibGVcIlxuICogcGF5bWVudHMuIEFsbCByZWNvdmVyYWJsZSBwYXltZW50cyBhcmUgbGl2ZSwgYnV0IG5vdCBhbGwgbGl2ZVxuICogcGF5bWVudHMgYXJlIHJlY292ZXJhYmxlLiBXZSBkbyB0aGUgYm9va2tlZXBpbmcgZm9yIHBheW1lbnQgcmVjb3ZlcnlcbiAqIHdpdGggdGhpcyB3ZWFrbWFwIGZyb20gcmVjb3ZlcmFibGUgcGF5bWVudHMgdG8gdGhlIHJlY292ZXJ5IHNldCB0aGV5IGFyZVxuICogaW4uXG4gKiBBIGJ1bmNoIG9mIGludGVyZXN0aW5nIGludmFyaWFudHMgaGVyZTpcbiAqICAgICogRXZlcnkgcGF5bWVudCB0aGF0IGlzIGEga2V5IGluIHRoZSBvdXRlciBgcGF5bWVudFJlY292ZXJ5U2V0c2BcbiAqICAgICAgd2Vha01hcCBpcyBhbHNvIGluIHRoZSByZWNvdmVyeSBzZXQgaW5kZXhlZCBieSB0aGF0IHBheW1lbnQuXG4gKiAgICAqIEltcGxpZWQgYnkgdGhlIGFib3ZlIGJ1dCB3b3J0aCBzdGF0aW5nOiB0aGUgcGF5bWVudCBpcyBvbmx5XG4gKiAgICAgIGluIGF0IG1vc3Qgb25lIHJlY292ZXJ5IHNldC5cbiAqICAgICogQSByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBzdWNoIHBheW1lbnRzLlxuICogICAgKiBFdmVyeSBwdXJzZSBpcyBhc3NvY2lhdGVkIHdpdGggZXhhY3RseSBvbmUgcmVjb3Zlcnkgc2V0IHVuaXF1ZSB0b1xuICogICAgICBpdC5cbiAqICAgICogQSBwdXJzZSdzIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tXG4gKiAgICAgIHRoYXQgcHVyc2UgYW5kIG5vdCB5ZXQgY29uc3VtZWQuXG4gKlxuICogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBTZXRTdG9yZTxQYXltZW50Pj59XG4gKi9cbmNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHM9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRSZWNvdmVyeVNldHMnKTtcblxuXG4vKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgaW5pdFBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmluaXRgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtTZXRTdG9yZTxQYXltZW50Pn0gW29wdFJlY292ZXJ5U2V0XVxuICovXG5jb25zdCBpbml0UGF5bWVudD0ocGF5bWVudCxhbW91bnQsb3B0UmVjb3ZlcnlTZXQ9dW5kZWZpbmVkKT0+e1xuaWYob3B0UmVjb3ZlcnlTZXQhPT11bmRlZmluZWQpe1xub3B0UmVjb3ZlcnlTZXQuYWRkKHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5pbml0KHBheW1lbnQsb3B0UmVjb3ZlcnlTZXQpO1xuIH1cbnBheW1lbnRMZWRnZXIuaW5pdChwYXltZW50LGFtb3VudCk7XG4gfTtcblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGRlbGV0ZVBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmRlbGV0ZWAuXG4gKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKi9cbmNvbnN0IGRlbGV0ZVBheW1lbnQ9KHBheW1lbnQpPT57XG5wYXltZW50TGVkZ2VyLmRlbGV0ZShwYXltZW50KTtcbmlmKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKXtcbmNvbnN0IHJlY292ZXJ5U2V0PXBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG5yZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gfVxuIH07XG5cbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IGFkZD0obGVmdCxyaWdodCk9PkFtb3VudE1hdGguYWRkKGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsobGVmdDogQW1vdW50LCByaWdodDogQW1vdW50KSA9PiBBbW91bnQgfSAqL1xuY29uc3Qgc3VidHJhY3Q9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLnN1YnRyYWN0KGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsoYWxsZWdlZEFtb3VudDogQW1vdW50KSA9PiBBbW91bnR9ICovXG5jb25zdCBjb2VyY2U9KGFsbGVnZWRBbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbGxlZ2VkQW1vdW50KTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gYm9vbGVhbiB9ICovXG5cbi8qKlxuICogTWV0aG9kcyBsaWtlIGRlcG9zaXQoKSBoYXZlIGFuIG9wdGlvbmFsIHNlY29uZCBwYXJhbWV0ZXJcbiAqIGBvcHRBbW91bnRTaGFwZWBcbiAqIHdoaWNoLCBpZiBwcmVzZW50LCBpcyBzdXBwb3NlZCB0byBtYXRjaCB0aGUgYmFsYW5jZSBvZiB0aGVcbiAqIHBheW1lbnQuIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGRvZXMgdGhhdCBjaGVjay5cbiAqXG4gKiBOb3RlOiBgb3B0QW1vdW50U2hhcGVgIGlzIHVzZXItc3VwcGxpZWQgd2l0aCBubyBwcmV2aW91cyB2YWxpZGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBwYXltZW50QmFsYW5jZVxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgYXNzZXJ0QW1vdW50Q29uc2lzdGVudD0ocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpPT57XG5pZihvcHRBbW91bnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2gocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUsJ2Ftb3VudCcpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydExpdmVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5oYXMocGF5bWVudCl8fFxuRmFpbCBgJHtwYXltZW50fSB3YXMgbm90IGEgbGl2ZSBwYXltZW50IGZvciBicmFuZCAke3EoXG5icmFuZClcbiB9LiBJdCBjb3VsZCBiZSBhIHVzZWQtdXAgcGF5bWVudCwgYSBwYXltZW50IGZvciBhbm90aGVyIGJyYW5kLCBvciBpdCBtaWdodCBub3QgYmUgYSBwYXltZW50IGF0IGFsbC5gO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2UuZGVwb3NpdFxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSBkZXBvc2l0XG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtQYXltZW50fSBzcmNQYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cbmNvbnN0IGRlcG9zaXRJbnRlcm5hbD0oXG5jdXJyZW50QmFsYW5jZSxcbnVwZGF0ZVB1cnNlQmFsYW5jZSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZT11bmRlZmluZWQpPT5cbntcbiFpc1Byb21pc2Uoc3JjUGF5bWVudCl8fFxuYXNzZXJ0LmZhaWwoXG4gYGRlcG9zaXQgZG9lcyBub3QgYWNjZXB0IHByb21pc2VzIGFzIGZpcnN0IGFyZ3VtZW50LiBJbnN0ZWFkIG9mIHBhc3NpbmcgdGhlIHByb21pc2UgKGRlcG9zaXQocGF5bWVudFByb21pc2UpKSwgY29uc2lkZXIgdW53cmFwcGluZyB0aGUgcHJvbWlzZSBmaXJzdDogRS53aGVuKHBheW1lbnRQcm9taXNlLCAoYWN0dWFsUGF5bWVudCA9PiBkZXBvc2l0KGFjdHVhbFBheW1lbnQpKWAsXG5UeXBlRXJyb3IpO1xuXG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChzcmNQYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG5jb25zdCBuZXdQdXJzZUJhbGFuY2U9YWRkKHNyY1BheW1lbnRCYWxhbmNlLGN1cnJlbnRCYWxhbmNlKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCovXG4vKiBNb3ZlIHRoZSBhc3NldHMgaW4gYHNyY1BheW1lbnRgIGludG8gdGhpcyBwdXJzZSwgdXNpbmcgdXAgdGhlKi9cbi8qIHNvdXJjZSBwYXltZW50LCBzdWNoIHRoYXQgdG90YWwgYXNzZXRzIGFyZSBjb25zZXJ2ZWQuKi9cbmRlbGV0ZVBheW1lbnQoc3JjUGF5bWVudCk7XG51cGRhdGVQdXJzZUJhbGFuY2UobmV3UHVyc2VCYWxhbmNlKTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gfTtcblxuLyoqXG4gKiBVc2VkIGJ5IHRoZSBwdXJzZSBjb2RlIHRvIGltcGxlbWVudCBwdXJzZS53aXRoZHJhd1xuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSB3aXRoZHJhd2FsXG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudCAtIHRoZSBhbW91bnQgdG8gYmUgd2l0aGRyYXduXG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSByZWNvdmVyeVNldFxuICogQHJldHVybnMge1BheW1lbnR9XG4gKi9cbmNvbnN0IHdpdGhkcmF3SW50ZXJuYWw9KFxuY3VycmVudEJhbGFuY2UsXG51cGRhdGVQdXJzZUJhbGFuY2UsXG5hbW91bnQsXG5yZWNvdmVyeVNldCk9Plxue1xuYW1vdW50PWNvZXJjZShhbW91bnQpO1xuQW1vdW50TWF0aC5pc0dURShjdXJyZW50QmFsYW5jZSxhbW91bnQpfHxcbkZhaWwgYFdpdGhkcmF3YWwgb2YgJHthbW91bnR9IGZhaWxlZCBiZWNhdXNlIHRoZSBwdXJzZSBvbmx5IGNvbnRhaW5lZCAke2N1cnJlbnRCYWxhbmNlfWA7XG5jb25zdCBuZXdQdXJzZUJhbGFuY2U9c3VidHJhY3QoY3VycmVudEJhbGFuY2UsYW1vdW50KTtcblxuY29uc3QgcGF5bWVudD1tYWtlUGF5bWVudCgpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5UIE1vdmUgdGhlIHdpdGhkcmF3biBhc3NldHMgZnJvbSB0aGlzIHB1cnNlIGludG8qL1xuLyogcGF5bWVudC4gVG90YWwgYXNzZXRzIG11c3QgcmVtYWluIGNvbnNlcnZlZC4qL1xudXBkYXRlUHVyc2VCYWxhbmNlKG5ld1B1cnNlQmFsYW5jZSk7XG5pbml0UGF5bWVudChwYXltZW50LGFtb3VudCxyZWNvdmVyeVNldCk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHBheW1lbnQ7XG4gfTtcblxuY29uc3QgbWFrZUVtcHR5UHVyc2U9cHJlcGFyZVB1cnNlS2luZChcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuYnJhbmQsXG5QdXJzZUlLaXQsXG5oYXJkZW4oe1xuZGVwb3NpdEludGVybmFsLFxud2l0aGRyYXdJbnRlcm5hbH0pKTtcblxuXG5cbi8qKiBAdHlwZSB7SXNzdWVyPEs+fSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IGR1ZSB0byBjYWxsV2hlbiBkaXNjcmVwYW5jeSovXG5jb25zdCBpc3N1ZXI9cHJlcGFyZUV4byhpc3N1ZXJCYWdnYWdlLCBgJHtuYW1lfSBpc3N1ZXJgLElzc3Vlckkse1xuZ2V0QnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG5nZXRBc3NldEtpbmQoKXtcbnJldHVybiBhc3NldEtpbmQ7XG4gfSxcbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbm1ha2VFbXB0eVB1cnNlKCl7XG5yZXR1cm4gbWFrZUVtcHR5UHVyc2UoKTtcbiB9LFxuLyoqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudCBhd2FpdGVkIGJ5IGNhbGxXaGVuICovXG5pc0xpdmUocGF5bWVudCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gcGF5bWVudExlZGdlci5oYXMocGF5bWVudCk7XG4gfSxcbi8qKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlbiAqL1xuZ2V0QW1vdW50T2YocGF5bWVudCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbnJldHVybiBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiB9LFxuLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlblxuICogQHBhcmFtIHtQYXR0ZXJufSBvcHRBbW91bnRTaGFwZVxuICovXG5idXJuKHBheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbmFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xuY29uc3QgcGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVC4qL1xuZGVsZXRlUGF5bWVudChwYXltZW50KTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gcGF5bWVudEJhbGFuY2U7XG4gfX0pO1xuXG5cbi8qKlxuICogUHJvdmlkZXMgZm9yIHRoZSByZWNvdmVyeSBvZiBuZXdseSBtaW50ZWQgYnV0IG5vdC15ZXQtZGVwb3NpdGVkIHBheW1lbnRzLlxuICpcbiAqIEJlY2F1c2UgdGhlIGBtaW50UmVjb3ZlcnlQdXJzZWAgaXMgcGxhY2VkIGluIGJhZ2dhZ2UsIGV2ZW4gaWYgdGhlXG4gKiBjYWxsZXIgb2YgYG1ha2VJc3N1ZXJLaXRgIGRyb3BzIGl0IG9uIHRoZSBmbG9vciwgaXQgY2FuIHN0aWxsIGJlXG4gKiByZWNvdmVyZWQgaW4gYW4gZW1lcmdlbmN5IHVwZ3JhZGUuXG4gKlxuICogQHR5cGUge1B1cnNlPEs+fVxuICovXG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZT1wcm92aWRlKGlzc3VlckJhZ2dhZ2UsJ21pbnRSZWNvdmVyeVB1cnNlJywoKT0+XG5tYWtlRW1wdHlQdXJzZSgpKTtcblxuXG4vKiogQHR5cGUge01pbnQ8Sz59ICovXG5jb25zdCBtaW50PXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gbWludGAsTWludEkse1xuZ2V0SXNzdWVyKCl7XG5yZXR1cm4gaXNzdWVyO1xuIH0sXG5taW50UGF5bWVudChuZXdBbW91bnQpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjaGVja2VkIGNhc3QqL1xubmV3QW1vdW50PWNvZXJjZShuZXdBbW91bnQpO1xubXVzdE1hdGNoKG5ld0Ftb3VudCxhbW91bnRTaGFwZSwnbWludGVkIGFtb3VudCcpO1xuLyogYHJhd1BheW1lbnRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHJlY292ZXJ5IHNldCwgYW5kKi9cbi8qIHNvIG11c3Qgbm90IGVzY2FwZS4qL1xuY29uc3QgcmF3UGF5bWVudD1tYWtlUGF5bWVudCgpO1xuaW5pdFBheW1lbnQocmF3UGF5bWVudCxuZXdBbW91bnQsdW5kZWZpbmVkKTtcblxuY29uc3QgbWludFJlY292ZXJ5UHVyc2VCZWZvcmU9bWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xubWludFJlY292ZXJ5UHVyc2UuZGVwb3NpdChyYXdQYXltZW50LG5ld0Ftb3VudCk7XG5jb25zdCBwYXltZW50PW1pbnRSZWNvdmVyeVB1cnNlLndpdGhkcmF3KG5ld0Ftb3VudCk7XG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyPW1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbmFzc2VydChrZXlFUShtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSxtaW50UmVjb3ZlcnlQdXJzZUFmdGVyKSk7XG5yZXR1cm4gcGF5bWVudDtcbiB9fSk7XG5cblxuY29uc3QgaXNzdWVyS2l0PWhhcmRlbih7aXNzdWVyLG1pbnQsYnJhbmQsbWludFJlY292ZXJ5UHVyc2V9KTtcbnJldHVybiBpc3N1ZXJLaXQ7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQYXltZW50TGVkZ2VyKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudExlZGdlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRMZWRnZXIiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAokVFQsAPAADADwAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUHVyc2VLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0scHJlcGFyZUV4b0NsYXNzS2l0LG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxBbW91bnRNYXRoLG1ha2VUcmFuc2llbnROb3RpZmllcktpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyQmlnU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiLi90cmFuc2llbnROb3RpZmllci5qc1wiLCBbW1wibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgcHJlcGFyZVB1cnNlS2luZD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxucHVyc2VNZXRob2RzKT0+XG57XG5jb25zdCBhbW91bnRTaGFwZT1icmFuZC5nZXRBbW91bnRTaGFwZSgpO1xuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3R7cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZTp1cGRhdGVCYWxhbmNlfT1tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQoKTtcblxuY29uc3QgdXBkYXRlUHVyc2VCYWxhbmNlPShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UscHVyc2UpPT57XG5zdGF0ZS5jdXJyZW50QmFsYW5jZT1uZXdQdXJzZUJhbGFuY2U7XG51cGRhdGVCYWxhbmNlKHB1cnNlLHB1cnNlLmdldEN1cnJlbnRBbW91bnQoKSk7XG4gfTtcblxuLyogLSBUaGlzIGtpbmQgaXMgYSBwYWlyIG9mIHB1cnNlIGFuZCBkZXBvc2l0RmFjZXQgdGhhdCBoYXZlIGEgMToxKi9cbi8qIGNvcnJlc3BvbmRlbmNlLiovXG4vKiAtIFRoZXkgYXJlIHZpcnR1YWxpemVkIHRvZ2V0aGVyIHRvIHNoYXJlIGEgc2luZ2xlIHN0YXRlIHJlY29yZC4qL1xuLyogLSBBbiBhbHRlcm5hdGl2ZSBkZXNpZ24gY29uc2lkZXJlZCB3YXMgdG8gaGF2ZSB0aGlzIHJldHVybiBhIFB1cnNlIGFsb25lKi9cbi8qIHRoYXQgY3JlYXRlZCBkZXBvc2l0RmFjZXQgYXMgbmVlZGVkLiBCdXQgdGhpcyBhcHByb2FjaCBlbnN1cmVzIGEgY29uc3RhbnQqL1xuLyogaWRlbnRpdHkgZm9yIHRoZSBmYWNldCBhbmQgZXhlcmNpc2VzIHRoZSBtdWx0aS1mYWNldGVkIG9iamVjdCBzdHlsZS4qL1xuY29uc3R7ZGVwb3NpdEludGVybmFsLHdpdGhkcmF3SW50ZXJuYWx9PXB1cnNlTWV0aG9kcztcbmNvbnN0IG1ha2VQdXJzZUtpdD1wcmVwYXJlRXhvQ2xhc3NLaXQoXG5pc3N1ZXJCYWdnYWdlLFxuIGAke25hbWV9IFB1cnNlYCxcblB1cnNlSUtpdCxcbigpPT57XG5jb25zdCBjdXJyZW50QmFsYW5jZT1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuXG4vKiogQHR5cGUge1NldFN0b3JlPFBheW1lbnQ+fSAqL1xuY29uc3QgcmVjb3ZlcnlTZXQ9bWFrZVNjYWxhckJpZ1NldFN0b3JlKCdyZWNvdmVyeSBzZXQnLHtcbmR1cmFibGU6dHJ1ZX0pO1xuXG5cbnJldHVybntcbmN1cnJlbnRCYWxhbmNlLFxucmVjb3ZlcnlTZXR9O1xuXG4gfSxcbntcbnB1cnNlOntcbmRlcG9zaXQoc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbi8qIFNlZSB0aGUgY29tbWVudHMgb24gUHVyc2VJLmRlcG9zaXQgaW4gdHlwZUd1YXJkcy5qcyovXG5jb25zdHtzdGF0ZX09dGhpcztcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBkZXBvc2l0LiovXG5yZXR1cm4gZGVwb3NpdEludGVybmFsKFxuc3RhdGUuY3VycmVudEJhbGFuY2UsXG4obmV3UHVyc2VCYWxhbmNlKT0+XG51cGRhdGVQdXJzZUJhbGFuY2Uoc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHRoaXMuZmFjZXRzLnB1cnNlKSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZSk7XG5cbiB9LFxud2l0aGRyYXcoYW1vdW50KXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIHdpdGhkcmF3LiovXG5yZXR1cm4gd2l0aGRyYXdJbnRlcm5hbChcbnN0YXRlLmN1cnJlbnRCYWxhbmNlLFxuKG5ld1B1cnNlQmFsYW5jZSk9PlxudXBkYXRlUHVyc2VCYWxhbmNlKHN0YXRlLG5ld1B1cnNlQmFsYW5jZSx0aGlzLmZhY2V0cy5wdXJzZSksXG5hbW91bnQsXG5zdGF0ZS5yZWNvdmVyeVNldCk7XG5cbiB9LFxuZ2V0Q3VycmVudEFtb3VudCgpe1xucmV0dXJuIHRoaXMuc3RhdGUuY3VycmVudEJhbGFuY2U7XG4gfSxcbmdldEN1cnJlbnRBbW91bnROb3RpZmllcigpe1xucmV0dXJuIHByb3ZpZGVOb3RpZmllcih0aGlzLmZhY2V0cy5wdXJzZSk7XG4gfSxcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH0sXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuZ2V0RGVwb3NpdEZhY2V0KCl7XG5yZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdEZhY2V0O1xuIH0sXG5cbmdldFJlY292ZXJ5U2V0KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5yZWNvdmVyeVNldC5zbmFwc2hvdCgpO1xuIH0sXG5yZWNvdmVyQWxsKCl7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5sZXQgYW1vdW50PUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5mb3IoY29uc3QgcGF5bWVudCBvZiBzdGF0ZS5yZWNvdmVyeVNldC5rZXlzKCkpe1xuLyogVGhpcyBkb2VzIGNhdXNlIGRlbGV0aW9ucyBmcm9tIHRoZSBzZXQgd2hpbGUgaXRlcmF0aW5nLCovXG4vKiBidXQgdGhpcyBzcGVjaWFsIGNhc2UgaXMgYWxsb3dlZC4qL1xuY29uc3QgZGVsdGE9ZmFjZXRzLnB1cnNlLmRlcG9zaXQocGF5bWVudCk7XG5hbW91bnQ9QW1vdW50TWF0aC5hZGQoYW1vdW50LGRlbHRhLGJyYW5kKTtcbiB9XG5zdGF0ZS5yZWNvdmVyeVNldC5nZXRTaXplKCk9PT0wfHxcbkZhaWwgYGludGVybmFsOiBSZW1haW5pbmcgdW5yZWNvdmVyZWQgcGF5bWVudHM6ICR7ZmFjZXRzLnB1cnNlLmdldFJlY292ZXJ5U2V0KCl9YDtcbnJldHVybiBhbW91bnQ7XG4gfX0sXG5cbmRlcG9zaXRGYWNldDp7XG5yZWNlaXZlKC4uLmFyZ3Mpe1xucmV0dXJuIHRoaXMuZmFjZXRzLnB1cnNlLmRlcG9zaXQoLi4uYXJncyk7XG4gfX19LFxuXG5cbntcbnN0YXRlU2hhcGU6e1xuY3VycmVudEJhbGFuY2U6YW1vdW50U2hhcGUsXG5yZWNvdmVyeVNldDpNLnJlbW90YWJsZSgncmVjb3ZlcnlTZXQnKX19KTtcblxuXG5cbnJldHVybigpPT5tYWtlUHVyc2VLaXQoKS5wdXJzZTtcbiB9OyRo4oCNX29uY2UucHJlcGFyZVB1cnNlS2luZChwcmVwYXJlUHVyc2VLaW5kKTtcbmhhcmRlbihwcmVwYXJlUHVyc2VLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUHVyc2VLaW5kIjpbInByZXBhcmVQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALkljqRQGAAAUBgAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxwcm92aWRlTGF6eSxtYWtlTm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3QgICAgICAgIG1ha2VUcmFuc2llbnROb3RpZmllcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UHVyc2UsIE5vdGlmaWVyUmVjb3JkPGFueT4+fSAqL1xuY29uc3QgdHJhbnNpZW50Tm90aWZlcktpdHM9bWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShcbid0cmFuc2llbnROb3RpZmVyS2l0cycpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcktpdD0oa2V5KT0+XG5wcm92aWRlTGF6eSh0cmFuc2llbnROb3RpZmVyS2l0cyxrZXksKCk9PlxubWFrZU5vdGlmaWVyS2l0KGtleS5nZXRDdXJyZW50QW1vdW50KCkpKTtcblxuXG5jb25zdCBwcm92aWRlTm90aWZpZXI9KGtleSk9PnByb3ZpZGVOb3RpZmllcktpdChrZXkpLm5vdGlmaWVyO1xuY29uc3QgdXBkYXRlPShrZXksbmV3VmFsdWUpPT57XG5pZih0cmFuc2llbnROb3RpZmVyS2l0cy5oYXMoa2V5KSl7XG5jb25zdHt1cGRhdGVyfT10cmFuc2llbnROb3RpZmVyS2l0cy5nZXQoa2V5KTtcbnVwZGF0ZXIudXBkYXRlU3RhdGUobmV3VmFsdWUpO1xuIH1cbiB9O1xuXG5yZXR1cm57cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZX07XG4gfTskaOKAjV9vbmNlLm1ha2VUcmFuc2llbnROb3RpZmllcktpdChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xuaGFyZGVuKG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0IjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAo7p4+EicAABInAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIkFtb3VudFNoYXBlIiwiQXNzZXRLaW5kU2hhcGUiLCJCcmFuZEkiLCJCcmFuZFNoYXBlIiwiRGVwb3NpdEZhY2V0U2hhcGUiLCJEaXNwbGF5SW5mb1NoYXBlIiwiSXNzdWVyS2l0U2hhcGUiLCJJc3N1ZXJTaGFwZSIsIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyIsIk1pbnRTaGFwZSIsIk5vdGlmaWVyU2hhcGUiLCJQYXltZW50U2hhcGUiLCJQdXJzZVNoYXBlIiwiUmF0aW9TaGFwZSIsImlzQ29weUJhZ1ZhbHVlIiwiaXNDb3B5U2V0VmFsdWUiLCJpc05hdFZhbHVlIiwiaXNTZXRWYWx1ZSIsIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0sbWF0Y2hlczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdCAgICAgICAgQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgnQnJhbmQnKTskaOKAjV9vbmNlLkJyYW5kU2hhcGUoQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgSXNzdWVyU2hhcGU9TS5yZW1vdGFibGUoJ0lzc3VlcicpOyRo4oCNX29uY2UuSXNzdWVyU2hhcGUoSXNzdWVyU2hhcGUpO1xuY29uc3QgICAgICAgIFBheW1lbnRTaGFwZT1NLnJlbW90YWJsZSgnUGF5bWVudCcpOyRo4oCNX29uY2UuUGF5bWVudFNoYXBlKFBheW1lbnRTaGFwZSk7XG5jb25zdCAgICAgICAgUHVyc2VTaGFwZT1NLnJlbW90YWJsZSgnUHVyc2UnKTskaOKAjV9vbmNlLlB1cnNlU2hhcGUoUHVyc2VTaGFwZSk7XG5jb25zdCAgICAgICAgRGVwb3NpdEZhY2V0U2hhcGU9TS5yZW1vdGFibGUoJ0RlcG9zaXRGYWNldCcpOyRo4oCNX29uY2UuRGVwb3NpdEZhY2V0U2hhcGUoRGVwb3NpdEZhY2V0U2hhcGUpO1xuY29uc3QgICAgICAgIE5vdGlmaWVyU2hhcGU9TS5yZW1vdGFibGUoJ05vdGlmaWVyJyk7JGjigI1fb25jZS5Ob3RpZmllclNoYXBlKE5vdGlmaWVyU2hhcGUpO1xuY29uc3QgICAgICAgIE1pbnRTaGFwZT1NLnJlbW90YWJsZSgnTWludCcpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBOYXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0IGlzXG4gKiBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGF0IG1hbnkgdW5pdHMgb2YgdGhlXG4gKiBmdW5naWJsZSBhc3NldCByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudC4gVGhlIGJyYW5kIG9mIHRoYXQgYW1vdW50XG4gKiBzaG91bGQgaW5kZWVkIHJlcHJlc2VudCBhIGtpbmQgb2YgYXNzZXQgY29uc2lzdGluZyBvZiBhIGNvdW50YWJsZVxuICogc2V0IG9mIGZ1bmdpYmxlIHVuaXRzLlxuICovJGjigI1fb25jZS5NaW50U2hhcGUoTWludFNoYXBlKTtcbmNvbnN0IE5hdFZhbHVlU2hhcGU9TS5uYXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weVNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weVNldCwgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhvc2VcbiAqIGtleXMsIHdoZXJlIGVhY2gga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIG5vbi1mdW5naWJsZVxuICogaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LCBmcm9tIHRoZSBub24tZnVuZ2libGUgYXNzZXQgY2xhc3NcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBhbW91bnQgaXRzZWxmIHJlcHJlc2VudHNcbiAqIHRoZSBzZXQgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWQgdG8gYW55IG9mIHRoZSBvdGhlciBpdGVtc1xuICogZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlXG4gKiB0aGF0IHdlIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0XG4gKiB0aGUgY29kZSB0aGF0IGhvbGRzIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoYXQgYnJhbmQsIG9ubHkgbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0c1xuICogb2YgdGhhdCBhc3NldCBjbGFzcyBhcyBkZWZpbmVkIGJ5IGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyXG4gKiBhbiBhbW91bnQgZXhwcmVzc2luZywgZm9yIGV4YW1wbGUsIHRoYXQgdGhleSBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXRcbiAqIHdpbGwgbmV2ZXIgYmUgbWludGVkLiBUaGF0IHdhbnQgd2lsbCBuZXZlciBiZSBzYXRpc2ZpZWQuXG4gKiBcIllvdSBjYW4ndCBhbHdheXMgZ2V0Li4uXCJcbiAqL1xuY29uc3QgQ29weVNldFZhbHVlU2hhcGU9TS5zZXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgU2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QXJyYXkgb2YgcGFzc2FibGUgS2V5cy4gVGhpcyByZXByZXNlbnRhdGlvbiBpcyBkZXByZWNhdGVkLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogQ29weVNldFZhbHVlcy5cbiAqL1xuY29uc3QgU2V0VmFsdWVTaGFwZT1NLmFycmF5T2YoTS5rZXkoKSk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlCYWdWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlCYWcsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgYmFnIChtdWx0aXNldCkgb2YgdGhvc2VcbiAqIGtleXMsIHdoZXJlIGVhY2gga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIHNlbWktZnVuZ2libGVcbiAqIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCwgZnJvbSB0aGUgc2VtaS1mdW5naWJsZSBhc3NldCBjbGFzc1xuICogcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGtleVxuICogYXBwZWFycyBpbiB0aGUgYmFnIGlzIHRoZSBudW1iZXIgb2YgZnVuZ2libGUgdW5pdHMgb2YgdGhhdCBrZXkuXG4gKiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzXG4gKiB0aGUgYmFnIG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXNcbiAqIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZVxuICogdGhhdCB3ZSBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdFxuICogdGhlIGNvZGUgdGhhdCBob2xkcyB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGF0IGJyYW5kLCBvbmx5IG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHNcbiAqIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieSBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlclxuICogYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXkgXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0XG4gKiB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmUgc2F0aXNmaWVkLlxuICogXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlCYWdWYWx1ZVNoYXBlPU0uYmFnKCk7XG5cbmNvbnN0IEFtb3VudFZhbHVlU2hhcGU9TS5vcihcbk5hdFZhbHVlU2hhcGUsXG5Db3B5U2V0VmFsdWVTaGFwZSxcblNldFZhbHVlU2hhcGUsXG5Db3B5QmFnVmFsdWVTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEFtb3VudFNoYXBlPWhhcmRlbih7XG5icmFuZDpCcmFuZFNoYXBlLFxudmFsdWU6QW1vdW50VmFsdWVTaGFwZX0pOyRo4oCNX29uY2UuQW1vdW50U2hhcGUoQW1vdW50U2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBSYXRpb1NoYXBlPWhhcmRlbih7XG5udW1lcmF0b3I6QW1vdW50U2hhcGUsXG5kZW5vbWluYXRvcjpBbW91bnRTaGFwZX0pO1xuXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgTmF0IGJpZ2ludC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFhpbXBvcnQoJy4vdHlwZXMuanMnKS5OYXRWYWx1ZX1cbiAqLyRo4oCNX29uY2UuUmF0aW9TaGFwZShSYXRpb1NoYXBlKTtcbmNvbnN0ICAgICAgICBpc05hdFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsTmF0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc05hdFZhbHVlKGlzTmF0VmFsdWUpO1xuaGFyZGVuKGlzTmF0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlTZXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlTZXR9XG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLENvcHlTZXRWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzQ29weVNldFZhbHVlKGlzQ29weVNldFZhbHVlKTtcbmhhcmRlbihpc0NvcHlTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgcGFzcyBieSBjb3B5IGFycmF5IHN0cnVjdHVyZS4gRG9lcyBub3RcbiAqIGNoZWNrIGZvciBkdXBsaWNhdGVzLiBUbyBjaGVjayBmb3IgZHVwbGljYXRlcywgdXNlIHNldE1hdGhIZWxwZXJzLmNvZXJjZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqIENvcHlTZXRWYWx1ZXMuXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFNldFZhbHVlfVxuICovXG5jb25zdCAgICAgICAgaXNTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLFNldFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNTZXRWYWx1ZShpc1NldFZhbHVlKTtcbmhhcmRlbihpc1NldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5QmFnXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5QmFnfVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnVmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5QmFnVmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc0NvcHlCYWdWYWx1ZShpc0NvcHlCYWdWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5QmFnVmFsdWUpO1xuXG4vKiBPbmUgR09PR09MdGggc2hvdWxkIGJlIGVub3VnaCBkZWNpbWFsIHBsYWNlcyBmb3IgYW55Ym9keS4qL1xuY29uc3QgICAgICAgIE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUz0xMDA7JGjigI1fb25jZS5NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKTtcblxuY29uc3QgICAgICAgIEFzc2V0S2luZFNoYXBlPU0ub3IoJ25hdCcsJ3NldCcsJ2NvcHlTZXQnLCdjb3B5QmFnJyk7JGjigI1fb25jZS5Bc3NldEtpbmRTaGFwZShBc3NldEtpbmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBEaXNwbGF5SW5mb1NoYXBlPU0uc3BsaXRSZWNvcmQoXG57fSxcbntcbmRlY2ltYWxQbGFjZXM6TS5hbmQoXG5NLmd0ZSgtTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbk0ubHRlKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUykpLFxuXG5hc3NldEtpbmQ6QXNzZXRLaW5kU2hhcGV9LFxuXG57XG4vKiBJbmNsdWRpbmcgdGhpcyBlbXB0eSBgcmVzdGAgZW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBubyBvdGhlciovXG4vKiBwcm9wZXJ0aWVzIGJleW9uZCB0aG9zZSBpbiB0aGUgYGJhc2VgIHJlY29yZC4qL30pOyRo4oCNX29uY2UuRGlzcGxheUluZm9TaGFwZShEaXNwbGF5SW5mb1NoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBJc3N1ZXJLaXRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbm1pbnQ6TWludFNoYXBlLFxubWludFJlY292ZXJ5UHVyc2U6UHVyc2VTaGFwZSxcbmlzc3VlcjpJc3N1ZXJTaGFwZSxcbmRpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9KTtcblxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW50ZXJmYWNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovJGjigI1fb25jZS5Jc3N1ZXJLaXRTaGFwZShJc3N1ZXJLaXRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBCcmFuZEk9TS5pbnRlcmZhY2UoJ0JyYW5kJyx7XG5pc015SXNzdWVyOk0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5nZXRBbW91bnRTaGFwZTpNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBbYnJhbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Fzc2V0S2luZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYW1vdW50U2hhcGVdXG4gKi8kaOKAjV9vbmNlLkJyYW5kSShCcmFuZEkpO1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJJbnRlcmZhY2VzPShcbmJyYW5kU2hhcGU9QnJhbmRTaGFwZSxcbmFzc2V0S2luZFNoYXBlPUFzc2V0S2luZFNoYXBlLFxuYW1vdW50U2hhcGU9QW1vdW50U2hhcGUpPT5cbntcbmNvbnN0IElzc3Vlckk9TS5pbnRlcmZhY2UoJ0lzc3Vlcicse1xuZ2V0QnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEFsbGVnZWROYW1lOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXRBc3NldEtpbmQ6TS5jYWxsKCkucmV0dXJucyhhc3NldEtpbmRTaGFwZSksXG5nZXREaXNwbGF5SW5mbzpNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxubWFrZUVtcHR5UHVyc2U6TS5jYWxsKCkucmV0dXJucyhQdXJzZVNoYXBlKSxcblxuaXNMaXZlOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldEFtb3VudE9mOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmJ1cm46TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLlxub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBNaW50ST1NLmludGVyZmFjZSgnTWludCcse1xuZ2V0SXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxubWludFBheW1lbnQ6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSl9KTtcblxuXG5jb25zdCBQYXltZW50ST1NLmludGVyZmFjZSgnUGF5bWVudCcse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSl9KTtcblxuXG5jb25zdCBQdXJzZUk9TS5pbnRlcmZhY2UoJ1B1cnNlJyx7XG5nZXRBbGxlZ2VkQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEN1cnJlbnRBbW91bnQ6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXI6TS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbi8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4vKiBSYXRoZXIsIHRoZSBzZW1hbnRpY3Mgb2YgYGRlcG9zaXRgIHJlcXVpcmUgaXQgdG8gcHJvdmlkZSBpdHMqL1xuLyogY2FsbGVycyB3aXRoIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IGBkZXBvc2l0YCBtZXNzYWdlcyBhcmUqL1xuLyogcHJvY2Vzc2VkIHdpdGhvdXQgZnVydGhlciBkZWxheSBpbiB0aGUgb3JkZXIgdGhleSBhcnJpdmUuKi9cbi8qIFB1cnNlSSB0aGVyZWZvcmUgcmVxdWlyZXMgdGhhdCB0aGUgYHNyY1BheW1lbnRgIGFyZ3VtZW50IGFscmVhZHkqL1xuLyogYmUgYSByZW1vdGFibGUsIG5vdCBhIHByb21pc2UuKi9cbi8qIFB1cnNlSSBvbmx5IGNhbGxzIHRoaXMgcmF3IG1ldGhvZCBhZnRlciB2YWxpZGF0aW5nIHRoYXQqL1xuLyogYHNyY1BheW1lbnRgIGlzIGEgcmVtb3RhYmxlLCBsZWF2aW5nIGl0Ki9cbi8qIHRvIHRoaXMgcmF3IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgcmVtb3RhYmxlIGlzIGFjdHVhbGx5Ki9cbi8qIGEgbGl2ZSBwYXltZW50IG9mIHRoZSBjb3JyZWN0IGJyYW5kIHdpdGggc3VmZmljaWVudCBmdW5kcy4qL1xuZGVwb3NpdDpNLmNhbGwoUGF5bWVudFNoYXBlKS5vcHRpb25hbChNLnBhdHRlcm4oKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXREZXBvc2l0RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhEZXBvc2l0RmFjZXRTaGFwZSksXG53aXRoZHJhdzpNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmdldFJlY292ZXJ5U2V0Ok0uY2FsbCgpLnJldHVybnMoTS5zZXRPZihQYXltZW50U2hhcGUpKSxcbnJlY292ZXJBbGw6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBEZXBvc2l0RmFjZXRJPU0uaW50ZXJmYWNlKCdEZXBvc2l0RmFjZXQnLHtcbnJlY2VpdmU6UHVyc2VJLm1ldGhvZEd1YXJkcy5kZXBvc2l0fSk7XG5cblxuY29uc3QgUHVyc2VJS2l0PWhhcmRlbih7XG5wdXJzZTpQdXJzZUksXG5kZXBvc2l0RmFjZXQ6RGVwb3NpdEZhY2V0SX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuSXNzdWVySSxcbk1pbnRJLFxuUGF5bWVudEksXG5QdXJzZUlLaXR9KTtcblxuIH07JGjigI1fb25jZS5tYWtlSXNzdWVySW50ZXJmYWNlcyhtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG5oYXJkZW4obWFrZUlzc3VlckludGVyZmFjZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyYW5kU2hhcGUiOlsiQnJhbmRTaGFwZSJdLCJJc3N1ZXJTaGFwZSI6WyJJc3N1ZXJTaGFwZSJdLCJQYXltZW50U2hhcGUiOlsiUGF5bWVudFNoYXBlIl0sIlB1cnNlU2hhcGUiOlsiUHVyc2VTaGFwZSJdLCJEZXBvc2l0RmFjZXRTaGFwZSI6WyJEZXBvc2l0RmFjZXRTaGFwZSJdLCJOb3RpZmllclNoYXBlIjpbIk5vdGlmaWVyU2hhcGUiXSwiTWludFNoYXBlIjpbIk1pbnRTaGFwZSJdLCJBbW91bnRTaGFwZSI6WyJBbW91bnRTaGFwZSJdLCJSYXRpb1NoYXBlIjpbIlJhdGlvU2hhcGUiXSwiaXNOYXRWYWx1ZSI6WyJpc05hdFZhbHVlIl0sImlzQ29weVNldFZhbHVlIjpbImlzQ29weVNldFZhbHVlIl0sImlzU2V0VmFsdWUiOlsiaXNTZXRWYWx1ZSJdLCJpc0NvcHlCYWdWYWx1ZSI6WyJpc0NvcHlCYWdWYWx1ZSJdLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiOlsiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIl0sIkFzc2V0S2luZFNoYXBlIjpbIkFzc2V0S2luZFNoYXBlIl0sIkRpc3BsYXlJbmZvU2hhcGUiOlsiRGlzcGxheUluZm9TaGFwZSJdLCJJc3N1ZXJLaXRTaGFwZSI6WyJJc3N1ZXJLaXRTaGFwZSJdLCJCcmFuZEkiOlsiQnJhbmRJIl0sIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIjpbIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACzPqVFwPwAAcD8AACkAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbW91bnRcbiAqIEFtb3VudHMgYXJlIGRlc2NyaXB0aW9ucyBvZiBkaWdpdGFsIGFzc2V0cywgYW5zd2VyaW5nIHRoZSBxdWVzdGlvbnNcbiAqIFwiaG93IG11Y2hcIiBhbmQgXCJvZiB3aGF0IGtpbmRcIi4gQW1vdW50cyBhcmUgdmFsdWVzIGxhYmVsZWQgd2l0aCBhIGJyYW5kLlxuICogQW1vdW50TWF0aCBleGVjdXRlcyB0aGUgbG9naWMgb2YgaG93IGFtb3VudHMgYXJlIGNoYW5nZWQgd2hlbiBkaWdpdGFsXG4gKiBhc3NldHMgYXJlIG1lcmdlZCwgc2VwYXJhdGVkLCBvciBvdGhlcndpc2UgbWFuaXB1bGF0ZWQuIEZvclxuICogZXhhbXBsZSwgYSBkZXBvc2l0IG9mIDIgYnVja3MgaW50byBhIHB1cnNlIHRoYXQgYWxyZWFkeSBoYXMgMyBidWNrc1xuICogZ2l2ZXMgYSBuZXcgcHVyc2UgYmFsYW5jZSBvZiA1IGJ1Y2tzLiBBbiBlbXB0eSBwdXJzZSBoYXMgMCBidWNrcy4gQW1vdW50TWF0aFxuICogcmVsaWVzIGhlYXZpbHkgb24gcG9seW1vcnBoaWMgTWF0aEhlbHBlcnMsIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHVuYnJhbmRlZFxuICogcG9ydGlvbi5cbiAqXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtBc3NldFZhbHVlRm9yS2luZDxLPn0gdmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtOYXRWYWx1ZSB8IFNldFZhbHVlIHwgQ29weVNldCB8IENvcHlCYWd9IEFtb3VudFZhbHVlXG4gKiBBbiBgQW1vdW50VmFsdWVgIGRlc2NyaWJlcyBhIHNldCBvciBxdWFudGl0eSBvZiBhc3NldHMgdGhhdCBjYW4gYmUgb3duZWQgb3JcbiAqIHNoYXJlZC5cbiAqXG4gKiBBIGZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQgdG8gcmVwcmVzZW50IGEgcXVhbnRpdHlcbiAqIG9mIHRoYXQgbWFueSBhc3NldHMuXG4gKlxuICogQSBub24tZnVuZ2libGUgYEFtb3VudFZhbHVlYCB1c2VzIGFuIGFycmF5IG9yIENvcHlTZXQgb2YgYEtleWBzIHRvIHJlcHJlc2VudFxuICogYSBzZXQgb2Ygd2hhdGV2ZXIgYXNzZXQgZWFjaCBrZXkgcmVwcmVzZW50cy4gQSBgS2V5YCBpcyBhIHBhc3NhYmxlIHZhbHVlXG4gKiB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIGVsZW1lbnQgaW4gYSBzZXQgKFNldFN0b3JlIG9yIENvcHlTZXQpIG9yIGFzIHRoZVxuICoga2V5IGluIGEgbWFwIChNYXBTdG9yZSBvciBDb3B5TWFwKS5cbiAqXG4gKiBgU2V0VmFsdWVgIGlzIGZvciB0aGUgZGVwcmVjYXRlZCBzZXQgcmVwcmVzZW50YXRpb24sIHVzaW5nIGFuIGFycmF5IGRpcmVjdGx5XG4gKiB0byByZXByZXNlbnQgdGhlIGFycmF5IG9mIGl0cyBlbGVtZW50cy4gYENvcHlTZXRgIGlzIHRoZSBwcm9wZXJcbiAqIHJlcHJlc2VudGF0aW9uIHVzaW5nIGEgQ29weVNldC5cbiAqXG4gKiBBIHNlbWktZnVuZ2libGUgYENvcHlCYWdgIGlzIHJlcHJlc2VudGVkIGFzIGFcbiAqIGBDb3B5QmFnYCBvZiBgS2V5YCBvYmplY3RzLiBcIkJhZ1wiIGlzIHN5bm9ueW1vdXMgd2l0aCBNdWx0aVNldCwgd2hlcmUgYW5cbiAqIGVsZW1lbnQgb2YgYSBiYWcgY2FuIGJlIHByZXNlbnQgb25jZSBvciBtb3JlIHRpbWVzLCBpLmUuLCBzb21lIHBvc2l0aXZlXG4gKiBiaWdpbnQgbnVtYmVyIG9mIHRpbWVzLCByZXByZXNlbnRpbmcgdGhhdCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgcmVwcmVzZW50ZWRcbiAqIGJ5IHRoYXQga2V5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyduYXQnIHwgJ3NldCcgfCAnY29weVNldCcgfCAnY29weUJhZycgfSBBc3NldEtpbmRcbiAqXG4gKiBTZWUgZG9jLWNvbW1lbnQgZm9yIGBBbW91bnRWYWx1ZWAuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHR5cGVkZWYge0sgZXh0ZW5kcyAnbmF0JyA/IE5hdFZhbHVlIDpcbiAqIEsgZXh0ZW5kcyAnc2V0JyA/IFNldFZhbHVlIDpcbiAqIEsgZXh0ZW5kcyAnY29weVNldCcgPyBDb3B5U2V0OlxuICogSyBleHRlbmRzICdjb3B5QmFnJyA/IENvcHlCYWcgOlxuICogbmV2ZXJcbiAqIH0gQXNzZXRWYWx1ZUZvcktpbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtWIGV4dGVuZHMgTmF0VmFsdWUgPyAnbmF0JyA6XG4gKiAgViBleHRlbmRzIFNldFZhbHVlID8gJ3NldCcgOlxuICogIFYgZXh0ZW5kcyBDb3B5U2V0ID8gJ2NvcHlTZXQnIDpcbiAqICBWIGV4dGVuZHMgQ29weUJhZyA/ICdjb3B5QmFnJyA6XG4gKiAgbmV2ZXJ9IEFzc2V0S2luZEZvclZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gRGlzcGxheUluZm9cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVjaW1hbFBsYWNlc10gVGVsbHMgdGhlIGRpc3BsYXkgc29mdHdhcmUgaG93XG4gKiAgIG1hbnkgZGVjaW1hbCBwbGFjZXMgdG8gbW92ZSB0aGUgZGVjaW1hbCBvdmVyIHRvIHRoZSBsZWZ0LCBvciBpblxuICogICBvdGhlciB3b3Jkcywgd2hpY2ggcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gd2hvbGUgbnVtYmVycy4gV2VcbiAqICAgcmVxdWlyZSBmdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB0byBiZSByZXByZXNlbnRlZCBpbiBpbnRlZ2VycywgaW5cbiAqICAgdGhlIHNtYWxsZXN0IHVuaXQgKGkuZS4gVVNEIG1pZ2h0IGJlIHJlcHJlc2VudGVkIGluIG1pbGwsIGFcbiAqICAgdGhvdXNhbmR0aCBvZiBhIGRvbGxhci4gSW4gdGhhdCBjYXNlLCBgZGVjaW1hbFBsYWNlc2Agd291bGQgYmVcbiAqICAgMy4pIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwsIGFuZCBmb3Igbm9uLWZ1bmdpYmxlIGRpZ2l0YWxcbiAqICAgYXNzZXRzLCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4gVGhlIGRlY2ltYWxQbGFjZXMgcHJvcGVydHlcbiAqICAgc2hvdWxkIGJlIHVzZWQgZm9yICpkaXNwbGF5IHB1cnBvc2VzIG9ubHkqLiBBbnkgb3RoZXIgdXNlIGlzIGFuXG4gKiAgIGFudGktcGF0dGVybi5cbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kIC0gdGhlIGtpbmQgb2YgYXNzZXQsIGVpdGhlclxuICogICBBc3NldEtpbmQuTkFUIChmdW5naWJsZSkgb3JcbiAqICAgQXNzZXRLaW5kLlNFVCBvciBBc3NldEtpbmQuQ09QWV9TRVQgKG5vbi1mdW5naWJsZSlcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcmFuZFxuICogVGhlIGJyYW5kIGlkZW50aWZpZXMgdGhlIGtpbmQgb2YgaXNzdWVyLCBhbmQgaGFzIGEgZnVuY3Rpb24gdG8gZ2V0IHRoZVxuICogYWxsZWdlZCBuYW1lIGZvciB0aGUga2luZCBvZiBhc3NldCBkZXNjcmliZWQuIFRoZSBhbGxlZ2VkIG5hbWUgKHN1Y2hcbiAqIGFzICdCVEMnIG9yICdtb29sYScpIGlzIHByb3ZpZGVkIGJ5IHRoZSBtYWtlciBvZiB0aGUgaXNzdWVyIGFuZCBzaG91bGRcbiAqIG5vdCBiZSB0cnVzdGVkIGFzIGFjY3VyYXRlLlxuICpcbiAqIEV2ZXJ5IGFtb3VudCBjcmVhdGVkIGJ5IGEgcGFydGljdWxhciBBbW91bnRNYXRoIHdpbGwgc2hhcmUgdGhlIHNhbWUgYnJhbmQsXG4gKiBidXQgcmVjaXBpZW50cyBjYW5ub3QgcmVseSBvbiB0aGUgYnJhbmQgdG8gdmVyaWZ5IHRoYXQgYSBwdXJwb3J0ZWQgYW1vdW50XG4gKiByZXByZXNlbnRzIHRoZSBpc3N1ZXIgdGhleSBpbnRlbmRlZCwgc2luY2UgdGhlIHNhbWUgYnJhbmQgY2FuIGJlIHJldXNlZCBieVxuICogYSBtaXNiZWhhdmluZyBpc3N1ZXIuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZElzc3VlcjogRVJlZjxJc3N1ZXI+KSA9PiBQcm9taXNlPGJvb2xlYW4+fSBpc015SXNzdWVyXG4gKiBTaG91bGQgYmUgdXNlZCB3aXRoIGBpc3N1ZXIuZ2V0QnJhbmRgIHRvIGVuc3VyZSBhbiBpc3N1ZXIgYW5kIGJyYW5kIG1hdGNoLlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldEFsbGVnZWROYW1lXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvPEs+fSBnZXREaXNwbGF5SW5mb1xuICogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHByb3BlcnR5IHsoKSA9PiBQYXR0ZXJufSBnZXRBbW91bnRTaGFwZVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJc3N1ZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVySXNMaXZlXG4gKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIHBheW1lbnQgY29udGludWVzIHRvIGV4aXN0LlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyR2V0QW1vdW50T2ZcbiAqXG4gKiBHZXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudC4gQmVjYXVzZSB0aGVcbiAqIHBheW1lbnQgaXMgbm90IHRydXN0ZWQsIHdlIGNhbm5vdCBjYWxsIGEgbWV0aG9kIG9uIGl0IGRpcmVjdGx5LCBhbmRcbiAqIG11c3QgdXNlIHRoZSBpc3N1ZXIgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlckJ1cm5cbiAqXG4gKiBCdXJuIGFsbCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiBwYXltZW50LiBgb3B0QW1vdW50YCBpcyBvcHRpb25hbC4gSWYgYG9wdEFtb3VudGAgaXMgcHJlc2VudCwgdGhlXG4gKiBjb2RlIHdpbGwgaW5zaXN0IHRoYXQgdGhlIGFtb3VudCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiBwYXltZW50IGlzIGVxdWFsIHRvIGBvcHRBbW91bnRgLCB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIHdyb25nXG4gKiBwYXltZW50IGFuZCBvdGhlciBjb25mdXNpb24uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJDbGFpbVxuICpcbiAqIFRyYW5zZmVyIGFsbCBkaWdpdGFsIGFzc2V0cyBmcm9tIHRoZSBwYXltZW50IHRvIGEgbmV3IHBheW1lbnQgYW5kXG4gKiBkZWxldGUgdGhlIG9yaWdpbmFsLiBgb3B0QW1vdW50YCBpcyBvcHRpb25hbC4gSWYgYG9wdEFtb3VudGAgaXNcbiAqIHByZXNlbnQsIHRoZSBjb2RlIHdpbGwgaW5zaXN0IHRoYXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpblxuICogdGhlIHBheW1lbnQgaXMgZXF1YWwgdG8gYG9wdEFtb3VudGAsIHRvIHByZXZlbnQgc2VuZGluZyB0aGUgd3JvbmdcbiAqIHBheW1lbnQgYW5kIG90aGVyIGNvbmZ1c2lvbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJDb21iaW5lXG4gKlxuICogQ29tYmluZSBtdWx0aXBsZSBwYXltZW50cyBpbnRvIG9uZSBwYXltZW50LlxuICpcbiAqIElmIGFueSBvZiB0aGUgcGF5bWVudHMgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZFxuICogdXBvbiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+PltdfSBwYXltZW50c0FycmF5XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gW29wdFRvdGFsQW1vdW50XVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlclNwbGl0XG4gKlxuICogU3BsaXQgYSBzaW5nbGUgcGF5bWVudCBpbnRvIHR3byBwYXltZW50cyxcbiAqIEEgYW5kIEIsIGFjY29yZGluZyB0byB0aGUgcGF5bWVudEFtb3VudEEgcGFzc2VkIGluLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBwYXltZW50QW1vdW50QVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPltdPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJTcGxpdE1hbnlcbiAqXG4gKiBTcGxpdCBhIHNpbmdsZSBwYXltZW50IGludG8gbWFueSBwYXltZW50cywgYWNjb3JkaW5nIHRvIHRoZSBhbW91bnRzXG4gKiBwYXNzZWQgaW4uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnRbXX0gYW1vdW50c1xuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudFtdPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJcbiAqXG4gKiBUaGUgaXNzdWVyIGNhbm5vdCBtaW50IGEgbmV3IGFtb3VudCwgYnV0IGl0IGNhbiBjcmVhdGUgZW1wdHkgcHVyc2VzXG4gKiBhbmQgcGF5bWVudHMuIFRoZSBpc3N1ZXIgY2FuIGFsc28gdHJhbnNmb3JtIHBheW1lbnRzIChzcGxpdHRpbmdcbiAqIHBheW1lbnRzLCBjb21iaW5pbmcgcGF5bWVudHMsIGJ1cm5pbmcgcGF5bWVudHMsIGFuZCBjbGFpbWluZ1xuICogcGF5bWVudHMgZXhjbHVzaXZlbHkpLiBUaGUgaXNzdWVyIHNob3VsZCBiZSBnb3R0ZW4gZnJvbSBhIHRydXN0ZWRcbiAqIHNvdXJjZSBhbmQgdGhlbiByZWxpZWQgdXBvbiBhcyB0aGUgZGVjaWRlciBvZiB3aGV0aGVyIGFuIHVudHJ1c3RlZFxuICogcGF5bWVudCBpcyB2YWxpZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRCcmFuZCBHZXQgdGhlIEJyYW5kIGZvciB0aGlzIElzc3Vlci4gVGhlXG4gKiBCcmFuZCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCBhbmQgaXMgc2hhcmVkIGJ5IHRoZVxuICogbWludCwgdGhlIGlzc3VlciwgYW5kIGFueSBwdXJzZXMgYW5kIHBheW1lbnRzIG9mIHRoaXMgcGFydGljdWxhclxuICoga2luZC4gVGhlIGJyYW5kIGlzIG5vdCBjbG9zZWx5IGhlbGQsIHNvIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZVxuICogdHJ1c3RlZCB0byBpZGVudGlmeSBhbiBpc3N1ZXIgYWxvbmUuIEZha2UgZGlnaXRhbCBhc3NldHMgYW5kIGFtb3VudFxuICogY2FuIHVzZSBhbm90aGVyIGlzc3VlcidzIGJyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRBbGxlZ2VkTmFtZSBHZXQgdGhlIGFsbGVnZWROYW1lIGZvclxuICogdGhpcyBtaW50L2lzc3VlclxuICogQHByb3BlcnR5IHsoKSA9PiBBc3NldEtpbmR9IGdldEFzc2V0S2luZCBHZXQgdGhlIGtpbmQgb2ZcbiAqIE1hdGhIZWxwZXJzIHVzZWQgYnkgdGhpcyBJc3N1ZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvPEs+fSBnZXREaXNwbGF5SW5mbyBHaXZlIGluZm9ybWF0aW9uIHRvIFVJXG4gKiAgb24gaG93IHRvIGRpc3BsYXkgYW1vdW50cyBmb3IgdGhpcyBpc3N1ZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IFB1cnNlPEs+fSBtYWtlRW1wdHlQdXJzZSBNYWtlIGFuIGVtcHR5IHB1cnNlIG9mIHRoaXNcbiAqIGJyYW5kLlxuICogQHByb3BlcnR5IHtJc3N1ZXJJc0xpdmV9IGlzTGl2ZVxuICogQHByb3BlcnR5IHtJc3N1ZXJHZXRBbW91bnRPZjxLPn0gZ2V0QW1vdW50T2ZcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyQnVybn0gYnVyblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW1lbnRMZWRnZXJcbiAqIEBwcm9wZXJ0eSB7TWludDxLPn0gbWludFxuICogQHByb3BlcnR5IHtQdXJzZTxLPn0gbWludFJlY292ZXJ5UHVyc2VcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyS2l0XG4gKiBAcHJvcGVydHkge01pbnQ8Sz59IG1pbnRcbiAqIEBwcm9wZXJ0eSB7UHVyc2U8Sz59IG1pbnRSZWNvdmVyeVB1cnNlXG4gKiBAcHJvcGVydHkge0lzc3VlcjxLPn0gaXNzdWVyXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZGl0aW9uYWxEaXNwbGF5SW5mb1xuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVjaW1hbFBsYWNlc10gVGVsbHMgdGhlIGRpc3BsYXkgc29mdHdhcmUgaG93XG4gKiAgIG1hbnkgZGVjaW1hbCBwbGFjZXMgdG8gbW92ZSB0aGUgZGVjaW1hbCBvdmVyIHRvIHRoZSBsZWZ0LCBvciBpblxuICogICBvdGhlciB3b3Jkcywgd2hpY2ggcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gd2hvbGUgbnVtYmVycy4gV2VcbiAqICAgcmVxdWlyZSBmdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB0byBiZSByZXByZXNlbnRlZCBpbiBpbnRlZ2VycywgaW5cbiAqICAgdGhlIHNtYWxsZXN0IHVuaXQgKGkuZS4gVVNEIG1pZ2h0IGJlIHJlcHJlc2VudGVkIGluIG1pbGwsIGFcbiAqICAgdGhvdXNhbmR0aCBvZiBhIGRvbGxhci4gSW4gdGhhdCBjYXNlLCBgZGVjaW1hbFBsYWNlc2Agd291bGQgYmVcbiAqICAgMy4pIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwsIGFuZCBmb3Igbm9uLWZ1bmdpYmxlIGRpZ2l0YWxcbiAqICAgYXNzZXRzLCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4gVGhlIGRlY2ltYWxQbGFjZXMgcHJvcGVydHlcbiAqICAgc2hvdWxkIGJlIHVzZWQgZm9yICpkaXNwbGF5IHB1cnBvc2VzIG9ubHkqLiBBbnkgb3RoZXIgdXNlIGlzIGFuXG4gKiAgIGFudGktcGF0dGVybi5cbiAqIEBwcm9wZXJ0eSB7QXNzZXRLaW5kfSBbYXNzZXRLaW5kXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuU2h1dGRvd25XaXRoRmFpbHVyZX0gU2h1dGRvd25XaXRoRmFpbHVyZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1pbnRcbiAqIEhvbGRpbmcgYSBNaW50IGNhcnJpZXMgdGhlIHJpZ2h0IHRvIGlzc3VlIG5ldyBkaWdpdGFsIGFzc2V0cy4gVGhlc2VcbiAqIGFzc2V0cyBhbGwgaGF2ZSB0aGUgc2FtZSBraW5kLCB3aGljaCBpcyBjYWxsZWQgYSBCcmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3VlcjxLPn0gZ2V0SXNzdWVyIEdldHMgdGhlIElzc3VlciBmb3IgdGhpcyBtaW50LlxuICogQHByb3BlcnR5IHsobmV3QW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnQ8Sz59IG1pbnRQYXltZW50XG4gKiBDcmVhdGVzIGEgbmV3IFBheW1lbnQgY29udGFpbmluZyBuZXdseSBtaW50ZWQgYW1vdW50LlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIERlcG9zaXRGYWNldFJlY2VpdmVcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVwb3NpdEZhY2V0XG4gKiBAcHJvcGVydHkge0RlcG9zaXRGYWNldFJlY2VpdmV9IHJlY2VpdmVcbiAqIERlcG9zaXQgYWxsIHRoZSBjb250ZW50cyBvZiBwYXltZW50IGludG8gdGhlIHB1cnNlIHRoYXQgbWFkZSB0aGlzIGZhY2V0LFxuICogcmV0dXJuaW5nIHRoZSBhbW91bnQuIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgb3B0QW1vdW50YCBkb2VzIG5vdCBlcXVhbCB0aGVcbiAqIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudCwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogSWYgcGF5bWVudCBpcyBhIHByb21pc2UsIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBQdXJzZURlcG9zaXRcbiAqIEBwYXJhbSB7UGF5bWVudDxLPn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1cnNlXG4gKiBQdXJzZXMgaG9sZCBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgb2YgdGhlIHNhbWUgYnJhbmQsIGJ1dCB1bmxpa2UgUGF5bWVudHMsXG4gKiB0aGV5IGFyZSBub3QgbWVhbnQgdG8gYmUgc2VudCB0byBvdGhlcnMuIFRvIHRyYW5zZmVyIGRpZ2l0YWwgYXNzZXRzLCBhXG4gKiBQYXltZW50IHNob3VsZCBiZSB3aXRoZHJhd24gZnJvbSBhIFB1cnNlLiBUaGUgYW1vdW50IG9mIGRpZ2l0YWxcbiAqIGFzc2V0cyBpbiBhIHB1cnNlIGNhbiBjaGFuZ2UgdGhyb3VnaCB0aGUgYWN0aW9uIG9mIGRlcG9zaXQoKSBhbmQgd2l0aGRyYXcoKS5cbiAqXG4gKiBUaGUgcHJpbWFyeSB1c2UgZm9yIFB1cnNlcyBhbmQgUGF5bWVudHMgaXMgZm9yIGN1cnJlbmN5LWxpa2UgYW5kIGdvb2RzLWxpa2VcbiAqIGRpZ2l0YWwgYXNzZXRzLCBidXQgdGhleSBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlcHJlc2VudCBvdGhlciBraW5kcyBvZiByaWdodHMsXG4gKiBzdWNoIGFzIHRoZSByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgY29udHJhY3QuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QWxsZWdlZEJyYW5kIEdldCB0aGUgYWxsZWdlZCBCcmFuZCBmb3IgdGhpcyBQdXJzZVxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSBnZXRDdXJyZW50QW1vdW50XG4gKiBHZXQgdGhlIGFtb3VudCBjb250YWluZWQgaW4gdGhpcyBwdXJzZS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IExhdGVzdFRvcGljPEFtb3VudDxLPj59IGdldEN1cnJlbnRBbW91bnROb3RpZmllclxuICogR2V0IGEgbG9zc3kgbm90aWZpZXIgZm9yIGNoYW5nZXMgdG8gdGhpcyBwdXJzZSdzIGJhbGFuY2UuXG4gKlxuICogQHByb3BlcnR5IHtQdXJzZURlcG9zaXQ8Sz59IGRlcG9zaXRcbiAqIERlcG9zaXQgYWxsIHRoZSBjb250ZW50cyBvZiBwYXltZW50IGludG8gdGhpcyBwdXJzZSwgcmV0dXJuaW5nIHRoZVxuICogYW1vdW50LiBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgYG9wdEFtb3VudGAgZG9lcyBub3QgZXF1YWwgdGhlXG4gKiBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIElmIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IERlcG9zaXRGYWNldH0gZ2V0RGVwb3NpdEZhY2V0XG4gKiBSZXR1cm4gYW4gb2JqZWN0IHdob3NlIGByZWNlaXZlYCBtZXRob2QgZGVwb3NpdHMgdG8gdGhlIGN1cnJlbnQgUHVyc2UuXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnQ8Sz59IHdpdGhkcmF3XG4gKiBXaXRoZHJhdyBhbW91bnQgZnJvbSB0aGlzIHB1cnNlIGludG8gYSBuZXcgUGF5bWVudC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IENvcHlTZXQ8UGF5bWVudDxLPj59IGdldFJlY292ZXJ5U2V0XG4gKiBUaGUgc2V0IG9mIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tIHRoaXMgcHVyc2UgdGhhdCBhcmUgc3RpbGwgbGl2ZS4gVGhlc2VcbiAqIGFyZSB0aGUgcGF5bWVudHMgdGhhdCBjYW4gc3RpbGwgYmUgcmVjb3ZlcmVkIGluIGVtZXJnZW5jaWVzIGJ5LCBmb3IgZXhhbXBsZSxcbiAqIGRlcG9zaXRpbmcgaW50byB0aGlzIHB1cnNlLiBTdWNoIGEgZGVwb3NpdCBhY3Rpb24gaXMgbGlrZSBjYW5jZWxpbmcgYW5cbiAqIG91dHN0YW5kaW5nIGNoZWNrIGJlY2F1c2UgeW91J3JlIHRpcmVkIG9mIHdhaXRpbmcgZm9yIGl0LiBPbmNlIHlvdXJcbiAqIGNhbmNlbGxhdGlvbiBpcyBhY2tub3dsZWRnZWQsIHlvdSBjYW4gc3BlbmQgdGhlIGFzc2V0cyBhdCBzdGFrZSBvbiBvdGhlclxuICogdGhpbmdzLiBBZnRlcndhcmRzLCBpZiB0aGUgcmVjaXBpZW50IG9mIHRoZSBvcmlnaW5hbCBjaGVjayBmaW5hbGx5IGdldHNcbiAqIGFyb3VuZCB0byBkZXBvc2l0aW5nIGl0LCB0aGVpciBkZXBvc2l0IGZhaWxzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSByZWNvdmVyQWxsXG4gKiBGb3IgdXNlIGluIGVtZXJnZW5jaWVzLCBzdWNoIGFzIGNvbWluZyBiYWNrIGZyb20gYSB0cmF1bWF0aWMgY3Jhc2ggYW5kXG4gKiB1cGdyYWRlLiBUaGlzIGRlcG9zaXRzIGFsbCB0aGUgcGF5bWVudHMgaW4gdGhpcyBwdXJzZSdzIHJlY292ZXJ5IHNldFxuICogaW50byB0aGUgcHVyc2UgaXRzZWxmLCByZXR1cm5pbmcgdGhlIHRvdGFsIGFtb3VudCBvZiBhc3NldHMgcmVjb3ZlcmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW1lbnRcbiAqIFBheW1lbnRzIGhvbGQgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIG9mIHRoZSBzYW1lIGJyYW5kIGluIHRyYW5zaXQuIFBheW1lbnRzXG4gKiBjYW4gYmUgZGVwb3NpdGVkIGluIHB1cnNlcywgc3BsaXQgaW50byBtdWx0aXBsZSBwYXltZW50cywgY29tYmluZWQsIGFuZFxuICogY2xhaW1lZCAoZ2V0dGluZyBhbiBleGNsdXNpdmUgcGF5bWVudCkuIFBheW1lbnRzIGFyZSBsaW5lYXIsIG1lYW5pbmdcbiAqIHRoYXQgZWl0aGVyIGEgcGF5bWVudCBoYXMgdGhlIHNhbWUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGl0XG4gKiBzdGFydGVkIHdpdGgsIG9yIGl0IGlzIHVzZWQgdXAgZW50aXJlbHkuIEl0IGlzIGltcG9zc2libGUgdG8gcGFydGlhbGx5IHVzZSBhXG4gKiBwYXltZW50LlxuICpcbiAqIFBheW1lbnRzIGFyZSBvZnRlbiByZWNlaXZlZCBmcm9tIG90aGVyIGFjdG9ycyBhbmQgdGhlcmVmb3JlIHNob3VsZFxuICogbm90IGJlIHRydXN0ZWQgdGhlbXNlbHZlcy4gVG8gZ2V0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gYSBwYXltZW50LFxuICogdXNlIHRoZSB0cnVzdGVkIGlzc3VlcjogaXNzdWVyLmdldEFtb3VudE9mKHBheW1lbnQpLFxuICpcbiAqIFBheW1lbnRzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gUHVyc2VzIGJ5IGdldHRpbmcgYSB0cnVzdGVkIGlzc3VlciBhbmRcbiAqIGNhbGxpbmcgYGlzc3Vlci5tYWtlRW1wdHlQdXJzZSgpYCB0byBjcmVhdGUgYSBwdXJzZSwgdGhlblxuICogYHB1cnNlLmRlcG9zaXQocGF5bWVudClgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8Sz59IGdldEFsbGVnZWRCcmFuZFxuICogR2V0IHRoZSBhbGxlZ2VkQnJhbmQsIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCB0aGlzXG4gKiBwYXltZW50IHB1cnBvcnRzIHRvIGJlLCBhbmQgd2hpY2ggaXNzdWVyIHRvIHVzZS4gQmVjYXVzZSBwYXltZW50c1xuICogYXJlIG5vdCB0cnVzdGVkLCBhbnkgbWV0aG9kIGNhbGxzIG9uIHBheW1lbnRzIHNob3VsZCBiZSB0cmVhdGVkXG4gKiB3aXRoIHN1c3BpY2lvbiBhbmQgdmVyaWZpZWQgZWxzZXdoZXJlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0aEhlbHBlcnNcbiAqIEFsbCBvZiB0aGUgZGlmZmVyZW5jZSBpbiBob3cgZGlnaXRhbCBhc3NldCBhbW91bnQgYXJlIG1hbmlwdWxhdGVkIGNhbiBiZVxuICogcmVkdWNlZCB0byB0aGUgYmVoYXZpb3Igb2YgdGhlIG1hdGggb24gdmFsdWVzLiBXZSBleHRyYWN0IHRoaXNcbiAqIGN1c3RvbSBsb2dpYyBpbnRvIG1hdGhIZWxwZXJzLiBNYXRoSGVscGVycyBhcmUgYWJvdXQgdmFsdWVcbiAqIGFyaXRobWV0aWMsIHdoZXJlYXMgQW1vdW50TWF0aCBpcyBhYm91dCBhbW91bnRzLCB3aGljaCBhcmUgdGhlXG4gKiB2YWx1ZXMgbGFiZWxlZCB3aXRoIGEgYnJhbmQuIEFtb3VudE1hdGggdXNlIG1hdGhIZWxwZXJzIHRvIGRvIHRoZWlyIHZhbHVlXG4gKiBhcml0aG1ldGljLCBhbmQgdGhlbiBicmFuZCB0aGUgcmVzdWx0cywgbWFraW5nIGEgbmV3IGFtb3VudC5cbiAqXG4gKiBUaGUgTWF0aEhlbHBlcnMgYXJlIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCBvbmx5IGZyb20gQW1vdW50TWF0aCwgYW5kIHNvXG4gKiBhbGwgbWV0aG9kcyBidXQgY29lcmNlIGNhbiBhc3N1bWUgdGhlaXIgaW5wdXRzIGFyZSB2YWxpZC4gVGhleSBvbmx5XG4gKiBuZWVkIHRvIGRvIG91dHB1dCB2YWxpZGF0aW9uLCBhbmQgb25seSB3aGVuIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgb2ZcbiAqIGludmFsaWQgb3V0cHV0LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRWYWx1ZTogVikgPT4gVn0gZG9Db2VyY2VcbiAqIENoZWNrIHRoZSBraW5kIG9mIHRoaXMgdmFsdWUgYW5kIHRocm93IGlmIGl0IGlzIG5vdCB0aGVcbiAqIGV4cGVjdGVkIGtpbmQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBWfSBkb01ha2VFbXB0eVxuICogR2V0IHRoZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGlkZW50aXR5IGVsZW1lbnQgKG9mdGVuIDAgb3IgYW5cbiAqIGVtcHR5IGFycmF5KVxuICpcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlOiBWKSA9PiBib29sZWFufSBkb0lzRW1wdHlcbiAqIElzIHRoZSB2YWx1ZSB0aGUgaWRlbnRpdHkgZWxlbWVudD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gYm9vbGVhbn0gZG9Jc0dURVxuICogSXMgdGhlIGxlZnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSByaWdodD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gYm9vbGVhbn0gZG9Jc0VxdWFsXG4gKiBEb2VzIGxlZnQgZXF1YWwgcmlnaHQ/XG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IFZ9IGRvQWRkXG4gKiBSZXR1cm4gdGhlIGxlZnQgY29tYmluZWQgd2l0aCB0aGUgcmlnaHQuXG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IFZ9IGRvU3VidHJhY3RcbiAqIFJldHVybiB3aGF0IHJlbWFpbnMgYWZ0ZXIgcmVtb3ZpbmcgdGhlIHJpZ2h0IGZyb20gdGhlIGxlZnQuIElmXG4gKiBzb21ldGhpbmcgaW4gdGhlIHJpZ2h0IHdhcyBub3QgaW4gdGhlIGxlZnQsIHdlIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2JpZ2ludH0gTmF0VmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcnJheTxLZXk+fSBTZXRWYWx1ZVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEWu2GpKLQAASi0AADQAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjAvc3JjL2ZlZURpc3RyaWJ1dG9yLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvZXJ0cC9zcmMvbGVnYWN5LXBheW1lbnQtaGVscGVycy5qcyIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIiwiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiLCJAZW5kby9mYXIiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJjdXN0b21UZXJtc1NoYXBlIiwibWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yIiwibWFrZUZlZURpc3RyaWJ1dG9yIiwibWFrZVNoYXJlQ29uZmlnIiwic2hhcmVQYXltZW50Iiwic3RhcnQiLCJzdGFydERpc3RyaWJ1dGluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRNYXRoLHNwbGl0TWFueSxFLEZhcixOYXQsb2JzZXJ2ZU5vdGlmaWVyLG11c3RNYXRjaCxtYWtlU2NhbGFyU2V0U3RvcmUsTSxSZWxhdGl2ZVRpbWVTaGFwZSxLZXl3b3JkU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cC9zcmMvbGVnYWN5LXBheW1lbnQtaGVscGVycy5qc1wiLCBbW1wic3BsaXRNYW55XCIsIFskaOKAjV9hID0+IChzcGxpdE1hbnkgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjigI1fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJTZXRTdG9yZSA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlJlbGF0aXZlVGltZVNoYXBlXCIsIFskaOKAjV9hID0+IChSZWxhdGl2ZVRpbWVTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiS2V5d29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChLZXl3b3JkU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdCBLZXl3b3JkU2hhcmVzU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsTS5uYXQoKSk7XG5cbi8qKlxuICogQSBwYXR0ZXJuIGZvciBab2UgdG8gY2hlY2sgY3VzdG9tIHRlcm1zIGJlZm9yZSBgc3RhcnQoKWBpbmcgdGhlIGNvbnRyYWN0LlxuICovXG5jb25zdCAgICAgICAgY3VzdG9tVGVybXNTaGFwZT1oYXJkZW4oe1xua2V5d29yZFNoYXJlczpLZXl3b3JkU2hhcmVzU2hhcGUsXG50aW1lclNlcnZpY2U6TS5lcmVmKE0ucmVtb3RhYmxlKCdUaW1lclNlcnZpY2UnKSksXG5jb2xsZWN0aW9uSW50ZXJ2YWw6UmVsYXRpdmVUaW1lU2hhcGV9KTtcblxuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuUmVsYXRpdmVUaW1lfSBSZWxhdGl2ZVRpbWVcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlfSBUaW1lclNlcnZpY2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZlZUNvbGxlY3RvclxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxQYXltZW50PCduYXQnPj59IGNvbGxlY3RGZWVzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQZXJpb2RpY0ZlZUNvbGxlY3RvclxuICogQHByb3BlcnR5IHsoKSA9PiBGZWVDb2xsZWN0b3J9IGdldENvbGxlY3RvclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjb2xsZWN0QW5kRGlzdHJpYnV0ZU5vd1xuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBzdG9wXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb2xsZWN0aWJsZUNvbnRyYWN0RmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPHN0cmluZywgbmV2ZXI+Pn0gbWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogd3JhcHBlciB0byB0YWtlIHRoZSBhIGNyZWF0b3JGYWNldCAoZS5nLiB2YXVsdEZhY3RvcnkpIGFuZCBtYWtlIGEgY2FsbCB0aGF0XG4gKiB3aWxsIHJlcXVlc3QgYW4gaW52aXRhdGlvbiBhbmQgcmV0dXJuIGEgcHJvbWlzZSBmb3IgYSBwYXltZW50LlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge0VSZWY8Q29sbGVjdGlibGVDb250cmFjdEZhY2V0Pn0gY3JlYXRvckZhY2V0XG4gKi8kaOKAjV9vbmNlLmN1c3RvbVRlcm1zU2hhcGUoY3VzdG9tVGVybXNTaGFwZSk7XG5jb25zdCAgICAgICAgbWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yPSh6b2UsY3JlYXRvckZhY2V0KT0+e1xuLyoqIEB0eXBlIHtGZWVDb2xsZWN0b3J9ICovXG5yZXR1cm4gRmFyKCdmZWVDb2xsZWN0b3InLHtcbmNvbGxlY3RGZWVzOigpPT57XG5jb25zdCBpbnZpdGF0aW9uPUUoY3JlYXRvckZhY2V0KS5tYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uKCk7XG5jb25zdCBjb2xsZWN0RmVlc1NlYXQ9RSh6b2UpLm9mZmVyKGludml0YXRpb24sdW5kZWZpbmVkLHVuZGVmaW5lZCk7XG5yZXR1cm4gRShjb2xsZWN0RmVlc1NlYXQpLmdldFBheW91dCgnRmVlJyk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBBIGRpc3RyaWJ1dG9yIG9mIGZlZXMgZnJvbSBJbnRlciBQcm90b2NvbCBzb3VyY2VzIHRvIGRlcG9zaXQgZmFjZXRzLiBFYWNoXG4gKiB0aW1lIHRoZSBlcG9jaFRpbWVyIHNpZ25hbHMgdGhlIGVuZCBvZiBhbiBFcG9jaCwgaXQgd2lsbCBhc2sgdGhlIGNvbnRyYWN0c1xuICogZm9yIGZlZXMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIHRvIGRhdGUgYW5kIHNlbmQgdGhhdCBwYXltZW50IHRvIHRoZVxuICogZGVwb3NpdEZhY2V0LlxuICpcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx1bmtub3duPn0gc2NoZWR1bGVQYXltZW50cyAtIGRpc3RyaWJ1dGUgdG8gdGhlIGRlc3RpbmF0aW9uc1xuICogQHBhcmFtIHtFUmVmPFRpbWVyU2VydmljZT59IHRpbWVyU2VydmljZSAtIHRpbWVyIHRoYXQgaXMgdXNlZCB0byBzY2hlZHVsZSBjb2xsZWN0aW9uc1xuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWV9IFtjb2xsZWN0aW9uSW50ZXJ2YWxdIC0gaG93IG9mdGVuIHRvIGNvbGxlY3QgZmVlcyBpbiB0aGVcbiAqIGB0aW1lclNlcnZpY2VgIHVuaXRcbiAqLyRo4oCNX29uY2UubWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yKG1ha2VDb250cmFjdEZlZUNvbGxlY3Rvcik7XG5jb25zdCAgICAgICAgc3RhcnREaXN0cmlidXRpbmc9KFxuc2NoZWR1bGVQYXltZW50cyxcbnRpbWVyU2VydmljZSxcbmNvbGxlY3Rpb25JbnRlcnZhbD0xbik9Plxue1xuY29uc3QgdGltZU9ic2VydmVyPXtcbnVwZGF0ZVN0YXRlOihfKT0+XG5zY2hlZHVsZVBheW1lbnRzKCkuY2F0Y2goKGUpPT57XG5jb25zb2xlLmVycm9yKCdmYWlsZWQgd2l0aCcsZSk7XG50aHJvdyBlO1xuIH0pLFxuZmFpbDoocmVhc29uKT0+e1xudGhyb3cgRXJyb3IoIGBmZWUgZGlzdHJpYnV0b3IgdGltZXIgZmFpbGVkOiAke3JlYXNvbn1gKTtcbiB9LFxuZmluaXNoOihkb25lKT0+e1xudGhyb3cgRXJyb3IoIGBmZWUgZGlzdHJpYnV0b3IgdGltZXIgZGllZDogJHtkb25lfWApO1xuIH19O1xuXG5cbmNvbnN0IGNvbGxlY3Rpb25Ob3RpZmllcj1FKHRpbWVyU2VydmljZSkubWFrZU5vdGlmaWVyKFxuMG4sXG5jb2xsZWN0aW9uSW50ZXJ2YWwpO1xuXG5vYnNlcnZlTm90aWZpZXIoY29sbGVjdGlvbk5vdGlmaWVyLHRpbWVPYnNlcnZlcikuY2F0Y2goKGUpPT57XG5jb25zb2xlLmVycm9yKCdmZWUgZGlzdHJpYnV0b3IgZmFpbGVkIHdpdGgnLGUpO1xuIH0pO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge3sgcHVzaFBheW1lbnQ6IChwYXltZW50OiBQYXltZW50LCBpc3N1ZXI6IEVSZWY8SXNzdWVyPikgPT4gUHJvbWlzZTxBbW91bnQ+fX0gRmVlRGVzdGluYXRpb25cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxLZXl3b3JkLCBFUmVmPEZlZURlc3RpbmF0aW9uPj59IFtkZXN0aW5hdGlvbnNdXG4gKiBAcGFyYW0ge1JlY29yZDxLZXl3b3JkLCBOYXRWYWx1ZT59IFtrZXl3b3JkU2hhcmVzXVxuICovJGjigI1fb25jZS5zdGFydERpc3RyaWJ1dGluZyhzdGFydERpc3RyaWJ1dGluZyk7XG5jb25zdCAgICAgICAgbWFrZVNoYXJlQ29uZmlnPShkZXN0aW5hdGlvbnM9e30sa2V5d29yZFNoYXJlcz17fSk9PntcbmxldCB0b3RhbFNoYXJlcz0wbjtcbmNvbnN0IHNoYXJlcz1PYmplY3QuZW50cmllcyhkZXN0aW5hdGlvbnMpLlxuZmlsdGVyKChbXyxkc3RdKT0+ZHN0KS5cbm1hcCgoW2t3LGRlc3RpbmF0aW9uXSk9PntcbmNvbnN0IHNoYXJlPU5hdChrZXl3b3JkU2hhcmVzW2t3XSk7XG50b3RhbFNoYXJlcys9c2hhcmU7XG5yZXR1cm57XG5zaGFyZSxcbmRlc3RpbmF0aW9ufTtcblxuIH0pO1xucmV0dXJue3NoYXJlcyx0b3RhbFNoYXJlc307XG4gfTtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlU2hhcmVDb25maWc+fSBTaGFyZUNvbmZpZyAqL1xuXG4vKipcbiAqIFNwbGl0IGFuZCBkZXBvc2l0IGEgcGF5bWVudCBnaXZlbiBhIHNoYXJlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXltZW50PCduYXQnPn0gcGF5bWVudFxuICogQHBhcmFtIHtFUmVmPElzc3VlcjwnbmF0Jz4+fSBpc3N1ZXJcbiAqIEBwYXJhbSB7U2hhcmVDb25maWd9IHNoYXJlQ29uZmlnXG4gKi8kaOKAjV9vbmNlLm1ha2VTaGFyZUNvbmZpZyhtYWtlU2hhcmVDb25maWcpO1xuY29uc3QgICAgICAgIHNoYXJlUGF5bWVudD1hc3luYyhcbnBheW1lbnQsXG5pc3N1ZXIsXG57c2hhcmVzLHRvdGFsU2hhcmVzfSk9Plxue1xuLyogRGl2aWRlIHRoZSBwYXltZW50IGludG8gc2hhcmVzLiovXG5pZighc2hhcmVzLmxlbmd0aCl7XG5yZXR1cm47XG4gfVxuXG4vKiogQHR5cGUge0Ftb3VudDwnbmF0Jz59ICovXG5jb25zdCBwYXltZW50QW1vdW50PWF3YWl0IEUoaXNzdWVyKS5nZXRBbW91bnRPZihwYXltZW50KTtcbmlmKEFtb3VudE1hdGguaXNFbXB0eShwYXltZW50QW1vdW50KSl7XG5yZXR1cm47XG4gfVxuY29uc3R7dmFsdWU6dG90YWxWYWx1ZSxicmFuZH09cGF5bWVudEFtb3VudDtcblxubGV0IHJlbWFpbmRlcj10b3RhbFZhbHVlO1xuY29uc3QgZGVzdGluZWRBbW91bnRFbnRyaWVzPXNoYXJlcy5cbm1hcCgoe3NoYXJlLGRlc3RpbmF0aW9ufSxpKT0+e1xuY29uc3QgdmFsdWU9XG5pPT09c2hhcmVzLmxlbmd0aC0xP1xucmVtYWluZGVyOlxudG90YWxWYWx1ZSpzaGFyZS90b3RhbFNoYXJlcztcbnJlbWFpbmRlci09dmFsdWU7XG5yZXR1cm4gKC8qKiBAdHlwZSB7Y29uc3R9ICovW1xuZGVzdGluYXRpb24sXG5BbW91bnRNYXRoLm1ha2UoYnJhbmQsdmFsdWUpXSk7XG5cbiB9KS5cbmZpbHRlcigoW18sYW10XSk9PiFBbW91bnRNYXRoLmlzRW1wdHkoYW10KSk7XG5cbi8qKlxuICogSWYgdGhlIGBzaGFyZWRQYXltZW50W2ldYCBwYXltZW50cyB0aGF0IGFyZSBzZW50IHRvIHRoZSBmZWVcbiAqIGBkZXN0aW5hdGlvbmAgd2l0aCBgcHVzaFBheW1lbnRgIG5ldmVyIGFycml2ZSwgb3IgbmV2ZXIgZ2V0IGRlcG9zaXRlZFxuICogKG9yIG90aGVyd2lzZSB1c2VkIHVwKSwgdGhlbiB0aGV5IHJlbWFpbiBpbiB0aGUgcmVjb3Zlcnkgc2V0IG9mIHRoZVxuICogYHJlY292ZXJ5UHVyc2VgLiBUaGUgcHVycG9zZSBvZiB0aGlzLCBhbmQgb2YgcmVjb3Zlcnkgc2V0cyBpbiBnZW5lcmFsLFxuICogaXMgdG8gYmUgYWJsZSwgaW4gZW1lcmdlbmNpZXMsIHRvIHJlY292ZXIgdGhlIGFzc2V0cyBvZiBwYXltZW50cyBpbiBmbGlnaHRcbiAqIHRoYXQgc2VlbSB0byBiZSBzdHVjay4gVGhpcyBpcyBtdWNoIGxpa2UgY2FuY2VsbGluZyBhIGNoZWNrIHRoYXQgbWF5IHN0aWxsXG4gKiBiZSB1bmRlcG9zaXRlZC5cbiAqXG4gKiBUT0RPOiBIb3dldmVyLCBmb3IgdGhpcyB0byBiZSBwb3NzaWJsZSwgdGhlIGByZWNvdmVyeVB1cnNlYCBob2xkaW5nIHRoYXRcbiAqIHJlY292ZXJ5IHNldCBtdXN0IHJlbWFpbiBhY2Nlc3NpYmxlIHRvIHNvbWVvbmUgdGhhdCBzaG91bGQgbGVnaXRpbWF0ZWx5XG4gKiBiZSBhYmxlIHRvIHJlY292ZXIgdGhvc2UgcGF5bWVudHMuIEJ1dCB0aGlzIGByZWNvdmVyeVB1cnNlYCBpcyBjdXJyZW50bHlcbiAqIGRyb3BwZWQgb24gdGhlIGZsb29yIGluc3RlYWQuXG4gKi9cbmNvbnN0IHJlY292ZXJ5UHVyc2U9RShpc3N1ZXIpLm1ha2VFbXB0eVB1cnNlKCk7XG5cbi8qIFNwbGl0IHRoZSBwYXltZW50LCB3aGljaCBhc3NlcnRzIGNvbnNlcnZhdGlvbiBvZiB0aGUgdG90YWwuKi9cbmNvbnN0IHNoYXJlZFBheW1lbnQ9YXdhaXQgc3BsaXRNYW55KFxucmVjb3ZlcnlQdXJzZSxcbnBheW1lbnQsXG5kZXN0aW5lZEFtb3VudEVudHJpZXMubWFwKChbX2RzdCxhbXRdKT0+YW10KSk7XG5cblxuLyogU2VuZCBlYWNoIG5vbmVtcHR5IHBheW1lbnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGVzdGluYXRpb24uKi9cbmF3YWl0IFByb21pc2UuYWxsKFxuZGVzdGluZWRBbW91bnRFbnRyaWVzLm1hcCgoW2Rlc3RpbmF0aW9uXSxpKT0+XG5FKGRlc3RpbmF0aW9uKS5wdXNoUGF5bWVudChzaGFyZWRQYXltZW50W2ldLGlzc3VlcikpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0VSZWY8SXNzdWVyPCduYXQnPj59IGZlZUlzc3VlclxuICogQHBhcmFtIHt7IGtleXdvcmRTaGFyZXM6IFJlY29yZDxLZXl3b3JkLCBOYXRWYWx1ZT4sIHRpbWVyU2VydmljZTogRVJlZjxUaW1lclNlcnZpY2U+LCBjb2xsZWN0aW9uSW50ZXJ2YWw6IFJlbGF0aXZlVGltZX19IHRlcm1zXG4gKi8kaOKAjV9vbmNlLnNoYXJlUGF5bWVudChzaGFyZVBheW1lbnQpO1xuY29uc3QgICAgICAgIG1ha2VGZWVEaXN0cmlidXRvcj0oZmVlSXNzdWVyLHRlcm1zKT0+e1xuY29uc3R7dGltZXJTZXJ2aWNlLGNvbGxlY3Rpb25JbnRlcnZhbH09dGVybXM7XG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgRVJlZjxGZWVEZXN0aW5hdGlvbj4+fSAqL1xubGV0IGRlc3RpbmF0aW9ucz17fTtcbmxldHtrZXl3b3JkU2hhcmVzfT10ZXJtcztcbmxldCBzaGFyZUNvbmZpZz1tYWtlU2hhcmVDb25maWcoZGVzdGluYXRpb25zLGtleXdvcmRTaGFyZXMpO1xuXG4vKiogQHR5cGUge1NldFN0b3JlPEZlZUNvbGxlY3Rvcj59ICovXG5jb25zdCBjb2xsZWN0b3JzPW1ha2VTY2FsYXJTZXRTdG9yZSgpO1xuXG4vKiogQHBhcmFtIHtQYXltZW50PCduYXQnPn0gcGF5bWVudCAqL1xuY29uc3QgZGlzdHJpYnV0ZUZlZXM9KHBheW1lbnQpPT5cbnNoYXJlUGF5bWVudChwYXltZW50LGZlZUlzc3VlcixzaGFyZUNvbmZpZyk7XG5cbmNvbnN0IHNjaGVkdWxlUGF5bWVudHM9YXN5bmMoKT0+e1xuaWYoc2hhcmVDb25maWcudG90YWxTaGFyZXM8PTBuKXtcbnJldHVybjtcbiB9XG5hd2FpdCBQcm9taXNlLmFsbChcblsuLi5jb2xsZWN0b3JzLnZhbHVlcygpXS5tYXAoKGNvbGxlY3Rvcik9PlxuRShjb2xsZWN0b3IpLmNvbGxlY3RGZWVzKCkudGhlbihkaXN0cmlidXRlRmVlcykpKTtcblxuXG4gfTtcblxuY29uc3QgcHVibGljRmFjZXQ9RmFyKCdmZWVEaXN0cmlidXRvciBwdWJsaWNGYWNldCcse1xuZGlzdHJpYnV0ZUZlZXMsXG5nZXRLZXl3b3JkU2hhcmVzOigpPT5rZXl3b3JkU2hhcmVzfSk7XG5cblxuY29uc3QgY3JlYXRvckZhY2V0PUZhcignZmVlRGlzdHJpYnV0b3IgY3JlYXRvckZhY2V0Jyx7XG5tYWtlQ29udHJhY3RGZWVDb2xsZWN0b3IsXG4vKipcbiAqIFN0YXJ0IGRpc3RyaWJ1dGluZyBmZWVzIGZyb20gdGhpcyBjb2xsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlYnVnTmFtZVxuICogQHBhcmFtIHtFUmVmPEZlZUNvbGxlY3Rvcj59IGNvbGxlY3RvclBcbiAqL1xuc3RhcnRQZXJpb2RpY0NvbGxlY3Rpb246YXN5bmMoZGVidWdOYW1lLGNvbGxlY3RvclApPT57XG5jb25zdCBjb2xsZWN0b3I9YXdhaXQgY29sbGVjdG9yUDtcblxuLyoqIEB0eXBlIHtQZXJpb2RpY0ZlZUNvbGxlY3Rvcn0gKi9cbmNvbnN0IHBlcmlvZGljQ29sbGVjdG9yPUZhcignUGVyaW9kaWNGZWVDb2xsZWN0b3InLHtcbmdldERlYnVnTmFtZTooKT0+ZGVidWdOYW1lLFxuZ2V0Q29sbGVjdG9yOigpPT5jb2xsZWN0b3IsXG5jb2xsZWN0QW5kRGlzdHJpYnV0ZU5vdzphc3luYygpPT57XG5pZihzaGFyZUNvbmZpZy50b3RhbFNoYXJlczw9MG4pe1xucmV0dXJuO1xuIH1cbmNvbnN0IHBheW1lbnQ9YXdhaXQgRShjb2xsZWN0b3IpLmNvbGxlY3RGZWVzKCk7XG5hd2FpdCBkaXN0cmlidXRlRmVlcyhwYXltZW50KTtcbiB9LFxuc3RvcDooKT0+e1xuY29sbGVjdG9ycy5kZWxldGUoY29sbGVjdG9yKTtcbiB9fSk7XG5cblxuLyogUnVuIG9uY2UgaW1tZWRpYXRlbHkgZm9yIHRoaXMgY29sbGVjdG9yLCB0byB0ZXN0IHRoYXQgdGhlIHJlZ2lzdHJhdGlvbiovXG4vKiB3aWxsIHdvcmsuKi9cbmF3YWl0IEUocGVyaW9kaWNDb2xsZWN0b3IpLmNvbGxlY3RBbmREaXN0cmlidXRlTm93KCk7XG5cbmNvbGxlY3RvcnMuYWRkKGNvbGxlY3Rvcik7XG5yZXR1cm4gcGVyaW9kaWNDb2xsZWN0b3I7XG4gfSxcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVPbmx5PERlcG9zaXRGYWNldD59IGRlcG9zaXRGYWNldFxuICovXG5tYWtlRGVwb3NpdEZhY2V0RGVzdGluYXRpb246KGRlcG9zaXRGYWNldCk9PntcbnJldHVybiBGYXIoIGBEZXBvc2l0RmFjZXREZXN0aW5hdGlvbmAse1xucHVzaFBheW1lbnQ6YXN5bmMocGF5bWVudCxfaXNzdWVyKT0+e1xucmV0dXJuIEUoZGVwb3NpdEZhY2V0KS5yZWNlaXZlKHBheW1lbnQpO1xuIH19KTtcblxuIH0sXG4vKipcbiAqIENyZWF0ZSBhIGRlc3RpbmF0aW9uIHRoYXQgZ2VuZXJhdGVzIGludml0YXRpb25zIGFuZCBtYWtlcyBab2Ugb2ZmZXJzLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5d29yZFxuICogQHBhcmFtIHt1bmtub3dufSB0YXJnZXRcbiAqIEBwYXJhbSB7UHJvcGVydHlLZXl9IG1ha2VJbnZpdGF0aW9uTWV0aG9kXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gW2FyZ3NdXG4gKi9cbm1ha2VPZmZlckRlc3RpbmF0aW9uOihcbnpvZSxcbmtleXdvcmQsXG50YXJnZXQsXG5tYWtlSW52aXRhdGlvbk1ldGhvZCxcbmFyZ3M9W10pPT5cbntcbnJldHVybiBGYXIoIGAke1N0cmluZyhtYWtlSW52aXRhdGlvbk1ldGhvZCl9IE9mZmVyRGVzdGluYXRpb25gLHtcbnB1c2hQYXltZW50OmFzeW5jKHBheW1lbnQsaXNzdWVyKT0+e1xuY29uc3QgcGF5bWVudEFtb3VudD1hd2FpdCBFKGlzc3VlcikuZ2V0QW1vdW50T2YocGF5bWVudCk7XG5cbi8qIEdpdmUgdGhlIHBheW1lbnQgdG8gdGhlIGNvbnRyYWN0IHZpYSBpdHMgaW52aXRhdGlvbi4qL1xuY29uc3QgaW52aXRhdGlvbj1FKHRhcmdldClbbWFrZUludml0YXRpb25NZXRob2RdKC4uLmFyZ3MpO1xuY29uc3QgcmVzdWx0PUUoem9lKS5vZmZlcihcbmludml0YXRpb24sXG57XG5naXZlOntcbltrZXl3b3JkXTpwYXltZW50QW1vdW50fX0sXG5cblxue1xuW2tleXdvcmRdOnBheW1lbnR9KTtcblxuXG5cbi8qIEFzc2VydCB0aGF0IHRoZSBvZmZlciBjb21wbGV0ZWQuKi9cbmF3YWl0IEUocmVzdWx0KS5nZXRPZmZlclJlc3VsdCgpO1xuXG4vKiBXZSBkZWxpYmVyYXRlbHkgZHJvcCBvdXIgcGF5b3V0cyBvbiB0aGUgZmxvb3IsIHNpbmNlIHRoZSBFUlRQIHB1cnNlKi9cbi8qIHJlY292ZXJ5IG1lY2hhbmlzbSBjYW4gZ2V0IHRoZW0gYmFjayB0byB0aGUgZGlzdHJpYnV0b3IgY29udHJhY3QuKi9cbnJldHVybiBwYXltZW50QW1vdW50O1xuIH19KTtcblxuIH0sXG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8S2V5d29yZCwgRVJlZjxGZWVEZXN0aW5hdGlvbj4+fSBuZXdEZXN0aW5hdGlvbnNcbiAqL1xuc2V0RGVzdGluYXRpb25zOmFzeW5jKG5ld0Rlc3RpbmF0aW9ucyk9PntcbmRlc3RpbmF0aW9ucz1uZXdEZXN0aW5hdGlvbnM7XG5zaGFyZUNvbmZpZz1tYWtlU2hhcmVDb25maWcoZGVzdGluYXRpb25zLGtleXdvcmRTaGFyZXMpO1xuLyogUnVuIG9uY2UgaW1tZWRpYXRlbHkgZm9yIHRoZXNlIGRlc3RpbmF0aW9ucy4qL1xuYXdhaXQgc2NoZWR1bGVQYXltZW50cygpO1xuIH0sXG5cbi8qKiBAcGFyYW0ge1JlY29yZDxLZXl3b3JkLCBiaWdpbnQ+fSBuZXdTaGFyZXMgKi9cbnNldEtleXdvcmRTaGFyZXM6KG5ld1NoYXJlcyk9Pntcbm11c3RNYXRjaChuZXdTaGFyZXMsS2V5d29yZFNoYXJlc1NoYXBlKTtcbmtleXdvcmRTaGFyZXM9bmV3U2hhcmVzO1xuIH19KTtcblxuXG4vKiBTdGFydCBwcm9jZXNzaW5nIGNvbGxlY3Rpb25zLiovXG5zdGFydERpc3RyaWJ1dGluZyhzY2hlZHVsZVBheW1lbnRzLHRpbWVyU2VydmljZSxjb2xsZWN0aW9uSW50ZXJ2YWwpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmNyZWF0b3JGYWNldCxcbnB1YmxpY0ZhY2V0fSk7XG5cbiB9O1xuXG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VGZWVEaXN0cmlidXRvcj5bJ2NyZWF0b3JGYWNldCddfSBGZWVEaXN0cmlidXRvckNyZWF0b3JGYWNldCAqL1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlRmVlRGlzdHJpYnV0b3I+WydwdWJsaWNGYWNldCddfSBGZWVEaXN0cmlidXRvclB1YmxpY0ZhY2V0ICovXG5cbi8qKlxuICogQHBhcmFtIHtaQ0Y8UGFyYW1ldGVyczx0eXBlb2YgbWFrZUZlZURpc3RyaWJ1dG9yPlsxXT59IHpjZlxuICovJGjigI1fb25jZS5tYWtlRmVlRGlzdHJpYnV0b3IobWFrZUZlZURpc3RyaWJ1dG9yKTtcbmNvbnN0ICAgICAgICBzdGFydD1hc3luYyh6Y2YpPT57XG5jb25zdCBmZWVJc3N1ZXI9RSh6Y2YuZ2V0Wm9lU2VydmljZSgpKS5nZXRGZWVJc3N1ZXIoKTtcbnJldHVybiBtYWtlRmVlRGlzdHJpYnV0b3IoZmVlSXNzdWVyLHpjZi5nZXRUZXJtcygpKTtcbiB9OyRo4oCNX29uY2Uuc3RhcnQoc3RhcnQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImN1c3RvbVRlcm1zU2hhcGUiOlsiY3VzdG9tVGVybXNTaGFwZSJdLCJtYWtlQ29udHJhY3RGZWVDb2xsZWN0b3IiOlsibWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yIl0sInN0YXJ0RGlzdHJpYnV0aW5nIjpbInN0YXJ0RGlzdHJpYnV0aW5nIl0sIm1ha2VTaGFyZUNvbmZpZyI6WyJtYWtlU2hhcmVDb25maWciXSwic2hhcmVQYXltZW50IjpbInNoYXJlUGF5bWVudCJdLCJtYWtlRmVlRGlzdHJpYnV0b3IiOlsibWFrZUZlZURpc3RyaWJ1dG9yIl0sInN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG3bYQpeKAAAXigAACcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2FsbGJhY2suanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImNhbGxFIiwiY2FsbFN5bmMiLCJpc0NhbGxiYWNrIiwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siLCJtYWtlTWV0aG9kQ2FsbGJhY2siLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siLCJtYWtlU3luY01ldGhvZENhbGxiYWNrIiwicHJlcGFyZUF0dGVudWF0b3IiLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxpc09iamVjdCxpc1Bhc3NhYmxlU3ltYm9sOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImlzUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGlzUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdHtmcm9tRW50cmllc309T2JqZWN0O1xuXG5jb25zdHtvd25LZXlzOnJhd093bktleXN9PVJlZmxlY3Q7XG5jb25zdCBvd25LZXlzPVxuLyoqIEB0eXBlIHs8VCBleHRlbmRzIFByb3BlcnR5S2V5PihvYmo6IHtbSyBpbiBUXT86IHVua25vd259KSA9PiBUW119ICovXG5yYXdPd25LZXlzO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogUGFyYW1ldGVyczxSZXR1cm5UeXBlPHByZXBhcmVBdHRlbnVhdG9yPj4pID0+IEZhcmFibGU8VD59IE1ha2VBdHRlbnVhdG9yXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYmFjazxJPn0gQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlN5bmNDYWxsYmFjazxJPn0gU3luY0NhbGxiYWNrXG4gKi9cblxuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+ICYgVH0gRmFyYWJsZSAqL1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0ga2V5XG4gKiBAcmV0dXJucyB7a2V5IGlzIFByb3BlcnR5S2V5fSBGSVhNRTogc2hvdWxkIGJlIGp1c3QgYFByb3BlcnR5S2V5YCBidXQgVFNcbiAqIGNvbXBsYWlucyBpdCBjYW4ndCBiZSB1c2VkIGFzIGFuIGluZGV4IHR5cGUuXG4gKi9cbmNvbnN0IGlzUHJvcGVydHlLZXk9KGtleSk9PntcbnN3aXRjaCh0eXBlb2Yga2V5KXtcbmNhc2Unc3RyaW5nJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2Unc3ltYm9sJzpcbnJldHVybiB0cnVlO1xuZGVmYXVsdDpcbnJldHVybiBmYWxzZTt9XG5cbiB9O1xuXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgY2FsbCBhIGNhbGxiYWNrLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAcGFyYW0ge1N5bmNDYWxsYmFjazxJPn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICogQHJldHVybnMge1JldHVyblR5cGU8ST59XG4gKi9cbmNvbnN0ICAgICAgICBjYWxsU3luYz0oY2FsbGJhY2ssLi4uYXJncyk9PntcbmNvbnN0e3RhcmdldCxtZXRob2ROYW1lLGJvdW5kfT1jYWxsYmFjaztcbmlmKG1ldGhvZE5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIHRhcmdldCguLi5ib3VuZCwuLi5hcmdzKTtcbiB9XG5yZXR1cm4gdGFyZ2V0W21ldGhvZE5hbWVdKC4uLmJvdW5kLC4uLmFyZ3MpO1xuIH07JGjigI1fb25jZS5jYWxsU3luYyhjYWxsU3luYyk7XG5oYXJkZW4oY2FsbFN5bmMpO1xuXG4vKipcbiAqIEV2ZW50dWFsIHNlbmQgdG8gYSBjYWxsYmFjay5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHBhcmFtIHtDYWxsYmFjazxJPn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPEk+Pj59XG4gKi9cbmNvbnN0ICAgICAgICBjYWxsRT0oY2FsbGJhY2ssLi4uYXJncyk9PntcbmNvbnN0e3RhcmdldCxtZXRob2ROYW1lLGJvdW5kfT1jYWxsYmFjaztcbmlmKG1ldGhvZE5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIEUodGFyZ2V0KSguLi5ib3VuZCwuLi5hcmdzKTtcbiB9XG5yZXR1cm4gRSh0YXJnZXQpW21ldGhvZE5hbWVdKC4uLmJvdW5kLC4uLmFyZ3MpO1xuIH07JGjigI1fb25jZS5jYWxsRShjYWxsRSk7XG5oYXJkZW4oY2FsbEUpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBuZWFyIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST59IFtUPUldXG4gKiBAdGVtcGxhdGUge3Vua25vd25bXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge1N5bmNDYWxsYmFjazxJPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjaz0odGFyZ2V0LC4uLmJvdW5kKT0+e1xudHlwZW9mIHRhcmdldD09PSdmdW5jdGlvbid8fFxuRmFpbCBgc3luYyBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uOiAke3RhcmdldH1gO1xuLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuY29uc3QgY2I9aGFyZGVuKHt0YXJnZXQsYm91bmQsaXNTeW5jOnRydWV9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtTeW5jQ2FsbGJhY2s8ST59ICovY2IpO1xuIH07JGjigI1fb25jZS5tYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2sobWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBwb3RlbnRpYWxseSBmYXIgZnVuY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxcbiAqICAgKC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPlxuICogPn0gW1Q9WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxJPl1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bltdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7Q2FsbGJhY2s8ST59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRnVuY3Rpb25DYWxsYmFjaz0odGFyZ2V0LC4uLmJvdW5kKT0+e1xuaXNPYmplY3QodGFyZ2V0KXx8XG5GYWlsIGBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uIHByZXNlbmNlOiAke3RhcmdldH1gO1xuLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuY29uc3QgY2I9aGFyZGVuKHt0YXJnZXQsYm91bmR9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtDYWxsYmFjazxJPn0gKi9jYik7XG4gfTskaOKAjV9vbmNlLm1ha2VGdW5jdGlvbkNhbGxiYWNrKG1ha2VGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgZnJvbSBhIG5lYXIgbWV0aG9kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBQXG4gKiBAdGVtcGxhdGUge3tcbiAqICAgW3ggaW4gUF06ICguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST5cbiAqIH19IFtUPXsgW3ggaW4gUF06IEkgfV1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bltdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1B9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtTeW5jQ2FsbGJhY2s8ST59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3luY01ldGhvZENhbGxiYWNrPSh0YXJnZXQsbWV0aG9kTmFtZSwuLi5ib3VuZCk9PntcbmlzT2JqZWN0KHRhcmdldCl8fFxuRmFpbCBgc3luYyBtZXRob2QgY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0OiAke3RhcmdldH1gO1xudHlwZW9mIG1ldGhvZE5hbWU9PT0nc3RyaW5nJ3x8XG5pc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpfHxcbkZhaWwgYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IGNiPWhhcmRlbih7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmQsaXNTeW5jOnRydWV9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtTeW5jQ2FsbGJhY2s8ST59ICovY2IpO1xuIH07JGjigI1fb25jZS5tYWtlU3luY01ldGhvZENhbGxiYWNrKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBwb3RlbnRpYWxseSBmYXIgbWV0aG9kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBQXG4gKiBAdGVtcGxhdGUge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8e1xuICogICBbeCBpbiBQXTogKC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPlxuICogfT59IFtUPVhpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8eyBbeCBpbiBQXTogSSB9Pl1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bltdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1B9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtDYWxsYmFjazxJPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNZXRob2RDYWxsYmFjaz0odGFyZ2V0LG1ldGhvZE5hbWUsLi4uYm91bmQpPT57XG5pc09iamVjdCh0YXJnZXQpfHxGYWlsIGBtZXRob2QgY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0OiAke3RhcmdldH1gO1xudHlwZW9mIG1ldGhvZE5hbWU9PT0nc3RyaW5nJ3x8XG5pc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpfHxcbkZhaWwgYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IGNiPWhhcmRlbih7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtDYWxsYmFjazxJPn0gKi9jYik7XG4gfTskaOKAjV9vbmNlLm1ha2VNZXRob2RDYWxsYmFjayhtYWtlTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VNZXRob2RDYWxsYmFjayk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Y2FsbGJhY2sgaXMgQ2FsbGJhY2s8YW55Pn1cbiAqL1xuY29uc3QgICAgICAgIGlzQ2FsbGJhY2s9KGNhbGxiYWNrKT0+e1xuaWYoIWlzT2JqZWN0KGNhbGxiYWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9PWNhbGxiYWNrO1xucmV0dXJuKFxuaXNPYmplY3QodGFyZ2V0KSYmKFxubWV0aG9kTmFtZT09PXVuZGVmaW5lZHx8XG50eXBlb2YgbWV0aG9kTmFtZT09PSdzdHJpbmcnfHxcbmlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkpJiZcbkFycmF5LmlzQXJyYXkoYm91bmQpKTtcblxuIH07JGjigI1fb25jZS5pc0NhbGxiYWNrKGlzQ2FsbGJhY2spO1xuaGFyZGVuKGlzQ2FsbGJhY2spO1xuXG4vKipcbiAqIFByZXBhcmUgYW4gYXR0ZW51YXRvciBjbGFzcyB3aG9zZSBtZXRob2RzIGNhbiBiZSByZWRpcmVjdGVkIHZpYSBjYWxsYmFja3MuXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gTVxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3pvbmUnKS5ab25lfSB6b25lIFRoZSB6b25lIGluIHdoaWNoIHRvIGFsbG9jYXRlIGF0dGVudWF0b3JzLlxuICogQHBhcmFtIHtNW119IG1ldGhvZE5hbWVzIE1ldGhvZHMgdG8gZm9yd2FyZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBbb3B0cy5pbnRlcmZhY2VHdWFyZF0gQW4gaW50ZXJmYWNlIGd1YXJkIGZvciB0aGVcbiAqIG5ldyBhdHRlbnVhdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLnRhZ10gQSB0YWcgZm9yIHRoZSBuZXcgYXR0ZW51YXRvciBleG9DbGFzcy5cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVBdHRlbnVhdG9yPShcbnpvbmUsXG5tZXRob2ROYW1lcyxcbntpbnRlcmZhY2VHdWFyZCx0YWc9J0F0dGVudWF0b3InfT17fSk9Plxue1xuLyoqXG4gKiBAdHlwZWRlZiB7KHRoaXM6IGFueSwgLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IE1ldGhvZFxuICogQHR5cGVkZWYge3sgW0sgaW4gTV0/OiBDYWxsYmFjazxhbnk+IHwgbnVsbH19IE92ZXJyaWRlc1xuICogQHR5cGVkZWYge3sgW0sgaW4gTV06ICh0aGlzOiBhbnksIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55IH19IE1ldGhvZHNcbiAqL1xuY29uc3QgbWV0aG9kcz0vKiogQHR5cGUge01ldGhvZHN9ICovXG5mcm9tRW50cmllcyhcbm1ldGhvZE5hbWVzLm1hcCgoa2V5KT0+e1xuLyogT25seSBhbGxvdyB0aGUgYFByb3BlcnR5S2V5YCB0eXBlIGZvciB0aGUgdGFyZ2V0IG1ldGhvZCBrZXkuKi9cbmlmKCFpc1Byb3BlcnR5S2V5KGtleSkpe1xudGhyb3cgRmFpbCBga2V5ICR7cShrZXkpfSBpcyBub3QgYSBQcm9wZXJ0eUtleWA7XG4gfVxuXG5jb25zdCBtPS8qKiBAdHlwZSB7TWV0aG9kc30gKi97XG4vKiBFeHBsaWNpdGx5IHVzZSBjb25jaXNlIG1ldGhvZCBzeW50YXggdG8gcHJlc2VydmUgYHRoaXNgIGJ1dCBwcmV2ZW50Ki9cbi8qIGNvbnN0cnVjdG9yIGJlaGF2aW9yLiovXG4vKiogQHR5cGUge01ldGhvZH0gKi9cbltrZXldKC4uLmFyZ3Mpe1xuLyogU3VwcG9ydCBib3RoIHN5bmNocm9ub3VzIGFuZCBhc3luYyBjYWxsYmFja3MuKi9cbmNvbnN0IGNiPXRoaXMuc3RhdGUuY2JzW2tleV07XG5pZighY2Ipe1xuY29uc3QgZXJyPWFzc2VydC5lcnJvcihcbiBgdW5pbXBsZW1lbnRlZCAke3EodGFnKX0gbWV0aG9kICR7cShrZXkpfWApO1xuXG5pZih0aGlzLnN0YXRlLmlzU3luYyl7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gfVxuaWYoY2IuaXNTeW5jKXtcbnJldHVybiBjYWxsU3luYyhjYiwuLi5hcmdzKTtcbiB9XG5yZXR1cm4gY2FsbEUoY2IsLi4uYXJncyk7XG4gfX1bXG5rZXldO1xucmV0dXJuICgvKiogQHR5cGUge2NvbnN0fSAqL1trZXksbV0pO1xuIH0pKTtcblxuXG5cbi8qKlxuICogQ3JlYXRlIGFuIGV4byBvYmplY3Qgd2hvc2UgYmVoYXZpb3IgaXMgY29tcG9zZWQgZnJvbSBhIGRlZmF1bHQgdGFyZ2V0XG4gKiBhbmQvb3IgaW5kaXZpZHVhbCBtZXRob2Qgb3ZlcnJpZGUgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge3Vua25vd259IFtvcHRzLnRhcmdldF0gVGhlIHRhcmdldCBmb3IgYW55IG1ldGhvZHMgdGhhdFxuICogd2VyZW4ndCBzcGVjaWZpZWQgaW4gYG9wdHMub3ZlcnJpZGVzYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaXNTeW5jPWZhbHNlXSBXaGV0aGVyIHRoZSB0YXJnZXQgc2hvdWxkIGJlIHRyZWF0ZWRcbiAqIGFzIHN5bmNocm9ub3VzbHkgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtPdmVycmlkZXN9IFtvcHRzLm92ZXJyaWRlc10gU2V0IGluZGl2aWR1YWxcbiAqIGNhbGxiYWNrcyBmb3IgbWV0aG9kcyAod2hvc2UgbmFtZXMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZVxuICogYHByZXBhcmVBdHRlbnVhdG9yYCBvciBgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yYCBjYWxsKS4gIE51bGxpc2ggb3ZlcnJpZGVzXG4gKiBtZWFuIHRvIHRocm93LlxuICovXG5jb25zdCBtYWtlQXR0ZW51YXRvcj16b25lLmV4b0NsYXNzKFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge2FueX0gW29wdHMudGFyZ2V0XVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pc1N5bmM9ZmFsc2VdXG4gKiBAcGFyYW0ge092ZXJyaWRlc30gW29wdHMub3ZlcnJpZGVzXVxuICovXG4oe1xudGFyZ2V0PW51bGwsXG5pc1N5bmM9ZmFsc2UsXG5vdmVycmlkZXM9LyoqIEB0eXBlIHtPdmVycmlkZXN9ICove319KT0+XG57XG5jb25zdCBjYnM9LyoqIEB0eXBlIHtPdmVycmlkZXN9ICove307XG5cbmNvbnN0IHJlbWFpbmluZz1uZXcgU2V0KG1ldGhvZE5hbWVzKTtcbmZvcihjb25zdCBrZXkgb2Ygb3duS2V5cyhvdmVycmlkZXMpKXtcbnJlbWFpbmluZy5oYXMoa2V5KXx8XG5GYWlsIGAke3EodGFnKX0gb3ZlcnJpZGVzWyR7cShrZXkpfV0gbm90IGFsbG93ZWQgYnkgbWV0aG9kTmFtZXNgO1xuXG5yZW1haW5pbmcuZGVsZXRlKGtleSk7XG5jb25zdCBjYj1vdmVycmlkZXNba2V5XTtcbmNiPT1udWxsfHxcbmlzQ2FsbGJhY2soY2IpfHxcbkZhaWwgYCR7cSh0YWcpfSBvdmVycmlkZXNbJHtxKGtleSl9XSBpcyBub3QgYSBjYWxsYmFjazsgZ290ICR7Y2J9YDtcbmNic1trZXldPWNiO1xuIH1cbmZvcihjb25zdCBrZXkgb2YgcmVtYWluaW5nKXtcbmlmKGlzU3luYyl7XG5jYnNba2V5XT1tYWtlU3luY01ldGhvZENhbGxiYWNrKHRhcmdldCxrZXkpO1xuIH1lbHNle1xuY2JzW2tleV09bWFrZU1ldGhvZENhbGxiYWNrKHRhcmdldCxrZXkpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtjYnMsaXNTeW5jfSk7XG4gfSxcbi8qKiBAdHlwZSB7TWV0aG9kc30gKi9tZXRob2RzKTtcblxucmV0dXJuIG1ha2VBdHRlbnVhdG9yO1xuIH07JGjigI1fb25jZS5wcmVwYXJlQXR0ZW51YXRvcihwcmVwYXJlQXR0ZW51YXRvcik7XG5oYXJkZW4ocHJlcGFyZUF0dGVudWF0b3IpO1xuXG4vKipcbiAqIFByZXBhcmUgYW4gYXR0ZW51YXRvciB3aG9zZSBtZXRob2ROYW1lcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpbnRlcmZhY2VHdWFyZC5cbiAqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvem9uZScpLlpvbmV9IHpvbmVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdHNdXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMudGFnXVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yPSh6b25lLGludGVyZmFjZUd1YXJkLG9wdHM9e30pPT57XG5jb25zdHttZXRob2RHdWFyZHN9PWludGVyZmFjZUd1YXJkO1xuY29uc3QgbWV0aG9kTmFtZXM9b3duS2V5cyhtZXRob2RHdWFyZHMpO1xuY29uc3QgbWFrZUF0dGVudWF0b3I9cHJlcGFyZUF0dGVudWF0b3Ioem9uZSxtZXRob2ROYW1lcyx7XG4uLi5vcHRzLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxucmV0dXJuICgvKiogQHR5cGUge01ha2VBdHRlbnVhdG9yPGFueT59ICovbWFrZUF0dGVudWF0b3IpO1xuIH07JGjigI1fb25jZS5wcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IocHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbGxTeW5jIjpbImNhbGxTeW5jIl0sImNhbGxFIjpbImNhbGxFIl0sIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayI6WyJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siXSwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siOlsibWFrZUZ1bmN0aW9uQ2FsbGJhY2siXSwibWFrZVN5bmNNZXRob2RDYWxsYmFjayI6WyJtYWtlU3luY01ldGhvZENhbGxiYWNrIl0sIm1ha2VNZXRob2RDYWxsYmFjayI6WyJtYWtlTWV0aG9kQ2FsbGJhY2siXSwiaXNDYWxsYmFjayI6WyJpc0NhbGxiYWNrIl0sInByZXBhcmVBdHRlbnVhdG9yIjpbInByZXBhcmVBdHRlbnVhdG9yIl0sInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciI6WyJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqo/dRiIGAAAiBgAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiVkJhbmtBY2NvdW50IiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBAamVzc2llLWNoZWNrKi9cblxuLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNvbWUgb2YgdGhpcyBjb25maWcgaW5mbyBtYXkgbWFrZSBtb3JlIHNlbnNlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLiBIb3dldmVyXG4gKiBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwIGFuZCBvdXIgbGF4IHBhY2thZ2VcbiAqIGRlcGVuZGVuY3kgZ3JhcGgsIHNvbWV0aW1lcyByYXRpb25hbCBwbGFjZW1lbnRzIGNhdXNlIHR5cGUgcmVzb2x1dGlvbiBlcnJvcnMuXG4gKlxuICogU28gYXMgYSB3b3JrLWFyb3VuZCBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgYWNjZXNzIGZyb20gbW9yZSB0aGFuIG9uZSBwYWNrYWdlIGFyZSBwbGFjZWQgaGVyZS5cbiAqL1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZHMgdXNlZCBieSB0aGUgYnJpZGdlIGRldmljZS5cbiAqL1xuY29uc3QgICAgICAgIEJyaWRnZUlkPXtcbkJBTks6J2JhbmsnLFxuQ09SRTonY29yZScsXG5ESUJDOidkaWJjJyxcblNUT1JBR0U6J3N0b3JhZ2UnLFxuUFJPVklTSU9OOidwcm92aXNpb24nLFxuUFJPVklTSU9OX1NNQVJUX1dBTExFVDoncHJvdmlzaW9uV2FsbGV0JyxcbldBTExFVDond2FsbGV0J307JGjigI1fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5cbmhhcmRlbihCcmlkZ2VJZCk7XG5cbmNvbnN0ICAgICAgICBXYWxsZXROYW1lPXtcbmRlcG9zaXRGYWNldDonZGVwb3NpdEZhY2V0J307JGjigI1fb25jZS5XYWxsZXROYW1lKFdhbGxldE5hbWUpO1xuXG5oYXJkZW4oV2FsbGV0TmFtZSk7XG5cbi8qIGRlZmluZWQgaW4gZ29sYW5nL2Nvc21vcy94L3ZiYW5rKi9cbmNvbnN0ICAgICAgICBWQmFua0FjY291bnQ9e1xucmVzZXJ2ZTp7XG5tb2R1bGU6J3ZiYW5rL3Jlc2VydmUnLFxuYWRkcmVzczonYWdvcmljMWFlMGxtdHpsZ3JjbmxhOXhqa3BhYXJxNWQ1ZGZlejYzaDNudWNsJ30sXG5cbnByb3Zpc2lvbjp7XG5tb2R1bGU6J3ZiYW5rL3Byb3Zpc2lvbicsXG5hZGRyZXNzOidhZ29yaWMxbWVnenl0ZzY1Y3lyZ3pzNmZ2enhncmNxdnd3bDd1Z3B0NjIzNDYnfX07JGjigI1fb25jZS5WQmFua0FjY291bnQoVkJhbmtBY2NvdW50KTtcblxuXG5oYXJkZW4oVkJhbmtBY2NvdW50KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmlkZ2VJZCI6WyJCcmlkZ2VJZCJdLCJXYWxsZXROYW1lIjpbIldhbGxldE5hbWUiXSwiVkJhbmtBY2NvdW50IjpbIlZCYW5rQWNjb3VudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAXyTOAyAQAAMgEAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVHJhY2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbmxldCBkZWJ1Z0luc3RhbmNlPTE7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8ICd2ZXJib3NlJ30gZW5hYmxlXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlVHJhY2VyPShuYW1lLGVuYWJsZT10cnVlKT0+e1xuZGVidWdJbnN0YW5jZSs9MTtcbmxldCBkZWJ1Z0NvdW50PTE7XG5jb25zdCBrZXk9IGAtLS0tLSAke25hbWV9LiR7ZGVidWdJbnN0YW5jZX0gYDtcbi8qIHRoZSBjYXNlcyBiZWxvdyBkZWZpbmUgYSBuYW1lZCB2YXJpYWJsZSB0byBwcm92aWRlIGJldHRlciBkZWJ1ZyBpbmZvKi9cbnN3aXRjaChlbmFibGUpe1xuY2FzZSBmYWxzZTp7XG5jb25zdCBsb2dEaXNhYmxlZD0oLi4uX2FyZ3MpPT57IH07XG5yZXR1cm4gbG9nRGlzYWJsZWQ7XG4gfVxuY2FzZSd2ZXJib3NlJzp7XG5jb25zdCBpbmZvVGljaz0ob3B0TG9nLC4uLmFyZ3MpPT57XG5pZihvcHRMb2cubG9nKXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSwuLi5hcmdzKTtcbiB9ZWxzZXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSxvcHRMb2csLi4uYXJncyk7XG4gfVxuIH07XG5yZXR1cm4gaW5mb1RpY2s7XG4gfVxuZGVmYXVsdDp7XG5jb25zdCBkZWJ1Z1RpY2s9KG9wdExvZywuLi5hcmdzKT0+e1xuaWYob3B0TG9nLmxvZyl7XG5vcHRMb2cubG9nKGtleSxkZWJ1Z0NvdW50Kz0xLC4uLmFyZ3MpO1xuIH1lbHNle1xuY29uc29sZS5pbmZvKGtleSxkZWJ1Z0NvdW50Kz0xLG9wdExvZywuLi5hcmdzKTtcbiB9XG4gfTtcbnJldHVybiBkZWJ1Z1RpY2s7XG4gfX1cblxuIH07JGjigI1fb25jZS5tYWtlVHJhY2VyKG1ha2VUcmFjZXIpO1xuaGFyZGVuKG1ha2VUcmFjZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFjZXIiOlsibWFrZVRyYWNlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABuFZifQwIAAEMCAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi91dGlscy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi91dGlscy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vY29uZmlnLmpzXCIsIFtdXSxbXCIuL2RlYnVnLmpzXCIsIFtdXSxbXCIuL3V0aWxzLmpzXCIsIFtdXSxbXCIuL21ldGhvZC10b29scy5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABtyjjrCS4AAAkuAAAvAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanN7ImltcG9ydHMiOlsiLi9jYWxsYmFjay5qcyIsIkBhZ29yaWMvem9uZSIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbImFzc2VydENhcERhdGEiLCJhc3NlcnRQYXRoU2VnbWVudCIsImlzU3RyZWFtQ2VsbCIsIm1ha2VDaGFpblN0b3JhZ2VSb290IiwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSIsIm1ha2VTdG9yYWdlTm9kZUNoaWxkIiwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiLCJ1bm1hcnNoYWxGcm9tVnN0b3JhZ2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxNLGhlYXBab25lLGNiOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvbmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImhlYXBab25lXCIsIFskaOKAjV9hID0+IChoZWFwWm9uZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NhbGxiYWNrLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChjYiA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlQ2hhaW5TdG9yYWdlUm9vdCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZUNoYWluU3RvcmFnZVJvb3RcIn0pOyRo4oCNX29uY2UubWFrZUNoYWluU3RvcmFnZVJvb3QobWFrZUNoYWluU3RvcmFnZVJvb3QpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlU3RvcmFnZU5vZGVDaGlsZCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZVN0b3JhZ2VOb2RlQ2hpbGRcIn0pOyRo4oCNX29uY2UubWFrZVN0b3JhZ2VOb2RlQ2hpbGQobWFrZVN0b3JhZ2VOb2RlQ2hpbGQpOyAgIFxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykubWFrZU1hcnNoYWw+fSBNYXJzaGFsbGVyICovXG4vKiogQHR5cGVkZWYge1BpY2s8TWFyc2hhbGxlciwgJ2Zyb21DYXBEYXRhJz59IFVuc2VyaWFsaXplciAqL1xuXG4vKipcbiAqIERlZmluZWQgYnkgdnN0b3JhZ2VTdG9yZUtleSBpbiB2c3RvcmFnZS5nb1xuICpcbiAqIEB0eXBlZGVmIFZTdG9yYWdlS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVTdWJrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhUHJlZml4Qnl0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9EYXRhVmFsdWVdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEB0eXBlZGVmIFN0cmVhbUNlbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBibG9ja0hlaWdodCBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbmF0dXJhbCBudW1iZXJcbiAqIEBwcm9wZXJ0eSB7VFtdfSB2YWx1ZXNcbiAqL1xuXG4vKipcbiAqIFRoaXMgcmVwcmVzZW50cyBhIG5vZGUgaW4gYW4gSUFWTCB0cmVlLlxuICpcbiAqIFRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gaXMgeC92c3RvcmFnZSwgYW4gQWdvcmljIGV4dGVuc2lvbiBvZiB0aGUgQ29zbW9zIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuY29uc3QgQ2hhaW5TdG9yYWdlTm9kZUk9TS5pbnRlcmZhY2UoJ1N0b3JhZ2VOb2RlJyx7XG5zZXRWYWx1ZTpNLmNhbGxXaGVuKE0uc3RyaW5nKCkpLnJldHVybnMoKSxcbmdldFBhdGg6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldFN0b3JlS2V5Ok0uY2FsbFdoZW4oKS5yZXR1cm5zKE0ucmVjb3JkKCkpLFxubWFrZUNoaWxkTm9kZTpNLmNhbGwoTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnNwbGl0UmVjb3JkKHt9LHtzZXF1ZW5jZTpNLmJvb2xlYW4oKX0se30pKS5cbnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJykpfSk7XG5cblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGVyZmVjdCBoZXVyaXN0aWMgdG8gbmF2aWdhdGUgdGhlIG1pZ3JhdGlvbiBmcm9tIHZhbHVlIGNlbGxzIHRvXG4gKiBzdHJlYW0gY2VsbHMuXG4gKiBBdCB0aW1lIG9mIHdyaXRpbmcsIG5vIGxlZ2FjeSBjZWxscyBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIGEgc3RyZWFtIGNlbGwsXG4gKiBhbmQgd2UgZG8gbm90IGludGVuZCB0byBjcmVhdGUgYW55IG1vcmUgbGVnYWN5IHZhbHVlIGNlbGxzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBjZWxsXG4gKiBAcmV0dXJucyB7Y2VsbCBpcyBTdHJlYW1DZWxsfVxuICovXG5jb25zdCAgICAgICAgaXNTdHJlYW1DZWxsPShjZWxsKT0+XG5jZWxsJiZcbnR5cGVvZiBjZWxsPT09J29iamVjdCcmJlxuQXJyYXkuaXNBcnJheShjZWxsLnZhbHVlcykmJlxudHlwZW9mIGNlbGwuYmxvY2tIZWlnaHQ9PT0nc3RyaW5nJyYmXG4vXjAkfF5bMS05XVswLTldKiQvLnRlc3QoY2VsbC5ibG9ja0hlaWdodCk7JGjigI1fb25jZS5pc1N0cmVhbUNlbGwoaXNTdHJlYW1DZWxsKTtcbmhhcmRlbihpc1N0cmVhbUNlbGwpO1xuXG4vKiBUT0RPOiBDb25zb2xpZGF0ZSB3aXRoIGBpbnNpc3RDYXBEYXRhYCBmdW5jdGlvbnMgZnJvbSBzd2luZ3NldC1saXZlc2xvdHMsKi9cbi8qIHN3aW5nc2V0LXhzbmFwLXN1cGVydmlzb3IsIGV0Yy4qL1xuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGRhdGFcbiAqIEByZXR1cm5zIHthc3NlcnRzIGRhdGEgaXMgWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNhcERhdGE8c3RyaW5nPn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENhcERhdGE9KGRhdGEpPT57XG5hc3NlcnQudHlwZW9mKGRhdGEsJ29iamVjdCcpO1xuYXNzZXJ0KGRhdGEpO1xuYXNzZXJ0LnR5cGVvZihkYXRhLmJvZHksJ3N0cmluZycpO1xuYXNzZXJ0KEFycmF5LmlzQXJyYXkoZGF0YS5zbG90cykpO1xuLyogWFhYIGNoZWNrIHRoYXQgdGhlIC5zbG90cyBhcnJheSBlbGVtZW50cyBhcmUgYWN0dWFsbHkgc3RyaW5ncyovXG4gfTskaOKAjV9vbmNlLmFzc2VydENhcERhdGEoYXNzZXJ0Q2FwRGF0YSk7XG5oYXJkZW4oYXNzZXJ0Q2FwRGF0YSk7XG5cbi8qKlxuICogUmVhZCBhbmQgdW5tYXJzaGFsIGEgdmFsdWUgZnJvbSBhIG1hcCByZXByZXNlbnRhdGlvbiBvZiB2c3RvcmFnZSBkYXRhXG4gKlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSBkYXRhXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIFhpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5tYWtlTWFyc2hhbD5bJ2Zyb21DYXBEYXRhJ119IGZyb21DYXBEYXRhXG4gKiBAcGFyYW0ge251bWJlcn0gW2luZGV4PS0xXSBpbmRleCBvZiB0aGUgZGVzaXJlZCB2YWx1ZSBpbiBhIGRlc2VyaWFsaXplZCBzdHJlYW0gY2VsbFxuICovXG5jb25zdCAgICAgICAgdW5tYXJzaGFsRnJvbVZzdG9yYWdlPShkYXRhLGtleSxmcm9tQ2FwRGF0YSxpbmRleD0tMSk9PntcbmNvbnN0IHNlcmlhbGl6ZWQ9ZGF0YS5nZXQoa2V5KXx8RmFpbCBgbm8gZGF0YSBmb3IgJHtrZXl9YDtcbmFzc2VydC50eXBlb2Yoc2VyaWFsaXplZCwnc3RyaW5nJyk7XG5cbmNvbnN0IHN0cmVhbUNlbGw9SlNPTi5wYXJzZShzZXJpYWxpemVkKTtcbmlmKCFpc1N0cmVhbUNlbGwoc3RyZWFtQ2VsbCkpe1xudGhyb3cgRmFpbCBgbm90IGEgU3RyZWFtQ2VsbDogJHtzdHJlYW1DZWxsfWA7XG4gfVxuXG5jb25zdHt2YWx1ZXN9PXN0cmVhbUNlbGw7XG52YWx1ZXMubGVuZ3RoPjB8fEZhaWwgYG5vIFN0cmVhbUNlbGwgdmFsdWVzOiAke3N0cmVhbUNlbGx9YDtcblxuY29uc3QgbWFyc2hhbGxlZD12YWx1ZXMuYXQoaW5kZXgpO1xuYXNzZXJ0LnR5cGVvZihtYXJzaGFsbGVkLCdzdHJpbmcnKTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KFwiQGVuZG8vbWFyc2hhbFwiKS5DYXBEYXRhPHN0cmluZz59ICovXG5jb25zdCBjYXBEYXRhPWhhcmRlbihKU09OLnBhcnNlKG1hcnNoYWxsZWQpKTtcbmFzc2VydENhcERhdGEoY2FwRGF0YSk7XG5cbmNvbnN0IHVubWFyc2hhbGxlZD1mcm9tQ2FwRGF0YShjYXBEYXRhKTtcbnJldHVybiB1bm1hcnNoYWxsZWQ7XG4gfTskaOKAjV9vbmNlLnVubWFyc2hhbEZyb21Wc3RvcmFnZSh1bm1hcnNoYWxGcm9tVnN0b3JhZ2UpO1xuaGFyZGVuKHVubWFyc2hhbEZyb21Wc3RvcmFnZSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxzdHJpbmc+fSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkge1N0b3JhZ2VOb2RlWydnZXRTdG9yZUtleSddfSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGUgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKiBUT0RPOiBGb3JtYWxpemUgc2VnbWVudCBjb25zdHJhaW50cy4qL1xuLyogTXVzdCBiZSBub25lbXB0eSBhbmQgZGlzYWxsb3cgKHVuZXNjYXBlZCkgYC5gLCBhbmQgZm9yIHNpbXBsaWNpdHkqL1xuLyogKGFuZCBmdXR1cmUgcG9zc2liaWxpdHkgb2YgZS5nLiBlc2NhcGluZykgd2UgY3VycmVudGx5IGxpbWl0IHRvKi9cbi8qIEFTQ0lJIGFscGhhbnVtZXJpYyBwbHVzIHVuZGVyc2NvcmUgYW5kIGRhc2guKi9cbmNvbnN0IHBhdGhTZWdtZW50UGF0dGVybj0vXlthLXpBLVowLTlfLV17MSwxMDB9JC87XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZykgPT4gdm9pZH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQYXRoU2VnbWVudD0obmFtZSk9PntcbnBhdGhTZWdtZW50UGF0dGVybi50ZXN0KG5hbWUpfHxcbkZhaWwgYFBhdGggc2VnbWVudCBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgMSB0byAxMDAgY2hhcmFjdGVycyBsaW1pdGVkIHRvIEFTQ0lJIGFscGhhbnVtZXJpY3MsIHVuZGVyc2NvcmVzLCBhbmQvb3IgZGFzaGVzOiAke25hbWV9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGF0aFNlZ21lbnQoYXNzZXJ0UGF0aFNlZ21lbnQpO1xuaGFyZGVuKGFzc2VydFBhdGhTZWdtZW50KTtcblxuLyoqXG4gKiBNdXN0IG1hdGNoIHRoZSBzd2l0Y2ggaW4gdnN0b3JhZ2UuZ28gdXNpbmcgYHZzdG9yYWdlTWVzc2FnZWAgdHlwZVxuICpcbiAqIEB0eXBlZGVmIHsgJ2dldCcgfCAnZ2V0U3RvcmVLZXknIHwgJ2hhcycgfCAnY2hpbGRyZW4nIHwgJ2VudHJpZXMnIHwgJ3ZhbHVlcycgfCdzaXplJyB9IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kXG4gKiBAdHlwZWRlZiB7ICdzZXQnIHwgJ3NldFdpdGhvdXROb3RpZnknIHwgJ2FwcGVuZCcgfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2RcbiAqIEB0eXBlZGVmIHtTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZCB8IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZCB9IFN0b3JhZ2VNZXNzYWdlTWV0aG9kXG4gKiBAdHlwZWRlZiB7IFtwYXRoOiBzdHJpbmddIH0gU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VBcmdzXG4gKiBAdHlwZWRlZiB7IFtwYXRoOiBzdHJpbmcsIHZhbHVlPzogc3RyaW5nIHwgbnVsbF0gfSBTdG9yYWdlRW50cnlcbiAqIEB0eXBlZGVmIHsgU3RvcmFnZUVudHJ5W10gfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VBcmdzXG4gKiBAdHlwZWRlZiB7e1xuICogICBtZXRob2Q6IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kO1xuICogICBhcmdzOiBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZUFyZ3M7XG4gKiAgfSB8IHtcbiAqICAgbWV0aG9kOiBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2Q7XG4gKiAgIGFyZ3M6IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZUFyZ3M7XG4gKiB9fSBTdG9yYWdlTWVzc2FnZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3pvbmUnKS5ab25lfSB6b25lXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZT0oem9uZSk9Pntcbi8qKlxuICogQ3JlYXRlIGEgc3RvcmFnZSBub2RlIGZvciBhIGdpdmVuIGJhY2tpbmcgc3RvcmFnZSBpbnRlcmZhY2UgYW5kIHBhdGguXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2NhbGxiYWNrJykuQ2FsbGJhY2s8KG1lc3NhZ2U6IFN0b3JhZ2VNZXNzYWdlKSA9PiBhbnk+fSBtZXNzZW5nZXIgYSBjYWxsYmFja1xuICogZm9yIHNlbmRpbmcgYSBzdG9yYWdlTWVzc2FnZSBvYmplY3QgdG8gdGhlIHN0b3JhZ2UgaW1wbGVtZW50YXRpb25cbiAqIChjZi4gZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3ZzdG9yYWdlLmdvKVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VxdWVuY2VdIHNldCB2YWx1ZXMgd2l0aCBgYXBwZW5kYCBtZXNzYWdlcyByYXRoZXIgdGhhbiBgc2V0YCBtZXNzYWdlc1xuICogc28gdGhlIGJhY2tpbmcgaW1wbGVtZW50YXRpb24gZW1wbG95cyBhIHdyYXBwaW5nIHN0cnVjdHVyZSB0aGF0XG4gKiBwcmVzZXJ2ZXMgZWFjaCB2YWx1ZSBzZXQgd2l0aGluIGEgc2luZ2xlIGJsb2NrLlxuICogQ2hpbGQgbm9kZXMgZGVmYXVsdCB0byBpbmhlcml0aW5nIHRoaXMgb3B0aW9uIGZyb20gdGhlaXIgcGFyZW50LlxuICogQHJldHVybnMge1N0b3JhZ2VOb2RlfVxuICovXG5jb25zdCBtYWtlQ2hhaW5TdG9yYWdlTm9kZT16b25lLmV4b0NsYXNzKFxuJ0NoYWluU3RvcmFnZU5vZGUnLFxuQ2hhaW5TdG9yYWdlTm9kZUksXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9jYWxsYmFjaycpLkNhbGxiYWNrPChtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55Pn0gbWVzc2VuZ2VyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW5jZV1cbiAqL1xuKG1lc3NlbmdlcixwYXRoLHtzZXF1ZW5jZT1mYWxzZX09e30pPT57XG5hc3NlcnQudHlwZW9mKHBhdGgsJ3N0cmluZycpO1xuYXNzZXJ0LnR5cGVvZihzZXF1ZW5jZSwnYm9vbGVhbicpO1xucmV0dXJuIGhhcmRlbih7cGF0aCxtZXNzZW5nZXIsc2VxdWVuY2V9KTtcbiB9LFxue1xuZ2V0UGF0aCgpe1xucmV0dXJuIHRoaXMuc3RhdGUucGF0aDtcbiB9LFxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UGF0aFxuICogQHR5cGUgeygpID0+IFByb21pc2U8VlN0b3JhZ2VLZXk+fVxuICovXG4gICAgICBhc3luYyBnZXRTdG9yZUtleSgpe1xuY29uc3R7cGF0aCxtZXNzZW5nZXJ9PXRoaXMuc3RhdGU7XG5yZXR1cm4gY2IuY2FsbEUobWVzc2VuZ2VyLHtcbm1ldGhvZDonZ2V0U3RvcmVLZXknLFxuYXJnczpbcGF0aF19KTtcblxuIH0sXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIGNoaWxkTm9kZU9wdGlvbnM/OiB7c2VxdWVuY2U/OiBib29sZWFufSkgPT4gU3RvcmFnZU5vZGV9ICovXG5tYWtlQ2hpbGROb2RlKG5hbWUsY2hpbGROb2RlT3B0aW9ucz17fSl7XG5jb25zdHtzZXF1ZW5jZSxwYXRoLG1lc3Nlbmdlcn09dGhpcy5zdGF0ZTtcbmFzc2VydFBhdGhTZWdtZW50KG5hbWUpO1xuY29uc3QgbWVyZ2VkT3B0aW9ucz17c2VxdWVuY2UsLi4uY2hpbGROb2RlT3B0aW9uc307XG5yZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGUoXG5tZXNzZW5nZXIsXG4gYCR7cGF0aH0uJHtuYW1lfWAsXG5tZXJnZWRPcHRpb25zKTtcblxuIH0sXG4vKiogQHR5cGUgeyh2YWx1ZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSAqL1xuICAgICAgYXN5bmMgc2V0VmFsdWUodmFsdWUpe1xuY29uc3R7c2VxdWVuY2UscGF0aCxtZXNzZW5nZXJ9PXRoaXMuc3RhdGU7XG5hc3NlcnQudHlwZW9mKHZhbHVlLCdzdHJpbmcnKTtcbi8qKiBAdHlwZSB7U3RvcmFnZUVudHJ5fSAqL1xubGV0IGVudHJ5O1xuaWYoIXNlcXVlbmNlJiYhdmFsdWUpe1xuZW50cnk9W3BhdGhdO1xuIH1lbHNle1xuZW50cnk9W3BhdGgsdmFsdWVdO1xuIH1cbmF3YWl0IGNiLmNhbGxFKG1lc3Nlbmdlcix7XG5tZXRob2Q6c2VxdWVuY2U/J2FwcGVuZCc6J3NldCcsXG5hcmdzOltlbnRyeV19KTtcblxuIH1cbi8qIFBvc3NpYmxlIGV4dGVuc2lvbnM6Ki9cbi8qICogZ2V0VmFsdWUoKSovXG4vKiAqIGdldENoaWxkTmFtZXMoKSBhbmQvb3IgbWFrZUNoaWxkTm9kZXMoKSovXG4vKiAqIGdldE5hbWUoKSovXG4vKiAqIHJlY3Vyc2l2ZSBkZWxldGUqL1xuLyogKiBiYXRjaCBvcGVyYXRpb25zKi9cbi8qICogbG9jYWwgYnVmZmVyaW5nICh3aXRoIGVuZC1vZi1ibG9jayBjb21taXQpKi99KTtcblxuXG5yZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGU7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKTtcblxuY29uc3QgbWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlPXByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKGhlYXBab25lKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBoZWFwLWJhc2VkIHJvb3Qgc3RvcmFnZSBub2RlIGZvciBhIGdpdmVuIGJhY2tpbmcgZnVuY3Rpb24gYW5kIHJvb3QgcGF0aC5cbiAqXG4gKiBAcGFyYW0geyhtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55fSBoYW5kbGVTdG9yYWdlTWVzc2FnZSBhIGZ1bmN0aW9uIGZvclxuICogc2VuZGluZyBhIHN0b3JhZ2VNZXNzYWdlIG9iamVjdCB0byB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvblxuICogKGNmLiBnb2xhbmcvY29zbW9zL3gvdnN0b3JhZ2UvdnN0b3JhZ2UuZ28pXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9vdFBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcm9vdE9wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyb290T3B0aW9ucy5zZXF1ZW5jZV0gZW1wbG95IGEgd3JhcHBpbmcgc3RydWN0dXJlIHRoYXRcbiAqIHByZXNlcnZlcyBlYWNoIHZhbHVlIHNldCB3aXRoaW4gYSBzaW5nbGUgYmxvY2ssIGFuZCBkZWZhdWx0IGNoaWxkIG5vZGVzXG4gKiB0byBkbyB0aGUgc2FtZVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZUNoYWluU3RvcmFnZVJvb3QoXG5oYW5kbGVTdG9yYWdlTWVzc2FnZSxcbnJvb3RQYXRoLFxucm9vdE9wdGlvbnM9e30pXG57XG5jb25zdCBtZXNzZW5nZXI9Y2IubWFrZUZ1bmN0aW9uQ2FsbGJhY2soaGFuZGxlU3RvcmFnZU1lc3NhZ2UpO1xuXG4vKiBVc2UgdGhlIGhlYXBab25lIGRpcmVjdGx5LiovXG5jb25zdCByb290Tm9kZT1tYWtlSGVhcENoYWluU3RvcmFnZU5vZGUobWVzc2VuZ2VyLHJvb3RQYXRoLHJvb3RPcHRpb25zKTtcbnJldHVybiByb290Tm9kZTtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge1N0b3JhZ2VOb2RlfSBhbiBvYmplY3QgdGhhdCBjb25maXJtcyB0byBTdG9yYWdlTm9kZSBBUEkgYnV0IGRvZXMgbm90IHN0b3JlIGFueXdoZXJlLlxuICovXG5jb25zdCBtYWtlTnVsbFN0b3JhZ2VOb2RlPSgpPT57XG4vKiBYWFggcmUtdXNlIFwiQ2hhaW5TdG9yYWdlXCIgbWV0aG9kcyBhYm92ZSB3aGljaCBkb24ndCBhY3R1YWxseSBkZXBlbmQgb24gY2hhaW5zKi9cbnJldHVybiBtYWtlQ2hhaW5TdG9yYWdlUm9vdCgoKT0+bnVsbCwnbnVsbCcpO1xuIH07XG5cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHJldHVybmluZyBhIHN0b3JhZ2Ugbm9kZSBhdCBvciB1bmRlciBpdHMgaW5wdXQsXG4gKiBmYWxsaW5nIGJhY2sgdG8gYW4gaW5lcnQgb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QgaW50ZXJmYWNlIChidXQgaW5jb21wbGV0ZVxuICogYmVoYXZpb3IpIHdoZW4gdGhhdCBpcyB1bmF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8U3RvcmFnZU5vZGU/Pn0gc3RvcmFnZU5vZGVSZWZcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGlsZE5hbWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFN0b3JhZ2VOb2RlPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gICAgICAgIG1ha2VTdG9yYWdlTm9kZUNoaWxkKHN0b3JhZ2VOb2RlUmVmLGNoaWxkTmFtZSl7XG5jb25zdCBleGlzdGluZ1N0b3JhZ2VOb2RlPWF3YWl0IHN0b3JhZ2VOb2RlUmVmO1xuY29uc3Qgc3RvcmFnZU5vZGU9ZXhpc3RpbmdTdG9yYWdlTm9kZXx8bWFrZU51bGxTdG9yYWdlTm9kZSgpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoY2hpbGROYW1lKTtcbiB9XG5oYXJkZW4obWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG4vKiBUT0RPIGZpbmQgYSBiZXR0ZXIgbW9kdWxlIGZvciB0aGlzKi9cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMgeyh2YWx1ZTogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXJpYWxpemVUb1N0b3JhZ2U9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5yZXR1cm4gYXN5bmModmFsdWUpPT57XG5jb25zdCBtYXJzaGFsbGVkPWF3YWl0IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbHVlKTtcbmNvbnN0IHNlcmlhbGl6ZWQ9SlNPTi5zdHJpbmdpZnkobWFyc2hhbGxlZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShtYWtlU2VyaWFsaXplVG9TdG9yYWdlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1N0cmVhbUNlbGwiOlsiaXNTdHJlYW1DZWxsIl0sImFzc2VydENhcERhdGEiOlsiYXNzZXJ0Q2FwRGF0YSJdLCJ1bm1hcnNoYWxGcm9tVnN0b3JhZ2UiOlsidW5tYXJzaGFsRnJvbVZzdG9yYWdlIl0sImFzc2VydFBhdGhTZWdtZW50IjpbImFzc2VydFBhdGhTZWdtZW50Il0sInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIjpbInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sIm1ha2VDaGFpblN0b3JhZ2VSb290IjpbIm1ha2VDaGFpblN0b3JhZ2VSb290Il0sIm1ha2VTdG9yYWdlTm9kZUNoaWxkIjpbIm1ha2VTdG9yYWdlTm9kZUNoaWxkIl0sIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiOlsibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABp8sRAJw8AACcPAAArAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21ldGhvZC10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYmluZEFsbE1ldGhvZHMiLCJnZXRNZXRob2ROYW1lcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc09iamVjdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKipcbiAqIEBmaWxlIG1ldGhvZC10b29scyB1c2UgZHluYW1pYyBwcm9wZXJ0eSBsb29rdXAsIHdoaWNoIGlzIG5vdCBKZXNzaWUtY29tcGF0aWJsZVxuICovXG5cbmNvbnN0e2dldFByb3RvdHlwZU9mLGNyZWF0ZSxmcm9tRW50cmllcyxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcbmNvbnN0e293bktleXMsYXBwbHl9PVJlZmxlY3Q7XG5cbi8qKlxuICogUHJpb3JpdGl6ZSBzeW1ib2xzIGFzIGVhcmxpZXIgdGhhbiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYVxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkPShhLGIpPT57XG5pZih0eXBlb2YgYT09PXR5cGVvZiBiKXtcbmNvbnN0IGxlZnQ9U3RyaW5nKGEpO1xuY29uc3QgcmlnaHQ9U3RyaW5nKGIpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbnJldHVybiBsZWZ0PHJpZ2h0Py0xOmxlZnQ+cmlnaHQ/MTowO1xuIH1cbmlmKHR5cGVvZiBhPT09J3N5bWJvbCcpe1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N0cmluZycpO1xucmV0dXJuLTE7XG4gfVxuYXNzZXJ0KHR5cGVvZiBhPT09J3N0cmluZycpO1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N5bWJvbCcpO1xucmV0dXJuIDE7XG4gfTtcblxuLyoqXG4gKiBUT0RPIENvbnNvbGlkYXRlIHdpdGggdGhlIGBnZXRNZXRob2ROYW1lc2AgaW4gYEBlbmRvL2V2ZW50dWFsLXNlbmRgXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gS1xuICogQHBhcmFtIHtSZWNvcmQ8SywgYW55Pn0gdmFsXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0TWV0aG9kTmFtZXM9KHZhbCk9PntcbmxldCBsYXllcj12YWw7XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7LyogU2V0IHRvIGRlZHVwbGljYXRlKi9cbndoaWxlKGxheWVyIT09bnVsbCYmbGF5ZXIhPT1PYmplY3QucHJvdG90eXBlKXtcbi8qIGJlIHRvbGVyYW50IG9mIG5vbi1vYmplY3RzKi9cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuY29uc3Qgb3duTmFtZXM9LyoqIEB0eXBlIHtLW119ICovb3duS2V5cyhkZXNjcyk7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25OYW1lcyl7XG4vKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4vKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuaWYodHlwZW9mIHZhbFtuYW1lXT09PSdmdW5jdGlvbicpe1xubmFtZXMuYWRkKG5hbWUpO1xuIH1cbiB9XG5pZighaXNPYmplY3QodmFsKSl7XG5icmVhaztcbiB9XG5sYXllcj1nZXRQcm90b3R5cGVPZihsYXllcik7XG4gfVxucmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG4gfTskaOKAjV9vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qKlxuICogVE9ETyBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGVhc2UgdGhlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81OTcwIHRyYW5zaXRpb24sIGZyb20gYWxsIG1ldGhvZHNcbiAqIGJlaW5nIG93biBwcm9wZXJ0aWVzIHRvIG1ldGhvZHMgYmVpbmcgaW5oZXJpdGVkIGZyb20gYSBjb21tb24gcHJvdG90eXBlLlxuICogVGhpcyB0cmFuc2l0aW9uIGJyZWFrcyB0d28gcGF0dGVybnMgdXNlZCBpbiBwcmlvciBjb2RlOiBhdXRvYmluZGluZyxcbiAqIGFuZCBlbnVtZXJhdGluZyBtZXRob2RzIGJ5IGVudW1lcmF0aW5nIG93biBwcm9wZXJ0aWVzLiBGb3IgYm90aCwgdGhlXG4gKiBwcmVmZXJyZWQgcmVwYWlycyBhcmVcbiAqICAgICogYXV0b2JpbmRpbmc6IFJlcGxhY2UsIGZvciBleGFtcGxlLFxuICogICAgICBgZm9vKG9iai5tZXRob2QpYCB3aXRoIGBmb28oYXJnID0+IGBvYmoubWV0aG9kKGFyZykpYC4gSU9XLCBzdG9wIHJlbHlpbmdcbiAqICAgICAgb24gZXhwcmVzc2lvbnMgbGlrZSBgb2JqLm1ldGhvZGAgdG8gZXh0cmFjdCBhIG1ldGhvZCBzdGlsbCBib3VuZCB0byB0aGVcbiAqICAgICAgc3RhdGUgb2YgYG9iamAgYmVjYXVzZSwgZm9yIHZpcnR1YWwgYW5kIGR1cmFibGUgb2JqZWN0cyxcbiAqICAgICAgdGhleSBubyBsb25nZXIgd2lsbCBhZnRlciAjNTk3MC5cbiAqICAgICogbWV0aG9kIGVudW1lcmF0aW9uOiBSZXBsYWNlLCBmb3IgZXhhbXBsZVxuICogICAgICBgUmVmbGVjdC5vd25LZXlzKG9iailgIHdpdGggYGdldE1ldGhvZE5hbWVzKG9iailgLlxuICpcbiAqIE9uY2UgYWxsIHByb2JsZW1hdGljIGNhc2VzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW4gdGhpcyBtYW5uZXIsIHRoaXNcbiAqIGBiaW5kQWxsTWV0aG9kc2AgaGFjayBjYW4gYW5kIFRPRE8gc2hvdWxkIGJlIGRlbGV0ZWQuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICogaGF2ZSBubyByZWxpYWJsZSBzdGF0aWMgd2F5IHRvIHRyYWNrIGRvd24gYW5kIGZpeCBhbGwgYXV0b2JpbmRpbmcgc2l0ZXMuXG4gKiBGb3IgdGhvc2Ugb2JqZWN0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZ1bGx5IHJlcGFpcmVkIGJ5IHRoZSBhYm92ZSB0d29cbiAqIHRlY2huaXF1ZXMsIGBiaW5kQWxsTWV0aG9kc2AgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBhY3RzIG11Y2ggbGlrZSB0aGVcbiAqIHByZS0jNTk3MCBvYmplY3RzLCB3aXRoIGFsbCB0aGVpciBtZXRob2RzIGFzIGluc3RhbmNlLWJvdW5kIG93biBwcm9wZXJ0aWVzLlxuICogSXQgZG9lcyB0aGlzIGJ5IG1ha2luZyBhIG5ldyBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGBvYmpgIHdoZXJlIHRoZSBuZXdcbiAqIG9iamVjdCBoYXMgYm91bmQgb3duIG1ldGhvZHMgb3ZlcnJpZGRpbmcgYWxsIHRoZSBtZXRob2RzIGl0IHdvdWxkIGhhdmVcbiAqIGluaGVyaXRlZCBmcm9tIGBvYmpgLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBhbnk+fSBUXG4gKiBAcGFyYW0ge1R9IG9ialxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICBiaW5kQWxsTWV0aG9kcz0ob2JqKT0+XG5oYXJkZW4oXG5jcmVhdGUoXG5vYmosXG5mcm9tRW50cmllcyhcbmdldE1ldGhvZE5hbWVzKG9iaikubWFwKChuYW1lKT0+W1xubmFtZSxcbntcbnZhbHVlOigvKiogQHR5cGUge3Vua25vd25bXX0gKi8uLi5hcmdzKT0+XG5hcHBseShvYmpbbmFtZV0sb2JqLGFyZ3MpLFxuZW51bWVyYWJsZTp0cnVlfV0pKSkpOyRo4oCNX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuXG5cblxuXG5cbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwiYmluZEFsbE1ldGhvZHMiOlsiYmluZEFsbE1ldGhvZHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVDn6ES0CAAAtAgAAKQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiU3RvcmFnZU5vZGVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdCAgICAgICAgU3RvcmFnZU5vZGVTaGFwZT1NLnJlbW90YWJsZSgnU3RvcmFnZU5vZGUnKTskaOKAjV9vbmNlLlN0b3JhZ2VOb2RlU2hhcGUoU3RvcmFnZU5vZGVTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiU3RvcmFnZU5vZGVTaGFwZSI6WyJTdG9yYWdlTm9kZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN7GoowrBwAAKwcAACoAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdXBncmFkZS1hcGkuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iLCJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNPYmplY3Q7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIEB0eXBlZGVmIHt7IG5hbWU6IHN0cmluZywgdXBncmFkZU1lc3NhZ2U6IHN0cmluZywgaW5jYXJuYXRpb25OdW1iZXI6IG51bWJlciB9fSBEaXNjb25uZWN0aW9uT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBNYWtlcyBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgdXNlIGFzIHRoZSByZWplY3Rpb24gdmFsdWUgb2YgcHJvbWlzZXNcbiAqIGFiYW5kb25lZCBieSB1cGdyYWRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cGdyYWRlTWVzc2FnZVxuICogQHBhcmFtIHtudW1iZXJ9IHRvSW5jYXJuYXRpb25OdW1iZXJcbiAqIEByZXR1cm5zIHtEaXNjb25uZWN0aW9uT2JqZWN0fVxuICovXG5jb25zdCAgICAgICAgbWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uPSh1cGdyYWRlTWVzc2FnZSx0b0luY2FybmF0aW9uTnVtYmVyKT0+XG5oYXJkZW4oe1xubmFtZTondmF0VXBncmFkZWQnLFxudXBncmFkZU1lc3NhZ2UsXG5pbmNhcm5hdGlvbk51bWJlcjp0b0luY2FybmF0aW9uTnVtYmVyfSk7JGjigI1fb25jZS5tYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuaGFyZGVuKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbi8qIFRPRE86IFNpbXBsaWZ5IG9uY2Ugd2UgaGF2ZSBAZW5kby9wYXR0ZXJucyAob3IganVzdCBleHBvcnQgdGhlIHNoYXBlKS4qL1xuLyogY29uc3QgdXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSA9IGhhcmRlbih7Ki9cbi8qIG5hbWU6ICd2YXRVcGdyYWRlZCcsKi9cbi8qIHVwZ3JhZGVNZXNzYWdlOiBNLnN0cmluZygpLCovXG4vKiBpbmNhcm5hdGlvbk51bWJlcjogTS5udW1iZXIoKSwqL1xuLyogfSk7Ki9cbi8qIGNvbnN0IGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSBlcnIgPT4gbWF0Y2hlcyhlcnIsIHVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpOyovXG4vKipcbiAqIEBwYXJhbSB7YW55fSBlcnJcbiAqIEByZXR1cm5zIHtlcnIgaXMgRGlzY29ubmVjdGlvbk9iamVjdH1cbiAqL1xuY29uc3QgICAgICAgIGlzVXBncmFkZURpc2Nvbm5lY3Rpb249KGVycik9PlxuaXNPYmplY3QoZXJyKSYmXG5lcnIubmFtZT09PSd2YXRVcGdyYWRlZCcmJlxudHlwZW9mIGVyci51cGdyYWRlTWVzc2FnZT09PSdzdHJpbmcnJiZcbnR5cGVvZiBlcnIuaW5jYXJuYXRpb25OdW1iZXI9PT0nbnVtYmVyJzskaOKAjV9vbmNlLmlzVXBncmFkZURpc2Nvbm5lY3Rpb24oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5oYXJkZW4oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIjpbIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIjpbImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoumxkuM8AADjPAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9zdHJlYW0iLCJqZXNzaWUuanMiXSwiZXhwb3J0cyI6WyJCQVNJU19QT0lOVFMiLCJQcm9taXNlQWxsT3JFcnJvcnMiLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IiwiYWxsVmFsdWVzIiwiYXBwbHlMYWJlbGluZ0Vycm9yIiwiYXNzZXJ0QWxsRGVmaW5lZCIsImRlZXBseUZ1bGZpbGxlZE9iamVjdCIsImZvcmV2ZXIiLCJmcm9tVW5pcXVlRW50cmllcyIsImxpc3REaWZmZXJlbmNlIiwibWFrZUFnZ3JlZ2F0ZUVycm9yIiwibWFrZU1lYXN1cmVTZWNvbmRzIiwib2JqZWN0TWFwIiwic3luY2hyb25pemVkVGVlIiwidGhyb3dMYWJlbGVkIiwidW50aWxUcnVlIiwid2hpbGVUcnVlIiwiemlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsZGVlcGx5RnVsZmlsbGVkLGlzT2JqZWN0LGlzUHJvbWlzZSxtYWtlUHJvbWlzZUtpdCxtYWtlUXVldWUsYXN5bmNHZW5lcmF0ZSxtYWtlU2V0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIiwgWyRo4oCNX2EgPT4gKGRlZXBseUZ1bGZpbGxlZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV0sW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3N0cmVhbVwiLCBbW1wibWFrZVF1ZXVlXCIsIFskaOKAjV9hID0+IChtYWtlUXVldWUgPSAkaOKAjV9hKV1dXV0sW1wiamVzc2llLmpzXCIsIFtbXCJhc3luY0dlbmVyYXRlXCIsIFskaOKAjV9hID0+IChhc3luY0dlbmVyYXRlID0gJGjigI1fYSldXSxbXCJtYWtlU2V0XCIsIFskaOKAjV9hID0+IChtYWtlU2V0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZW50cmllcyxmcm9tRW50cmllcyxrZXlzLHZhbHVlc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgQkFTSVNfUE9JTlRTPTEwXzAwMG47XG5cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWY8VD4gKi9cblxuLyoqXG4gKiBUaHJvd3MgaWYgbXVsdGlwbGUgZW50cmllcyB1c2UgdGhlIHNhbWUgcHJvcGVydHkgbmFtZS4gT3RoZXJ3aXNlIGFjdHNcbiAqIGxpa2UgYE9iamVjdC5mcm9tRW50cmllc2AgYnV0IGhhcmRlbnMgdGhlIHJlc3VsdC5cbiAqIFVzZSBpdCB0byBwcm90ZWN0IGZyb20gcHJvcGVydHkgbmFtZXMgY29tcHV0ZWQgZnJvbSB1c2VyLXByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxWXT59IGFsbEVudHJpZXNcbiAqIEByZXR1cm5zIHt7W2s6IEtdOiBWfX1cbiAqLyRo4oCNX29uY2UuQkFTSVNfUE9JTlRTKEJBU0lTX1BPSU5UUyk7XG5jb25zdCAgICAgICAgZnJvbVVuaXF1ZUVudHJpZXM9KGFsbEVudHJpZXMpPT57XG5jb25zdCBlbnRyaWVzQXJyYXk9Wy4uLmFsbEVudHJpZXNdO1xuY29uc3QgcmVzdWx0PWhhcmRlbihmcm9tRW50cmllcyhlbnRyaWVzQXJyYXkpKTtcbmlmKG93bktleXMocmVzdWx0KS5sZW5ndGg9PT1lbnRyaWVzQXJyYXkubGVuZ3RoKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuY29uc3QgbmFtZXM9bWFrZVNldCgpO1xuZm9yKGNvbnN0W25hbWUsX11vZiBlbnRyaWVzQXJyYXkpe1xuaWYobmFtZXMuaGFzKG5hbWUpKXtcbkZhaWwgYGNvbGxpc2lvbiBvbiBwcm9wZXJ0eSBuYW1lICR7cShuYW1lKX06ICR7ZW50cmllc0FycmF5fWA7XG4gfVxubmFtZXMuYWRkKG5hbWUpO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCBmcm9tIHVuaXF1ZSBlbnRyaWVzYDtcbiB9OyRo4oCNX29uY2UuZnJvbVVuaXF1ZUVudHJpZXMoZnJvbVVuaXF1ZUVudHJpZXMpO1xuaGFyZGVuKGZyb21VbmlxdWVFbnRyaWVzKTtcblxuLyoqXG4gKiBCeSBhbmFsb2d5IHdpdGggaG93IGBBcnJheS5wcm90b3R5cGUubWFwYCB3aWxsIG1hcCB0aGUgZWxlbWVudHMgb2ZcbiAqIGFuIGFycmF5IHRvIHRyYW5zZm9ybWVkIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNoYXBlLFxuICogYG9iamVjdE1hcGAgd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIHN0cmluZy1uYW1lZCBvd24gZW51bWVyYWJsZVxuICogcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVHlwaWNhbCB1c2FnZSBhcHBsaWVzIGBvYmplY3RNYXBgIHRvIGEgQ29weVJlY29yZCwgaS5lLixcbiAqIGFuIG9iamVjdCBmb3Igd2hpY2ggYHBhc3NTdHlsZU9mKG9yaWdpbmFsKSA9PT0gJ2NvcHlSZWNvcmQnYC4gRm9yIHRoZXNlLFxuICogbm9uZSBvZiB0aGUgZm9sbG93aW5nIGVkZ2UgY2FzZXMgYXJpc2UuIFRoZSByZXN1bHQgd2lsbCBiZSBhIENvcHlSZWNvcmRcbiAqIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lcywgd2hvc2UgdmFsdWVzIGFyZSB0aGUgbWFwcGVkIGZvcm0gb2ZcbiAqIHRoZSBvcmlnaW5hbCdzIHZhbHVlcy5cbiAqXG4gKiBXaGVuIHRoZSBvcmlnaW5hbCBpcyBub3QgYSBDb3B5UmVjb3JkLCBzb21lIGVkZ2UgY2FzZXMgdG8gYmUgYXdhcmUgb2ZcbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIE9ubHkgdGhlIHN0cmluZy1uYW1lZCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbFxuICogICAgICBhcmUgbWFwcGVkLiBBbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgaWdub3JlZC5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCBgT2JqZWN0LmVudHJpZXNgXG4gKiAgICAgIHdpbGwgY2F1c2UgaXRzIGBnZXR0ZXJgIHRvIGJlIGNhbGxlZCBhbmQgd2lsbCB1c2UgdGhlIHJlc3VsdGluZ1xuICogICAgICB2YWx1ZS5cbiAqICAgICogTm8gbWF0dGVyIHdoZXRoZXIgdGhlIG9yaWdpbmFsIHByb3BlcnR5IHdhcyBhbiBhY2Nlc3Nvciwgd3JpdGFibGUsXG4gKiAgICAgIG9yIGNvbmZpZ3VyYWJsZSwgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogICAgICBub24td3JpdGFibGUsIG5vbi1jb25maWd1cmFibGUsIGRhdGEgcHJvcGVydGllcy5cbiAqICAgICogTm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCBtYXkgaGF2ZSBpbmhlcml0ZWQgZnJvbSwgYW5kXG4gKiAgICAgIG5vIG1hdHRlciB3aGV0aGVyIGl0IHdhcyBhIHNwZWNpYWwga2luZCBvZiBvYmplY3Qgc3VjaCBhcyBhbiBhcnJheSxcbiAqICAgICAgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCBpbmhlcml0aW5nIGRpcmVjdGx5XG4gKiAgICAgIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFuZCB3aG9zZSBzdGF0ZSBpcyBvbmx5IHRoZXNlIG5ldyBtYXBwZWRcbiAqICAgICAgb3duIHByb3BlcnRpZXMuXG4gKlxuICogV2l0aCB0aGVzZSBkaWZmZXJlbmNlcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyBub3QgYSBDb3B5UmVjb3JkLFxuICogaWYgYWxsIHRoZSBtYXBwZWQgdmFsdWVzIGFyZSBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqIGEgQ29weVJlY29yZC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IE9cbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEB0ZW1wbGF0ZSBSIG1hcCByZXN1bHRcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW2tleW9mIE9dLCBrZXk6IGtleW9mIE8pID0+IFJ9IG1hcEZuXG4gKiBAcmV0dXJucyB7eyBbUCBpbiBrZXlvZiBPXTogUn19XG4gKi9cbmNvbnN0ICAgICAgICBvYmplY3RNYXA9KG9yaWdpbmFsLG1hcEZuKT0+e1xuY29uc3QgZW50cz1lbnRyaWVzKG9yaWdpbmFsKTtcbmNvbnN0IG1hcEVudHM9ZW50cy5tYXAoKFtrLHZdKT0+W2ssbWFwRm4odixrKV0pO1xucmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSk7XG4gfTskaOKAjV9vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSBsZWZ0TmFtZXNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gcmlnaHROYW1lc1xuICovXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnROYW1lcyxyaWdodE5hbWVzKT0+e1xuY29uc3QgcmlnaHRTZXQ9bWFrZVNldChyaWdodE5hbWVzKTtcbnJldHVybiBsZWZ0TmFtZXMuZmlsdGVyKChuYW1lKT0+IXJpZ2h0U2V0LmhhcyhuYW1lKSk7XG4gfTskaOKAjV9vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdXG4gKiBAcmV0dXJucyB7bmV2ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB0aHJvd0xhYmVsZWQ9KGlubmVyRXJyLGxhYmVsLEVycm9yQ29uc3RydWN0b3I9dW5kZWZpbmVkKT0+e1xuaWYodHlwZW9mIGxhYmVsPT09J251bWJlcicpe1xubGFiZWw9IGBbJHtsYWJlbH1dYDtcbiB9XG5jb25zdCBvdXRlckVycj1hc3NlcnQuZXJyb3IoXG4gYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YCxcbkVycm9yQ29uc3RydWN0b3IpO1xuXG5hc3NlcnQubm90ZShvdXRlckVycixYIGBDYXVzZWQgYnkgJHtpbm5lckVycn1gKTtcbnRocm93IG91dGVyRXJyO1xuIH07JGjigI1fb25jZS50aHJvd0xhYmVsZWQodGhyb3dMYWJlbGVkKTtcbmhhcmRlbih0aHJvd0xhYmVsZWQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBBLFJcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gUn0gZnVuY1xuICogQHBhcmFtIHtBW119IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge1J9XG4gKi9cbmNvbnN0ICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3I9KGZ1bmMsYXJncyxsYWJlbD11bmRlZmluZWQpPT57XG5pZihsYWJlbD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYyguLi5hcmdzKTtcbiB9XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG50aHJvd0xhYmVsZWQoZXJyLGxhYmVsKTtcbiB9XG5pZihpc1Byb21pc2UocmVzdWx0KSl7XG4vKiBJZiByZXN1bHQgaXMgYSByZWplY3RlZCBwcm9taXNlLCB0aGlzIHdpbGwgcmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEqL1xuLyogZGlmZmVyZW50IHJlamVjdGlvbiByZWFzb24uIEJ1dCB0aGlzIGNvbmZ1c2VzIFR5cGVTY3JpcHQgYmVjYXVzZSBpdCB0eXBlcyovXG4vKiB0aGF0IGNhc2UgYXMgYFByb21pc2U8bmV2ZXI+YCB3aGljaCBpcyBjb29sIGZvciBhIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyKi9cbi8qIGZ1bGZpbGwuICBCdXQgVHlwZVNjcmlwdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGlzIHdpbGwgb25seSBoYXBwZW4qL1xuLyogd2hlbiBgcmVzdWx0YCB3YXMgYSByZWplY3RlZCBwcm9taXNlLiBJbiBvbmx5IHRoaXMgY2FzZSBgUmAgc2hvdWxkKi9cbi8qIGFscmVhZHkgYWxsb3cgYFByb21pc2U8bmV2ZXI+YCBhcyBhIHN1YnR5cGUuKi9cbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IHJlbGFiZWxlZD1FLndoZW4ocmVzdWx0LHVuZGVmaW5lZCwocmVhc29uKT0+XG50aHJvd0xhYmVsZWQocmVhc29uLGxhYmVsKSk7XG5cbnJldHVybiAoLyoqIEB0eXBlIHtSfSAqL3JlbGFiZWxlZCk7XG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tbS2V5VHlwZSBpbiBrZXlvZiBUXTogVFtLZXlUeXBlXX0gJiB7fX0gU2ltcGxpZnlcbiAqIGZsYXR0ZW4gdGhlIHR5cGUgb3V0cHV0IHRvIGltcHJvdmUgdHlwZSBoaW50cyBzaG93biBpbiBlZGl0b3JzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3NpbXBsaWZ5LmQudHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0eXBlZGVmIHt7IFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ2FsbGFibGUgPyBUW0tdIDogRGVlcGx5QXdhaXRlZDxUW0tdPiB9fSBEZWVwbHlBd2FpdGVkT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyBQcm9taXNlTGlrZTxhbnk+ID8gQXdhaXRlZDxUPiA6IFQgZXh0ZW5kcyB7fSA/IFNpbXBsaWZ5PERlZXBseUF3YWl0ZWRPYmplY3Q8VD4+IDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogQSBtb3JlIGNvbnN0cmFpbmVkIHZlcnNpb24gb2Yge2RlZXBseUZ1bGZpbGxlZH0gZm9yIHR5cGUgc2FmZXR5IHVudGlsXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzEyNTdcbiAqIFVzZWZ1bCBpbiBzdGFydGluZyBjb250cmFjdHMgdGhhdCBuZWVkIGFsbCB0ZXJtcyB0byBiZSBmdWxmaWxsZWRcbiAqIGluIG9yZGVyIHRvIGJlIGR1cmFibGUuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMge30+KHVuZnVsZmlsbGVkVGVybXM6IFQpID0+IFByb21pc2U8RGVlcGx5QXdhaXRlZDxUPj59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWRPYmplY3Q9YXN5bmMob2JqKT0+e1xuaXNPYmplY3Qob2JqKXx8RmFpbCBgcGFyYW0gbXVzdCBiZSBhbiBvYmplY3RgO1xucmV0dXJuIGRlZXBseUZ1bGZpbGxlZChvYmopO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdXNlcyBhIG1pbGxpc2Vjb25kLWJhc2VkIHRpbWUtc2luY2UtZXBvY2ggY2FwYWJpbGl0eVxuICogKHN1Y2ggYXMgYHBlcmZvcm1hbmNlLm5vd2ApIHRvIG1lYXN1cmUgZXhlY3V0aW9uIHRpbWUgb2YgYW4gYXN5bmMgZnVuY3Rpb25cbiAqIGFuZCByZXBvcnQgdGhlIHJlc3VsdCBpbiBzZWNvbmRzIHRvIG1hdGNoIG91ciB0ZWxlbWV0cnkgc3RhbmRhcmQuXG4gKlxuICogQHBhcmFtIHt0eXBlb2YgWGltcG9ydCgncGVyZl9ob29rcycpLnBlcmZvcm1hbmNlLm5vd30gY3VycmVudFRpbWVNaWxsaXNlY1xuICogQHJldHVybnMgezxUPihmbjogKCkgPT4gUHJvbWlzZTxUPikgPT4gUHJvbWlzZTx7IHJlc3VsdDogVCwgZHVyYXRpb246IG51bWJlciB9Pn1cbiAqLyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkT2JqZWN0KGRlZXBseUZ1bGZpbGxlZE9iamVjdCk7XG5jb25zdCAgICAgICAgbWFrZU1lYXN1cmVTZWNvbmRzPShjdXJyZW50VGltZU1pbGxpc2VjKT0+e1xuLyoqIEBwYXJhbSB7KCkgPT4gYW55fSBmbiAqL1xuY29uc3QgbWVhc3VyZVNlY29uZHM9YXN5bmMoZm4pPT57XG5jb25zdCB0MD1jdXJyZW50VGltZU1pbGxpc2VjKCk7XG5jb25zdCByZXN1bHQ9YXdhaXQgZm4oKTtcbmNvbnN0IGR1cmF0aW9uTWlsbGlzZWM9Y3VycmVudFRpbWVNaWxsaXNlYygpLXQwO1xucmV0dXJue3Jlc3VsdCxkdXJhdGlvbjpkdXJhdGlvbk1pbGxpc2VjLzEwMDB9O1xuIH07XG5yZXR1cm4gbWVhc3VyZVNlY29uZHM7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yW119IGVycm9yc1xuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXVxuICovJGjigI1fb25jZS5tYWtlTWVhc3VyZVNlY29uZHMobWFrZU1lYXN1cmVTZWNvbmRzKTtcbmNvbnN0ICAgICAgICBtYWtlQWdncmVnYXRlRXJyb3I9KGVycm9ycyxtZXNzYWdlKT0+e1xuY29uc3QgZXJyPUVycm9yKG1lc3NhZ2UpO1xuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZXJyLHtcbm5hbWU6e1xudmFsdWU6J0FnZ3JlZ2F0ZUVycm9yJ30sXG5cbmVycm9yczp7XG52YWx1ZTplcnJvcnN9fSk7XG5cblxucmV0dXJuIGVycjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3JlYWRvbmx5IChUIHwgUHJvbWlzZUxpa2U8VD4pW119IGl0ZW1zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUW10+fVxuICovJGjigI1fb25jZS5tYWtlQWdncmVnYXRlRXJyb3IobWFrZUFnZ3JlZ2F0ZUVycm9yKTtcbmNvbnN0ICAgICAgICBQcm9taXNlQWxsT3JFcnJvcnM9YXN5bmMoaXRlbXMpPT57XG5yZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGl0ZW1zKS50aGVuKChyZXN1bHRzKT0+e1xuY29uc3QgZXJyb3JzPS8qKiBAdHlwZSB7UHJvbWlzZVJlamVjdGVkUmVzdWx0W119ICovXG5yZXN1bHRzLmZpbHRlcigoe3N0YXR1c30pPT5zdGF0dXM9PT0ncmVqZWN0ZWQnKS5cbm1hcCgocmVzdWx0KT0+cmVzdWx0LnJlYXNvbik7XG5pZighZXJyb3JzLmxlbmd0aCl7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxUPltdfSAqL3Jlc3VsdHMubWFwKFxuKHJlc3VsdCk9PnJlc3VsdC52YWx1ZSkpO1xuXG4gfWVsc2UgaWYoZXJyb3JzLmxlbmd0aD09PTEpe1xudGhyb3cgZXJyb3JzWzBdO1xuIH1lbHNle1xudGhyb3cgbWFrZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gfVxuIH0pO1xuIH07XG5cbi8qKlxuICogQHR5cGUgezxUPihcbiAqICAgdHJpZXI6ICgpID0+IFByb21pc2U8VD4sXG4gKiAgZmluYWxpemVyOiAoZXJyb3I/OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+LFxuICogKSA9PiBQcm9taXNlPFQ+fVxuICovJGjigI1fb25jZS5Qcm9taXNlQWxsT3JFcnJvcnMoUHJvbWlzZUFsbE9yRXJyb3JzKTtjb25zdCBhZ2dyZWdhdGVUcnlGaW5hbGx5PWFzeW5jKHRyaWVyLGZpbmFsaXplcik9PlxudHJpZXIoKS50aGVuKFxuYXN5bmMocmVzdWx0KT0+ZmluYWxpemVyKCkudGhlbigoKT0+cmVzdWx0KSxcbmFzeW5jKHRyeUVycm9yKT0+XG5maW5hbGl6ZXIodHJ5RXJyb3IpLlxudGhlbihcbigpPT50cnlFcnJvcixcbihmaW5hbGl6ZUVycm9yKT0+bWFrZUFnZ3JlZ2F0ZUVycm9yKFt0cnlFcnJvcixmaW5hbGl6ZUVycm9yXSkpLlxuXG50aGVuKChlcnJvcik9PlByb21pc2UucmVqZWN0KGVycm9yKSkpO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gVFxuICogQHR5cGVkZWYge3tbUCBpbiBrZXlvZiBUXTogRXhjbHVkZTxUW1BdLCB1bmRlZmluZWQ+O319IEFsbERlZmluZWRcbiAqL1xuXG4vKipcbiAqIENvbmNpc2Ugd2F5IHRvIGNoZWNrIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGZyb20gb2JqZWN0IGxpdGVyYWwgc2hvcnRoYW5kLlxuICogVGhyb3dzIGVycm9yIG1lc3NhZ2UgdG8gc3BlY2lmeSB0aGUgbWlzc2luZyB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gVFxuICogQHBhcmFtIHtUfSBvYmpcbiAqIEB0aHJvd3MgaWYgYW55IHZhbHVlIGluIHRoZSBvYmplY3QgZW50cmllcyBpcyBub3QgZGVmaW5lZFxuICogQHJldHVybnMge2Fzc2VydHMgb2JqIGlzIEFsbERlZmluZWQ8VD59XG4gKi8kaOKAjV9vbmNlLmFnZ3JlZ2F0ZVRyeUZpbmFsbHkoYWdncmVnYXRlVHJ5RmluYWxseSk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRBbGxEZWZpbmVkPShvYmopPT57XG5jb25zdCBtaXNzaW5nPVtdO1xuZm9yKGNvbnN0W2tleSx2YWxdb2YgT2JqZWN0LmVudHJpZXMob2JqKSl7XG5pZih2YWw9PT11bmRlZmluZWQpe1xubWlzc2luZy5wdXNoKGtleSk7XG4gfVxuIH1cbmlmKG1pc3NpbmcubGVuZ3RoPjApe1xuRmFpbCBgbWlzc2luZyAke3EobWlzc2luZyl9YDtcbiB9XG4gfTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDx1bmRlZmluZWQsIG5ldmVyPn0gKi8kaOKAjV9vbmNlLmFzc2VydEFsbERlZmluZWQoYXNzZXJ0QWxsRGVmaW5lZCk7XG5jb25zdCBub3REb25lPWhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTp1bmRlZmluZWR9KTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxuZXZlciwgdm9pZD59ICovXG5jb25zdCBhbHdheXNEb25lPWhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuXG5jb25zdCAgICAgICAgZm9yZXZlcj1hc3luY0dlbmVyYXRlKCgpPT5ub3REb25lKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUfSBwcm9kdWNlXG4gKiBUaGUgdmFsdWUgb2YgYGF3YWl0IHByb2R1Y2UoKWAgaXMgdXNlZCBmb3IgaXRzIHRydXRoaW5lc3MgdnMgZmFsc2luZXNzLlxuICogSU9XLCBpdCBpcyBjb2VyY2VkIHRvIGEgYm9vbGVhbiBzbyB0aGUgY2FsbGVyIG5lZWQgbm90IGJvdGhlciBkb2luZyB0aGlzXG4gKiB0aGVtc2VsdmVzLlxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8QXdhaXRlZDxUPj59XG4gKi8kaOKAjV9vbmNlLmZvcmV2ZXIoZm9yZXZlcik7XG5jb25zdCAgICAgICAgd2hpbGVUcnVlPShwcm9kdWNlKT0+XG5hc3luY0dlbmVyYXRlKGFzeW5jKCk9PntcbmNvbnN0IHZhbHVlPWF3YWl0IHByb2R1Y2UoKTtcbmlmKCF2YWx1ZSl7XG5yZXR1cm4gYWx3YXlzRG9uZTtcbiB9XG5yZXR1cm4gaGFyZGVuKHtcbmRvbmU6ZmFsc2UsXG52YWx1ZX0pO1xuXG4gfSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVH0gcHJvZHVjZVxuICogVGhlIHZhbHVlIG9mIGBhd2FpdCBwcm9kdWNlKClgIGlzIHVzZWQgZm9yIGl0cyB0cnV0aGluZXNzIHZzIGZhbHNpbmVzcy5cbiAqIElPVywgaXQgaXMgY29lcmNlZCB0byBhIGJvb2xlYW4gc28gdGhlIGNhbGxlciBuZWVkIG5vdCBib3RoZXIgZG9pbmcgdGhpc1xuICogdGhlbXNlbHZlcy5cbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPEF3YWl0ZWQ8VD4+fVxuICovJGjigI1fb25jZS53aGlsZVRydWUod2hpbGVUcnVlKTtcbmNvbnN0ICAgICAgICB1bnRpbFRydWU9KHByb2R1Y2UpPT5cbmFzeW5jR2VuZXJhdGUoYXN5bmMoKT0+e1xuY29uc3QgdmFsdWU9YXdhaXQgcHJvZHVjZSgpO1xuaWYodmFsdWUpe1xucmV0dXJuIGhhcmRlbih7XG5kb25lOnRydWUsXG52YWx1ZX0pO1xuXG4gfVxucmV0dXJuIGhhcmRlbih7XG5kb25lOmZhbHNlLFxudmFsdWV9KTtcblxuIH0pO1xuXG4vKiogQHR5cGUgeyA8WCwgWT4oeHM6IFhbXSwgeXM6IFlbXSkgPT4gW1gsIFldW119ICovJGjigI1fb25jZS51bnRpbFRydWUodW50aWxUcnVlKTtcbmNvbnN0ICAgICAgICB6aXA9KHhzLHlzKT0+aGFyZGVuKHhzLm1hcCgoeCxpKT0+W3gseXNbK2ldXSkpO1xuXG4vKiogQHR5cGUgeyA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEVSZWY8YW55Pj4+KG9iajogVCkgPT4gUHJvbWlzZTx7IFtLIGluIGtleW9mIFRdOiBBd2FpdGVkPFRbS10+fT4gfSAqLyRo4oCNX29uY2UuemlwKHppcCk7XG5jb25zdCAgICAgICAgYWxsVmFsdWVzPWFzeW5jKG9iaik9PntcbmNvbnN0IHJlc29sdmVkPWF3YWl0IFByb21pc2UuYWxsKHZhbHVlcyhvYmopKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKHppcChrZXlzKG9iaikscmVzb2x2ZWQpKSk7XG4gfTtcblxuLyoqXG4gKiBBIHRlZSBpbXBsZW1lbnRhdGlvbiB3aGVyZSBhbGwgcmVhZGVycyBhcmUgc3luY2hyb25pemVkIHdpdGggZWFjaCBvdGhlci5cbiAqIFRoZXkgYWxsIGNvbnN1bWUgdGhlIHNvdXJjZSBzdHJlYW0gaW4gbG9ja3N0ZXAsIGFuZCBhbnkgb25lIHJldHVybmluZyBvclxuICogdGhyb3dpbmcgZWFybHkgd2lsbCBhZmZlY3QgdGhlIG90aGVycy5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7QXN5bmNJdGVyYXRvcjxULCB2b2lkLCB2b2lkPn0gc291cmNlU3RyZWFtXG4gKiBAcGFyYW0ge251bWJlcn0gcmVhZGVyQ291bnRcbiAqLyRo4oCNX29uY2UuYWxsVmFsdWVzKGFsbFZhbHVlcyk7XG5jb25zdCAgICAgICAgc3luY2hyb25pemVkVGVlPShzb3VyY2VTdHJlYW0scmVhZGVyQ291bnQpPT57XG4vKiogQHR5cGUge0l0ZXJhdG9yUmV0dXJuUmVzdWx0PHZvaWQ+IHwgdW5kZWZpbmVkfSAqL1xubGV0IGRvbmVSZXN1bHQ7XG5cbi8qKiBAdHlwZWRlZiB7SXRlcmF0b3JSZXN1bHQ8KHZhbHVlOiBQcm9taXNlTGlrZTxJdGVyYXRvclJlc3VsdDxUPj4pID0+IHZvaWQ+fSBRdWV1ZVBheWxvYWQgKi9cbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vc3RyZWFtJykuQXN5bmNRdWV1ZTxRdWV1ZVBheWxvYWQ+W119ICovXG5jb25zdCBxdWV1ZXM9W107XG5cbi8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbmNvbnN0IHB1bGxOZXh0PWFzeW5jKCk9PntcbmNvbnN0IHJlcXVlc3RzPWF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChxdWV1ZXMubWFwKChxdWV1ZSk9PnF1ZXVlLmdldCgpKSk7XG5jb25zdCByZWplY3Rpb25zPVtdO1xuLyoqIEB0eXBlIHtBcnJheTwodmFsdWU6IFByb21pc2VMaWtlPEl0ZXJhdG9yUmVzdWx0PFQ+PikgPT4gdm9pZD59ICovXG5jb25zdCByZXNvbHZlcnM9W107XG5sZXQgZG9uZT1mYWxzZTtcbmZvcihjb25zdCBzZXR0bGVkUmVzdWx0IG9mIHJlcXVlc3RzKXtcbmlmKHNldHRsZWRSZXN1bHQuc3RhdHVzPT09J3JlamVjdGVkJyl7XG5yZWplY3Rpb25zLnB1c2goc2V0dGxlZFJlc3VsdC5yZWFzb24pO1xuIH1lbHNle1xuZG9uZXx8PSEhc2V0dGxlZFJlc3VsdC52YWx1ZS5kb25lO1xucmVzb2x2ZXJzLnB1c2goc2V0dGxlZFJlc3VsdC52YWx1ZS52YWx1ZSk7XG4gfVxuIH1cbi8qKiBAdHlwZSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj59ICovXG5sZXQgcmVzdWx0O1xuaWYoZG9uZVJlc3VsdCl7XG5yZXN1bHQ9UHJvbWlzZS5yZXNvbHZlKGRvbmVSZXN1bHQpO1xuIH1lbHNlIGlmKHJlamVjdGlvbnMubGVuZ3RoKXtcbmNvbnN0IGVycm9yPWFzc2VydC5lcnJvcihhc3NlcnQuZGV0YWlscyBgVGVlZCBzdHJlYW0gdGhyZXdgKTtcbmFzc2VydC5ub3RlKGVycm9yLGFzc2VydC5kZXRhaWxzIGBUZWVkIHJlamVjdGlvbnM6ICR7cmVqZWN0aW9uc31gKTtcbnJlc3VsdD1cbnNvdXJjZVN0cmVhbS50aHJvdz8uKGVycm9yKXx8XG5Qcm9taXNlLnJlc29sdmUoc291cmNlU3RyZWFtLnJldHVybj8uKCkpLnRoZW4oKCk9PlxuUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcblxuIH1lbHNlIGlmKGRvbmUpe1xucmVzdWx0PVxuc291cmNlU3RyZWFtLnJldHVybj8uKCl8fFxuUHJvbWlzZS5yZXNvbHZlKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfWVsc2V7XG5yZXN1bHQ9c291cmNlU3RyZWFtLm5leHQoKTtcbiB9XG5yZXN1bHQudGhlbihcbihyKT0+e1xuaWYoci5kb25lKXtcbmRvbmVSZXN1bHQ9cjtcbiB9XG4gfSxcbigpPT57XG5kb25lUmVzdWx0PXtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfTtcbiB9KTtcblxucmVzb2x2ZXJzLmZvckVhY2goKHJlc29sdmUpPT5yZXNvbHZlKHJlc3VsdCkpO1xucmV0dXJuIHB1bGxOZXh0KCk7XG4gfTtcblxuY29uc3QgcmVhZGVycz1BcnJheS5mcm9tKHtsZW5ndGg6cmVhZGVyQ291bnR9KS5tYXAoKCk9Pntcbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vc3RyZWFtJykuQXN5bmNRdWV1ZTxRdWV1ZVBheWxvYWQ+fSAqL1xuY29uc3QgcXVldWU9bWFrZVF1ZXVlKCk7XG5xdWV1ZXMucHVzaChxdWV1ZSk7XG5cbi8qKiBAdHlwZSB7QXN5bmNHZW5lcmF0b3I8VCwgdm9pZCwgdm9pZD59ICovXG5jb25zdCByZWFkZXI9aGFyZGVuKHtcbiAgICAgIGFzeW5jIG5leHQoKXtcbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlS2l0PEl0ZXJhdG9yUmVzdWx0PFQ+Pn0gKi9cbmNvbnN0e3Byb21pc2UscmVzb2x2ZX09bWFrZVByb21pc2VLaXQoKTtcbnF1ZXVlLnB1dCh7dmFsdWU6cmVzb2x2ZSxkb25lOmZhbHNlfSk7XG5yZXR1cm4gcHJvbWlzZTtcbiB9LFxuICAgICAgYXN5bmMgcmV0dXJuKCl7XG4vKiogQHR5cGUge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZUtpdDxJdGVyYXRvclJlc3VsdDxUPj59ICovXG5jb25zdHtwcm9taXNlLHJlc29sdmV9PW1ha2VQcm9taXNlS2l0KCk7XG5xdWV1ZS5wdXQoe3ZhbHVlOnJlc29sdmUsZG9uZTp0cnVlfSk7XG5yZXR1cm4gcHJvbWlzZTtcbiB9LFxuICAgICAgYXN5bmMgdGhyb3cocmVhc29uKXtcbmNvbnN0IHJlamVjdGlvbj1Qcm9taXNlLnJlamVjdChyZWFzb24pO1xucXVldWUucHV0KHJlamVjdGlvbik7XG5yZXR1cm4gcmVqZWN0aW9uO1xuIH0sXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtcbnJldHVybiByZWFkZXI7XG4gfX0pO1xuXG5yZXR1cm4gcmVhZGVyO1xuIH0pO1xuXG52b2lkIHB1bGxOZXh0KCk7XG5yZXR1cm4gcmVhZGVycztcbiB9OyRo4oCNX29uY2Uuc3luY2hyb25pemVkVGVlKHN5bmNocm9uaXplZFRlZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQkFTSVNfUE9JTlRTIjpbIkJBU0lTX1BPSU5UUyJdLCJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl0sImxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl0sInRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXSwiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sIm1ha2VNZWFzdXJlU2Vjb25kcyI6WyJtYWtlTWVhc3VyZVNlY29uZHMiXSwibWFrZUFnZ3JlZ2F0ZUVycm9yIjpbIm1ha2VBZ2dyZWdhdGVFcnJvciJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJhc3NlcnRBbGxEZWZpbmVkIjpbImFzc2VydEFsbERlZmluZWQiXSwiZm9yZXZlciI6WyJmb3JldmVyIl0sIndoaWxlVHJ1ZSI6WyJ3aGlsZVRydWUiXSwidW50aWxUcnVlIjpbInVudGlsVHJ1ZSJdLCJ6aXAiOlsiemlwIl0sImFsbFZhbHVlcyI6WyJhbGxWYWx1ZXMiXSwic3luY2hyb25pemVkVGVlIjpbInN5bmNocm9uaXplZFRlZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABn0MWK1RIAANUSAAAzAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzeyJpbXBvcnRzIjpbIi4vc3Vic2NyaWJlLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZU5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsc3Vic2NyaWJlTGF0ZXN0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYHN1YnNjcmliZUxhdGVzdGAgZnJvbSBgQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanNgIGluc3RlYWQuXG4gKlxuICogQWRhcHRvciBmcm9tIGEgbm90aWZpZXJQIHRvIGFuIGFzeW5jIGl0ZXJhYmxlLlxuICogVGhlIG5vdGlmaWVyUCBjYW4gYmUgYW55IG9iamVjdCB0aGF0IGhhcyBhbiBldmVudHVhbGx5IGludm9jYWJsZVxuICogYGdldFVwZGF0ZVNpbmNlYCBtZXRob2QgdGhhdCBiZWhhdmVzIGFjY29yZGluZyB0byB0aGUgbm90aWZpZXJcbiAqIHNwZWMuIFRoaXMgY2FuIGJlIGEgbm90aWZpZXIsIGEgcHJvbWlzZSBmb3IgYSBsb2NhbCBvciByZW1vdGVcbiAqIG5vdGlmaWVyLCBvciBhIHByZXNlbmNlIG9mIGEgcmVtb3RlIG5vdGlmaWVyLlxuICpcbiAqIEl0IGlzIGFsc28gdXNlZCBpbnRlcm5hbGx5IGJ5IG5vdGlmaWVyLmpzIHNvIHRoYXQgYSBub3RpZmllciBpdHNlbGYgaXMgYW5cbiAqIGFzeW5jIGl0ZXJhYmxlLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhYmxlIGlzIGFuIG9iamVjdCB3aXRoIGEgYFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKWAgbWV0aG9kXG4gKiB0aGF0IHJldHVybnMgYW4gYXN5bmMgaXRlcmF0b3IuIFRoZSBhc3luYyBpdGVyYXRvciB3ZSByZXR1cm4gaGVyZSBoYXMgb25seVxuICogYSBgbmV4dCgpYCBtZXRob2QsIHdpdGhvdXQgdGhlIG9wdGlvbmFsIGByZXR1cm5gIGFuZCBgdGhyb3dgIG1ldGhvZHMuIFRoZVxuICogb21pdHRlZCBtZXRob2RzLCBpZiBwcmVzZW50LCB3b3VsZCBiZSB1c2VkIGJ5IHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB0b1xuICogaW5mb3JtIHRoZSBpdGVyYXRvciBvZiBlYXJseSB0ZXJtaW5hdGlvbi4gQnV0IHRoaXMgYWRhcHRvciB3b3VsZCBub3QgZG9cbiAqIGFueXRoaW5nIHVzZWZ1bCBpbiByZWFjdGlvbiB0byB0aGlzIG5vdGlmaWNhdGlvbi5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYXRvcidzIGBuZXh0KClgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gaXRlcmF0aW9uXG4gKiByZXN1bHQuIEFuIGl0ZXJhdGlvbiByZXN1bHQgaXMgYSByZWNvcmQgd2l0aCBgdmFsdWVgIGFuZCBgZG9uZWAgcHJvcGVydGllcy5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiBidWlsZGluZyBvbiB0aGUgbm90aWZpZXIgcHJvdG9jb2wgaXMgdG8gaGF2ZSBhIGxvc3N5XG4gKiBhZGFwdG9yLCB3aGVyZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBjYW4gYmUgbWlzc2VkIGluIGZhdm9yIG9mIG1vcmUgcmVjZW50XG4gKiByZXN1bHRzIHdoaWNoIGFyZSB0aGVyZWZvcmUgbGVzcyBzdGFsZS4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2RvY3VtZW50YXRpb24vYmxvYi9IRUFEL21haW4vZ3VpZGVzL2pzLXByb2dyYW1taW5nL25vdGlmaWVycy5tZFxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QmFzZU5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXI9c3Vic2NyaWJlTGF0ZXN0O1xuXG4vKipcbiAqIFRoaXMgYWR2YW5jZXMgYGFzeW5jSXRlcmF0b3JQYCB1cGRhdGluZyBgaXRlcmF0aW9uT2JzZXJ2ZXJgIHdpdGggZWFjaFxuICogc3VjY2Vzc2l2ZSB2YWx1ZS4gVGhlIGBpdGVyYXRpb25PYnNlcnZlcmAgbWF5IG9ubHkgYmUgaW50ZXJlc3RlZCBpbiBjZXJ0YWluXG4gKiBvY2N1cnJlbmNlcyAoYHVwZGF0ZVN0YXRlYCwgYGZpbmlzaGAsIGBmYWlsYCksIHNvIGZvciBjb252ZW5pZW5jZSxcbiAqIGBvYnNlcnZlSXRlcmF0b3JgIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmF0b3I8VD4+fSBhc3luY0l0ZXJhdG9yUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKTtcbmNvbnN0ICAgICAgICBvYnNlcnZlSXRlcmF0b3I9KGFzeW5jSXRlcmF0b3JQLGl0ZXJhdGlvbk9ic2VydmVyKT0+e1xucmV0dXJuIG5ldyBQcm9taXNlKChhY2ssb2JzZXJ2ZXJFcnJvcik9PntcbmNvbnN0IHJlY3VyPSgpPT57XG5FLndoZW4oXG5FKGFzeW5jSXRlcmF0b3JQKS5uZXh0KCksXG4oe3ZhbHVlLGRvbmV9KT0+e1xuaWYoZG9uZSl7XG5pdGVyYXRpb25PYnNlcnZlci5maW5pc2gmJml0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCh2YWx1ZSk7XG5hY2sodW5kZWZpbmVkKTtcbiB9ZWxzZXtcbml0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlJiZcbml0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbnJlY3VyKCk7XG4gfVxuIH0sXG4ocmVhc29uKT0+e1xuaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbCYmaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbChyZWFzb24pO1xuYWNrKHVuZGVmaW5lZCk7XG4gfSkuXG5jYXRjaChvYnNlcnZlckVycm9yKTtcbiB9O1xucmVjdXIoKTtcbiB9KTtcbiB9O1xuXG4vKipcbiAqIFRoaXMgcmVhZHMgZnJvbSBgYXN5bmNJdGVyYWJsZVBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRpb25gIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm9ic2VydmVJdGVyYXRvcihvYnNlcnZlSXRlcmF0b3IpO1xuY29uc3QgICAgICAgIG9ic2VydmVJdGVyYXRpb249KGFzeW5jSXRlcmFibGVQLGl0ZXJhdGlvbk9ic2VydmVyKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xucmV0dXJuIG9ic2VydmVJdGVyYXRvcihpdGVyYXRvclAsaXRlcmF0aW9uT2JzZXJ2ZXIpO1xuIH07XG5cbi8qKlxuICogQXMgdXBkYXRlcyBjb21lIGluIGZyb20gdGhlIHBvc3NpYmx5IHJlbW90ZSBgbm90aWZpZXJQYCwgdXBkYXRlXG4gKiB0aGUgbG9jYWwgYHVwZGF0ZXJgLiBTaW5jZSB0aGUgdXBkYXRlcyBjb21lIGZyb20gYSBub3RpZmllciwgdGhleVxuICogYXJlIGxvc3N5LCBpLmUuLCBvbmNlIGEgbW9yZSByZWNlbnQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkLCBsZXNzIHJlY2VudFxuICogc3RhdGVzIGFyZSBhc3N1bWVkIGlycmVsZXZhbnQgYW5kIGRyb3BwZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IG5vdGlmaWVyUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm9ic2VydmVJdGVyYXRpb24ob2JzZXJ2ZUl0ZXJhdGlvbik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZU5vdGlmaWVyPShub3RpZmllclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT5cbm9ic2VydmVJdGVyYXRpb24oc3Vic2NyaWJlTGF0ZXN0KG5vdGlmaWVyUCksaXRlcmF0aW9uT2JzZXJ2ZXIpOyRo4oCNX29uY2Uub2JzZXJ2ZU5vdGlmaWVyKG9ic2VydmVOb3RpZmllcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciJdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iXSwib2JzZXJ2ZU5vdGlmaWVyIjpbIm9ic2VydmVOb3RpZmllciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACwvi9PHAcAABwHAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi9zdG9yZXN1Yi5qcyIsIi4vc3Vic2NyaWJlLmpzIiwiLi9zdWJzY3JpYmVyLmpzIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi9zdG9yZXN1Yi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vcHVibGlzaC1raXQuanNcIiwgW11dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtdXSxbXCIuL25vdGlmaWVyLmpzXCIsIFtdXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW11dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW11dLFtcIi4vc3RvcmVzdWIuanNcIiwgW11dLFtcIi4vc3RvcmVkLW5vdGlmaWVyLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vcHVibGlzaC1raXQuanMiOltbIm1ha2VQdWJsaXNoS2l0IiwibWFrZVB1Ymxpc2hLaXQiXSxbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLFsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSIsIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSxbIkl0ZXJhYmxlRWFjaFRvcGljSSIsIkl0ZXJhYmxlRWFjaFRvcGljSSJdLFsiSXRlcmFibGVMYXRlc3RUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLFsiU3Vic2NyaWJlclNoYXBlIiwiU3Vic2NyaWJlclNoYXBlIl1dLCIuL3N1YnNjcmliZS5qcyI6W1sic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUVhY2giXSxbInN1YnNjcmliZUxhdGVzdCIsInN1YnNjcmliZUxhdGVzdCJdXSwiLi9ub3RpZmllci5qcyI6W1sibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyIl0sWyJtYWtlTm90aWZpZXJLaXQiLCJtYWtlTm90aWZpZXJLaXQiXSxbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXSxbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXV0sIi4vc3Vic2NyaWJlci5qcyI6W1sibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb24iXSxbIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il1dLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjpbWyJvYnNlcnZlTm90aWZpZXIiLCJvYnNlcnZlTm90aWZpZXIiXSxbIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVJdGVyYXRvciJdLFsib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRpb24iXSxbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPKwCGVaGAAAWhgAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvbm90aWZpZXIuanN7ImltcG9ydHMiOlsiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxFLEZhcixtYWtlUHVibGlzaEtpdCxzdWJzY3JpYmVMYXRlc3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gc2hhcmFibGVJbnRlcm5hbHNQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXI9KHNoYXJhYmxlSW50ZXJuYWxzUCk9Pntcbi8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5zdWJzY3JpYmVMYXRlc3Qoc2hhcmFibGVJbnRlcm5hbHNQKSxcbmdldFVwZGF0ZVNpbmNlOmFzeW5jKHVwZGF0ZUNvdW50KT0+XG5FKHNoYXJhYmxlSW50ZXJuYWxzUCkuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBOb3RpZmllciBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgTm90aWZpZXIgdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZU5vdGlmaWVyYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIE5vdGlmaWVyIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczphc3luYygpPT5zaGFyYWJsZUludGVybmFsc1AsXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBVc2VkIG9ubHkgYnkgYG1ha2VDYXN0aW5nU3BlY0Zyb21SZWZgLiAgSW5zdGVhZCB0aGF0IGZ1bmN0aW9uIHNob3VsZCB1c2VcbiAqIHRoZSBgU3RvcmVkRmFjZXRgIEFQSS5cbiAqL1xuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7bm90aWZpZXJ9KX0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VOb3RpZmllcihtYWtlTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyPShzdWJzY3JpYmVyKT0+e1xuLyoqXG4gKiBAdHlwZSB7TGF0ZXN0VG9waWM8VD59XG4gKi9cbmNvbnN0IGJhc2VOb3RpZmllcj1oYXJkZW4oe1xuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50PXVuZGVmaW5lZCk9PlxuRShzdWJzY3JpYmVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCl9KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXJ9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuXG4vKipcbiAqIFByb2R1Y2VzIGEgcGFpciBvZiBvYmplY3RzLCB3aGljaCBhbGxvdyBhIHNlcnZpY2UgdG8gcHJvZHVjZSBhIHN0cmVhbSBvZlxuICogdXBkYXRlIHByb21pc2VzLlxuICpcbiAqIFRoZSBpbml0aWFsIHN0YXRlIGFyZ3VtZW50IGhhcyB0byBiZSB0cnVseSBvcHRpb25hbCBldmVuIHRob3VnaCBpdCBjYW5cbiAqIGJlIGFueSBmaXJzdCBjbGFzcyB2YWx1ZSBpbmNsdWRpbmcgYHVuZGVmaW5lZGAuIFdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gKiBwcmVzZW5jZSB2cyB0aGUgYWJzZW5jZSBvZiBpdCwgd2hpY2ggd2UgY2Fubm90IGRvIHdpdGggdGhlIG9wdGlvbmFsIGFyZ3VtZW50XG4gKiBzeW50YXguIFJhdGhlciB3ZSB1c2UgdGhlIGFyaXR5IG9mIHRoZSBgaW5pdGlhbFN0YXRlQXJyYCBhcnJheS5cbiAqXG4gKiBJZiBubyBpbml0aWFsIHN0YXRlIGlzIHByb3ZpZGVkIHRvIGBtYWtlTm90aWZpZXJLaXRgLCB0aGVuIGl0IHN0YXJ0cyB3aXRob3V0XG4gKiBhbiBpbml0aWFsIHN0YXRlLiBJdHMgaW5pdGlhbCBzdGF0ZSB3aWxsIGluc3RlYWQgYmUgdGhlIHN0YXRlIG9mIHRoZSBmaXJzdFxuICogdXBkYXRlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tdIHwgW1RdfSBpbml0aWFsU3RhdGVBcnIgdGhlIGZpcnN0IHN0YXRlIHRvIGJlIHJldHVybmVkICh0eXBlZCBhcyByZXN0IGFycmF5IHRvIHBlcm1pdCBgdW5kZWZpbmVkYClcbiAqIEByZXR1cm5zIHtOb3RpZmllclJlY29yZDxUPn0gdGhlIG5vdGlmaWVyIGFuZCB1cGRhdGVyXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJLaXQ9KC4uLmluaXRpYWxTdGF0ZUFycik9Pntcbi8qKiBAdHlwZSB7UHVibGlzaEtpdDxUPn0gKi9cbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5jb25zdCBub3RpZmllcj1tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihzdWJzY3JpYmVyKTtcblxuY29uc3QgdXBkYXRlcj1GYXIoJ3VwZGF0ZXInLHtcbnVwZGF0ZVN0YXRlOihzdGF0ZSk9PnB1Ymxpc2hlci5wdWJsaXNoKHN0YXRlKSxcbmZpbmlzaDooY29tcGxldGlvbik9PnB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG5mYWlsOihyZWFzb24pPT5wdWJsaXNoZXIuZmFpbChyZWFzb24pfSk7XG5cblxuYXNzZXJ0KGluaXRpYWxTdGF0ZUFyci5sZW5ndGg8PTEsJ3RvbyBtYW55IGFyZ3VtZW50cycpO1xuaWYoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aD09PTEpe1xudXBkYXRlci51cGRhdGVTdGF0ZShpbml0aWFsU3RhdGVBcnJbMF0pO1xuIH1cblxuLyogbm90aWZpZXIgZmFjZXQgaXMgc2VwYXJhdGUgc28gaXQgY2FuIGJlIGhhbmRlZCBvdXQgd2hpbGUgdXBkYXRlciovXG4vKiBpcyB0aWdodGx5IGhlbGQqL1xucmV0dXJuIGhhcmRlbih7bm90aWZpZXIsdXBkYXRlcn0pO1xuIH07XG5cbi8qKlxuICogQWRhcHRvciBmcm9tIGFzeW5jIGl0ZXJhYmxlIHRvIG5vdGlmaWVyLlxuICpcbiAqIEBkZXByZWNhdGVkIFRoZSByZXN1bHRpbmcgbm90aWZpZXIgaXMgbG9zc2xlc3MsIHdoaWNoIGlzIG5vdCBkZXNpcmFibGUuXG4gKiBQcmVmZXIgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIsIGFuZCByZWZlciB0b1xuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy81NDEzIGFuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTY5NSBmb3IgY29udGV4dC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovJGjigI1fb25jZS5tYWtlTm90aWZpZXJLaXQobWFrZU5vdGlmaWVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZT0oYXN5bmNJdGVyYWJsZVApPT57XG5jb25zdCBpdGVyYXRvclA9RShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbi8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBvcHROZXh0UHJvbWlzZTtcbmxldCBjdXJyZW50VXBkYXRlQ291bnQ9MG47XG4vKiogQHR5cGUge0VSZWY8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG5sZXQgY3VycmVudFJlc3BvbnNlO1xubGV0IGZpbmFsPWZhbHNlO1xuXG4vKipcbiAqIEB0eXBlIHtMYXRlc3RUb3BpYzxUPn1cbiAqL1xuY29uc3QgYmFzZU5vdGlmaWVyPUZhcignYmFzZU5vdGlmaWVyJyx7XG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudD0tMW4pe1xuaWYodXBkYXRlQ291bnQ8Y3VycmVudFVwZGF0ZUNvdW50KXtcbmlmKGN1cnJlbnRSZXNwb25zZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuIH1lbHNlIGlmKHVwZGF0ZUNvdW50IT09Y3VycmVudFVwZGF0ZUNvdW50KXtcbnRocm93IEVycm9yKFxuJ2dldFVwZGF0ZVNpbmNlIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCB1cGRhdGVDb3VudC4nKTtcblxuIH1cblxuLyogUmV0dXJuIGEgZmluYWwgcmVzcG9uc2UgaWYgd2UgaGF2ZSBvbmUsIG90aGVyd2lzZSBhIHByb21pc2UgZm9yIHRoZSBuZXh0IHN0YXRlLiovXG5pZihmaW5hbCl7XG5hc3NlcnQoY3VycmVudFJlc3BvbnNlIT09dW5kZWZpbmVkKTtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG5pZighb3B0TmV4dFByb21pc2Upe1xuY29uc3QgbmV4dEl0ZXJSZXN1bHRQPUUoaXRlcmF0b3JQKS5uZXh0KCk7XG5vcHROZXh0UHJvbWlzZT1FLndoZW4oXG5uZXh0SXRlclJlc3VsdFAsXG4oe2RvbmUsdmFsdWV9KT0+e1xuYXNzZXJ0KCFmaW5hbCk7XG5pZihkb25lKXtcbmZpbmFsPXRydWU7XG4gfVxuY3VycmVudFVwZGF0ZUNvdW50Kz0xbjtcbmN1cnJlbnRSZXNwb25zZT1oYXJkZW4oe1xudmFsdWUsXG51cGRhdGVDb3VudDpkb25lP3VuZGVmaW5lZDpjdXJyZW50VXBkYXRlQ291bnR9KTtcblxub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9LFxuKF9yZWFzb24pPT57XG5maW5hbD10cnVlO1xuY3VycmVudFJlc3BvbnNlPVxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59ICovXG5uZXh0SXRlclJlc3VsdFA7XG5vcHROZXh0UHJvbWlzZT11bmRlZmluZWQ7XG5yZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuIH0pO1xuXG4gfVxucmV0dXJuIG9wdE5leHRQcm9taXNlO1xuIH19KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLyogRG9uJ3QgbGVhayB0aGUgb3JpZ2luYWwgYXN5bmNJdGVyYWJsZVAgc2luY2UgaXQgbWF5IGJlIHJlbW90ZSBhbmQgd2UgYWxzbyovXG4vKiB3YW50IHRoZSBzYW1lIHNlbWFudGljcyBmb3IgdGhpcyBleHBvc2VkIGl0ZXJhYmxlIGFuZCB0aGUgYmFzZU5vdGlmaWVyLiovXG4uLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcn0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU5vdGlmaWVyIjpbIm1ha2VOb3RpZmllciJdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdLCJtYWtlTm90aWZpZXJLaXQiOlsibWFrZU5vdGlmaWVyS2l0Il0sIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIjpbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFZ/h0h+OAAAfjgAACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvcHVibGlzaC1raXQuanN7ImltcG9ydHMiOlsiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9mYXIiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSIsIlB1Ymxpc2hlckkiLCJTdWJzY3JpYmVySSIsIlN1YnNjcmliZXJTaGFwZSIsIlVwZGF0ZUNvdW50U2hhcGUiLCJtYWtlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInB1Ymxpc2hLaXRJS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VQcm9taXNlS2l0LEUsRmFyLE0sY2FuQmVEdXJhYmxlLHByZXBhcmVFeG9DbGFzc0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIiwgWyRo4oCNX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBzaW5rPSgpPT57IH07XG5jb25zdCBtYWtlUXVpZXRSZWplY3Rpb249KHJlYXNvbik9PntcbmNvbnN0IHJlamVjdGlvbj1oYXJkZW4oUHJvbWlzZS5yZWplY3QocmVhc29uKSk7XG52b2lkIEUud2hlbihyZWplY3Rpb24sc2luayxzaW5rKTtcbnJldHVybiByZWplY3Rpb247XG4gfTtcbmNvbnN0IHRvb0ZhclJlamVjdGlvbj1tYWtlUXVpZXRSZWplY3Rpb24oXG5oYXJkZW4obmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwYXN0IGVuZCBvZiBpdGVyYXRpb24uJykpKTtcblxuXG5jb25zdCAgICAgICAgUHVibGlzaGVyST1NLmludGVyZmFjZSgnUHVibGlzaGVyJyx7XG5wdWJsaXNoOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5maW5pc2g6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWw6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKX0pO1xuXG5cbi8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIE5vdGlmaWVyIGBnZXRVcGRhdGVTaW5jZWAuKi8kaOKAjV9vbmNlLlB1Ymxpc2hlckkoUHVibGlzaGVySSk7XG5jb25zdCAgICAgICAgVXBkYXRlQ291bnRTaGFwZT1NLm9yKE0uYmlnaW50KCksTS5udW1iZXIoKSk7JGjigI1fb25jZS5VcGRhdGVDb3VudFNoYXBlKFVwZGF0ZUNvdW50U2hhcGUpO1xuY29uc3QgICAgICAgIFN1YnNjcmliZXJJPU0uaW50ZXJmYWNlKCdTdWJzY3JpYmVyJyx7XG5zdWJzY3JpYmVBZnRlcjpNLmNhbGwoKS5vcHRpb25hbChNLmJpZ2ludCgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldFVwZGF0ZVNpbmNlOk0uY2FsbCgpLm9wdGlvbmFsKFVwZGF0ZUNvdW50U2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7JGjigI1fb25jZS5TdWJzY3JpYmVySShTdWJzY3JpYmVySSk7XG5cbmNvbnN0ICAgICAgICBwdWJsaXNoS2l0SUtpdD1oYXJkZW4oe1xucHVibGlzaGVyOlB1Ymxpc2hlckksXG5zdWJzY3JpYmVyOlN1YnNjcmliZXJJfSk7JGjigI1fb25jZS5wdWJsaXNoS2l0SUtpdChwdWJsaXNoS2l0SUtpdCk7XG5cblxuY29uc3QgICAgICAgIEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGU9TS5pbnRlcmZhY2UoXG4nRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InLFxue1xuZm9yazpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLC8qIG9vcHM6IHJlY3Vyc2l2ZSB0eXBlKi9cbm5leHQ6TS5jYWxsV2hlbigpLnJldHVybnMoTS5hbnkoKSl9KTskaOKAjV9vbmNlLkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUoRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSk7XG5cblxuXG5jb25zdCAgICAgICAgSXRlcmFibGVFYWNoVG9waWNJPU0uaW50ZXJmYWNlKCdJdGVyYWJsZUVhY2hUb3BpYycse1xuc3Vic2NyaWJlQWZ0ZXI6U3Vic2NyaWJlckkubWV0aG9kR3VhcmRzLnN1YnNjcmliZUFmdGVyLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJykpfSk7JGjigI1fb25jZS5JdGVyYWJsZUVhY2hUb3BpY0koSXRlcmFibGVFYWNoVG9waWNJKTtcblxuXG5cbmNvbnN0ICAgICAgICBJdGVyYWJsZUxhdGVzdFRvcGljST1NLmludGVyZmFjZSgnSXRlcmFibGVMYXRlc3RUb3BpYycse1xuZ2V0VXBkYXRlU2luY2U6U3Vic2NyaWJlckkubWV0aG9kR3VhcmRzLmdldFVwZGF0ZVNpbmNlLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJykpfSk7XG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBBcmdcbiAqIEB0ZW1wbGF0ZSBSZXRcbiAqIEBwYXJhbSB7KGFyZzogQXJnKSA9PiBSZXR9IGZuXG4gKiBAcmV0dXJucyB7KGFyZzogQXJnKSA9PiBSZXR9XG4gKi8kaOKAjV9vbmNlLkl0ZXJhYmxlTGF0ZXN0VG9waWNJKEl0ZXJhYmxlTGF0ZXN0VG9waWNJKTtcbmNvbnN0IHdlYWtNZW1vaXplVW5hcnk9KGZuKT0+e1xuY29uc3QgY2FjaGU9bmV3IFdlYWtNYXAoKTtcbnJldHVybihhcmcpPT57XG4vKiogQHR5cGUge29iamVjdH0gKi9cbmNvbnN0IG9hcmc9YXJnO1xuaWYoY2FjaGUuaGFzKG9hcmcpKXtcbnJldHVybiBjYWNoZS5nZXQob2FyZyk7XG4gfVxuY29uc3QgcmVzdWx0PWZuKGFyZyk7XG5jYWNoZS5zZXQob2FyZyxyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UHVibGljYXRpb25SZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge1VwZGF0ZVJlY29yZDxUPn1cbiAqL1xuY29uc3QgbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZD0ocmVjb3JkKT0+e1xuY29uc3R7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudH09XG5yZWNvcmQ7XG5pZihkb25lKXtcbi8qIEZpbmFsIHJlc3VsdHMgaGF2ZSB1bmRlZmluZWQgdXBkYXRlQ291bnQuKi9cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OnVuZGVmaW5lZH0pO1xuIH1cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OnB1Ymxpc2hDb3VudH0pO1xuIH07XG5cbi8qKlxuICogTWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQdWJsaXNoS2l0PFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVB1Ymxpc2hLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7UHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59ICovXG5sZXQgdGFpbFA7XG4vKiogQHR5cGUge3VuZGVmaW5lZCB8ICgodmFsdWU6IEVSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+KSA9PiB2b2lkKX0gKi9cbmxldCB0YWlsUjtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcblxubGV0IGN1cnJlbnRQdWJsaXNoQ291bnQ9MG47XG5sZXQgY3VycmVudFA9dGFpbFA7XG5jb25zdCBhZHZhbmNlQ3VycmVudD0oZG9uZSx2YWx1ZSxyZWplY3Rpb24pPT57XG5pZih0YWlsUj09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbmN1cnJlbnRQdWJsaXNoQ291bnQrPTFuO1xuY3VycmVudFA9dGFpbFA7XG5jb25zdCByZXNvbHZlQ3VycmVudD10YWlsUjtcblxuaWYoZG9uZSl7XG50YWlsUD10b29GYXJSZWplY3Rpb247XG50YWlsUj11bmRlZmluZWQ7XG4gfWVsc2V7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG4gfVxuXG5pZihyZWplY3Rpb24pe1xucmVzb2x2ZUN1cnJlbnQocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbnJlc29sdmVDdXJyZW50KFxuaGFyZGVuKHtcbmhlYWQ6e3ZhbHVlLGRvbmV9LFxucHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG4gfTtcblxuY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkPXdlYWtNZW1vaXplVW5hcnkoXG5tYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkKTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7U3Vic2NyaWJlcjxUPn1cbiAqL1xuY29uc3Qgc3Vic2NyaWJlcj1GYXIoJ1N1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQ9LTFuKT0+e1xuYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsJ2JpZ2ludCcpO1xuaWYocHVibGlzaENvdW50PT09Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gdGFpbFA7XG4gfWVsc2UgaWYocHVibGlzaENvdW50PGN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1lbHNle1xudGhyb3cgRXJyb3IoXG4nc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nKTtcblxuIH1cbiB9LFxuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+e1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gfVxudXBkYXRlQ291bnQ9QmlnSW50KHVwZGF0ZUNvdW50KTtcbnJldHVybihcbnN1YnNjcmliZXJcbi8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4vKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuLyogc2FtZSBjcmFuay4uLiovLlxuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4vKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbi8qIGZ1cnRoZXIgb25lcy4qLy5cbnRoZW4oKCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSkpO1xuXG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7UHVibGlzaGVyPFQ+fSAqL1xuY29uc3QgcHVibGlzaGVyPUZhcignUHVibGlzaGVyJyx7XG5wdWJsaXNoOih2YWx1ZSk9PntcbmFkdmFuY2VDdXJyZW50KGZhbHNlLHZhbHVlKTtcbiB9LFxuZmluaXNoOihmaW5hbFZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSxmaW5hbFZhbHVlKTtcbiB9LFxuZmFpbDoocmVhc29uKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSx1bmRlZmluZWQsbWFrZVF1aWV0UmVqZWN0aW9uKHJlYXNvbikpO1xuIH19KTtcblxucmV0dXJuIGhhcmRlbih7cHVibGlzaGVyLHN1YnNjcmliZXJ9KTtcbiB9OyRo4oCNX29uY2UubWFrZVB1Ymxpc2hLaXQobWFrZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VQdWJsaXNoS2l0KTtcblxuY29uc3QgRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlPWhhcmRlbih7XG52YWx1ZUR1cmFiaWxpdHk6TS5hbnkoKSxcbnB1Ymxpc2hDb3VudDpNLmFueSgpLFxuc3RhdHVzOk0uYW55KCksXG5oYXNWYWx1ZTpNLmFueSgpLFxudmFsdWU6TS5hbnkoKX0pO1xuXG5cbi8qIFRPRE86IE1vdmUgZHVyYWJsZSBwdWJsaXNoIGtpdCB0byBhIG5ldyBmaWxlPyovXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eSAmICdtYW5kYXRvcnknfSBbb3B0aW9ucy52YWx1ZUR1cmFiaWxpdHk9J21hbmRhdG9yeSddXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX1cbiAqL1xuY29uc3QgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGU9KG9wdGlvbnM9e30pPT57XG5jb25zdHt2YWx1ZUR1cmFiaWxpdHk9J21hbmRhdG9yeSd9PW9wdGlvbnM7XG5hc3NlcnQuZXF1YWwodmFsdWVEdXJhYmlsaXR5LCdtYW5kYXRvcnknKTtcbnJldHVybntcbi8qIGNvbmZpZ3VyYXRpb24qL1xudmFsdWVEdXJhYmlsaXR5LFxuXG4vKiBsaWZlY3ljbGUgcHJvZ3Jlc3MqL1xucHVibGlzaENvdW50OjBuLFxuc3RhdHVzOidsaXZlJywvKiB8ICdmaW5pc2hlZCcgfCAnZmFpbGVkJyovXG5cbi8qIHBlcnNpc3RlZCByZXN1bHQgZGF0YSovXG4vKiBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gbm9uLXRlcm1pbmFsIHZhbHVlcyBmcm9tIGBwdWJsaXNoYCwqL1xuLyogdmFsdWUgYWxzbyBob2xkcyB0aGUgdGVybWluYWwgdmFsdWUgZnJvbSBgZmluaXNoYCBvciBgZmFpbGAuKi9cbmhhc1ZhbHVlOmZhbHNlLFxudmFsdWU6dW5kZWZpbmVkfTtcblxuIH07XG5cbi8qIFdlIG5lZWQgdGhlIFdlYWtNYXAga2V5IGZvciBhIGtpdCB0byBiZSBhIHZyZWYtYmVhcmluZyBvYmplY3QqL1xuLyogaW4gaXRzIGNvaG9ydCwgYW5kIGhhdmUgYXJiaXRyYXJpbHkgY2hvc2VuIHRoZSBwdWJsaXNoZXIgZmFjZXQuKi9cbi8qKiBAdHlwZWRlZiB7UHVibGlzaGVyPCo+fSBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleSAqL1xuLyoqXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5fVxuICovXG5jb25zdCBnZXRFcGhlbWVyYWxLZXk9KGZhY2V0cyk9PmZhY2V0cy5wdWJsaXNoZXI7XG5cbi8qKlxuICogQHR5cGVkZWYgRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhXG4gKiBAcHJvcGVydHkge1Byb21pc2U8Kj4gfCB1bmRlZmluZWR9IGN1cnJlbnRQIFRoZSBjdXJyZW50LXJlc3VsdCBwcm9taXNlXG4gKiAgICh1bmRlZmluZWQgdW5sZXNzIHJlc29sdmVkIHdpdGggdW5yZWNvdmVyYWJsZSBlcGhlbWVyYWwgZGF0YSlcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTwqPn0gdGFpbFAgVGhlIG5leHQtcmVzdWx0IHByb21pc2VcbiAqIEBwcm9wZXJ0eSB7KCh2YWx1ZTogYW55KSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gdGFpbFIgVGhlIG5leHQtcmVzdWx0IHJlc29sdmVyXG4gKiAgICh1bmRlZmluZWQgd2hlbiB0aGUgcHVibGlzaCBraXQgaGFzIHRlcm1pbmF0ZWQpXG4gKi9cblxuLyoqIEB0eXBlIHtXZWFrTWFwPER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5LCBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE+fSAqL1xuY29uc3QgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudC1yZXN1bHQgcHJvbWlzZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBkdXJhYmxlXG4gKiBwdWJsaXNoIGtpdCwgcmVjcmVhdGVkIHVubGVzcyB3ZSBhbHJlYWR5IGhhdmUgb25lIHdpdGggcmV0YWluZWRcbiAqIGVwaGVtZXJhbCBkYXRhLlxuICpcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcGFyYW0ge1Byb21pc2U8Kj59IHRhaWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICovXG5jb25zdCBwcm92aWRlQ3VycmVudFA9KHN0YXRlLGZhY2V0cyx0YWlsKT0+e1xuY29uc3QgZXBoZW1lcmFsS2V5PWdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuY29uc3QgZm91bmREYXRhPWR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbmNvbnN0IGN1cnJlbnRQPWZvdW5kRGF0YSYmZm91bmREYXRhLmN1cnJlbnRQO1xuaWYoY3VycmVudFApe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1cblxuY29uc3R7cHVibGlzaENvdW50LHN0YXR1cyxoYXNWYWx1ZSx2YWx1ZX09c3RhdGU7XG5pZighaGFzVmFsdWUpe1xuYXNzZXJ0KHN0YXR1cz09PSdsaXZlJyk7XG5yZXR1cm4gdGFpbDtcbiB9XG5pZihzdGF0dXM9PT0nbGl2ZSd8fHN0YXR1cz09PSdmaW5pc2hlZCcpe1xuY29uc3QgY2VsbD1oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZTpzdGF0dXMhPT0nbGl2ZSd9LFxucHVibGlzaENvdW50LFxudGFpbH0pO1xuXG5yZXR1cm4gRS5yZXNvbHZlKGNlbGwpO1xuIH1lbHNlIGlmKHN0YXR1cz09PSdmYWlsZWQnKXtcbnJldHVybiBtYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xuIH1lbHNle1xudGhyb3cgRmFpbCBgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiB9XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuZXh0LXJlc3VsdCBwcm9taXNlIGFuZCByZXNvbHZlciBhc3NvY2lhdGVkIHdpdGggYSBnaXZlblxuICogZHVyYWJsZSBwdWJsaXNoIGtpdC5cbiAqIFRoZXNlIGFyZSBsb3N0IG9uIHVwZ3JhZGUgYnV0IHJlY3JlYXRlZCBvbi1kZW1hbmQsIHByZXNlcnZpbmcgdGhlXG4gKiB2YWx1ZSBpbiAoYnV0IG5vdCB0aGUgaWRlbnRpdHkgb2YpIHRoZSBjdXJyZW50IHsgdmFsdWUsIGRvbmUgfSByZXN1bHRcbiAqIHdoZW4gcG9zc2libGUsIHdoaWNoIGlzIGFsd2F5cyB0aGUgY2FzZSB3aGVuIHRoYXQgdmFsdWUgaXMgdGVybWluYWxcbiAqIChpLmUuLCBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYCkgb3Igd2hlbiB0aGUgZHVyYWJsZSBwdWJsaXNoIGtpdCBpc1xuICogY29uZmlndXJlZCB3aXRoIGB2YWx1ZUR1cmFiaWxpdHk6ICdtYW5kYXRvcnknYC5cbiAqXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9IHN0YXRlXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YX1cbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YT0oc3RhdGUsZmFjZXRzKT0+e1xuY29uc3QgZXBoZW1lcmFsS2V5PWdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuY29uc3QgZm91bmREYXRhPWR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbmlmKGZvdW5kRGF0YSl7XG5yZXR1cm4gZm91bmREYXRhO1xuIH1cblxuY29uc3R7c3RhdHVzfT1zdGF0ZTtcbmxldCB0YWlsUDtcbmxldCB0YWlsUjtcbmlmKHN0YXR1cz09PSdsaXZlJyl7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG52b2lkIEUud2hlbih0YWlsUCxzaW5rLHNpbmspO1xuIH1lbHNlIGlmKHN0YXR1cz09PSdmaW5pc2hlZCd8fHN0YXR1cz09PSdmYWlsZWQnKXtcbnRhaWxQPXRvb0ZhclJlamVjdGlvbjtcbiB9ZWxzZXtcbnRocm93IEZhaWwgYEludmFsaWQgZHVyYWJsZSBwcm9taXNlIGtpdCBzdGF0dXM6ICR7cShzdGF0dXMpfWA7XG4gfVxuLyogY3VycmVudFAgaXMgbm90IGVwaGVtZXJhbCB3aGVuIHJlc3RvcmluZyBmcm9tIHBlcnNpc3RlZCBzdGF0ZS4qL1xuY29uc3Qgb2JqPWhhcmRlbih7Y3VycmVudFA6dW5kZWZpbmVkLHRhaWxQLHRhaWxSfSk7XG5kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KGVwaGVtZXJhbEtleSxvYmopO1xucmV0dXJuIG9iajtcbiB9O1xuXG4vKipcbiAqIEV4dGVuZHMgdGhlIHNlcXVlbmNlIG9mIHJlc3VsdHMuXG4gKlxuICogQHBhcmFtIHt7c3RhdGU6IER1cmFibGVQdWJsaXNoS2l0U3RhdGUsIGZhY2V0czogUHVibGlzaEtpdDwqPn19IGNvbnRleHRcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlWydzdGF0dXMnXX0gW3RhcmdldFN0YXR1c11cbiAqL1xuY29uc3QgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0PShjb250ZXh0LHZhbHVlLHRhcmdldFN0YXR1cz0nbGl2ZScpPT57XG5jb25zdHtzdGF0ZSxmYWNldHN9PWNvbnRleHQ7XG5jb25zdHt2YWx1ZUR1cmFiaWxpdHksc3RhdHVzfT1zdGF0ZTtcbmlmKHN0YXR1cyE9PSdsaXZlJyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5jb25zdCBkb25lPXRhcmdldFN0YXR1cyE9PSdsaXZlJztcbmlmKGRvbmV8fHZhbHVlRHVyYWJpbGl0eT09PSdtYW5kYXRvcnknKXtcbmNhbkJlRHVyYWJsZSh2YWx1ZSl8fEZhaWwgYENhbm5vdCBhY2NlcHQgbm9uLWR1cmFibGUgdmFsdWU6ICR7dmFsdWV9YDtcbiB9XG5jb25zdHt0YWlsUDpvbGRUYWlsUCx0YWlsUjpyZXNvbHZlT2xkVGFpbH09XG5wcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKHN0YXRlLGZhY2V0cyk7XG5hc3NlcnQudHlwZW9mKHJlc29sdmVPbGRUYWlsLCdmdW5jdGlvbicpO1xuXG5jb25zdCBwdWJsaXNoQ291bnQ9c3RhdGUucHVibGlzaENvdW50KzFuO1xuc3RhdGUucHVibGlzaENvdW50PXB1Ymxpc2hDb3VudDtcblxubGV0IHRhaWxQO1xubGV0IHRhaWxSO1xuaWYoZG9uZSl7XG5zdGF0ZS5zdGF0dXM9dGFyZ2V0U3RhdHVzO1xudGFpbFA9dG9vRmFyUmVqZWN0aW9uO1xudGFpbFI9dW5kZWZpbmVkO1xuIH1lbHNle1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xudm9pZCBFLndoZW4odGFpbFAsc2luayxzaW5rKTtcbiB9XG5cbmxldCBjdXJyZW50UDtcbmlmKHRhcmdldFN0YXR1cz09PSdmYWlsZWQnKXtcbnN0YXRlLmhhc1ZhbHVlPXRydWU7XG5zdGF0ZS52YWx1ZT12YWx1ZTtcbmNvbnN0IHJlamVjdGlvbj1tYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xucmVzb2x2ZU9sZFRhaWwocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbi8qIFBlcnNpc3QgYSB0ZXJtaW5hbCB2YWx1ZSwgb3IgYSBub24tdGVybWluYWwgdmFsdWUqL1xuLyogaWYgY29uZmlndXJlZCBhcyAnbWFuZGF0b3J5JyBvciAnb3Bwb3J0dW5pc3RpYycuKi9cbmlmKGRvbmV8fHZhbHVlRHVyYWJpbGl0eSE9PSdpZ25vcmVkJyYmY2FuQmVEdXJhYmxlKHZhbHVlKSl7XG5zdGF0ZS5oYXNWYWx1ZT10cnVlO1xuc3RhdGUudmFsdWU9dmFsdWU7XG4gfWVsc2V7XG5zdGF0ZS5oYXNWYWx1ZT1mYWxzZTtcbnN0YXRlLnZhbHVlPXVuZGVmaW5lZDtcbi8qIFJldGFpbiBhbnkgcHJvbWlzZSB3aXRoIG5vbi1kdXJhYmxlIHJlc29sdXRpb24uKi9cbmN1cnJlbnRQPW9sZFRhaWxQO1xuIH1cblxucmVzb2x2ZU9sZFRhaWwoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG5cbmR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoXG5nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKSxcbmhhcmRlbih7Y3VycmVudFAsdGFpbFAsdGFpbFJ9KSk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi4vLi4vdmF0LWRhdGEvc3JjL3R5cGVzLmpzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQ9KGJhZ2dhZ2Usa2luZE5hbWUpPT57XG4vKiBUT0RPOiBPbmNlIHdlIHVuaWZ5IHdpdGggbWFrZVB1Ymxpc2hLaXQsIHdlIHdpbGwgdXNlIGEgWm9uZS1jb21wYXRpYmxlIHdlYWsqL1xuLyogbWFwIGZvciBtZW1vaXphdGlvbi4qL1xuY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkPW1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQ7XG5cbi8qKlxuICogQHJldHVybnMgeygpID0+IFB1Ymxpc2hLaXQ8Kj59XG4gKi9cbnJldHVybiBwcmVwYXJlRXhvQ2xhc3NLaXQoXG5iYWdnYWdlLFxua2luZE5hbWUsXG5wdWJsaXNoS2l0SUtpdCxcbmluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlLFxue1xuLyogVGhlIHB1Ymxpc2hlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuLyogYWNjZXB0cyBuZXcgdmFsdWVzLiovXG5wdWJsaXNoZXI6e1xucHVibGlzaCh2YWx1ZSl7XG5hZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcyx2YWx1ZSk7XG4gfSxcbmZpbmlzaChmaW5hbFZhbHVlKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLGZpbmFsVmFsdWUsJ2ZpbmlzaGVkJyk7XG4gfSxcbmZhaWwocmVhc29uKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLHJlYXNvbiwnZmFpbGVkJyk7XG4gfX0sXG5cblxuLyogVGhlIHN1YnNjcmliZXIgZmFjZXQgb2YgYSBkdXJhYmxlIHB1Ymxpc2gga2l0Ki9cbi8qIHByb3BhZ2F0ZXMgdmFsdWVzLiovXG5zdWJzY3JpYmVyOntcbnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudD0tMW4pe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xuY29uc3R7cHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnR9PXN0YXRlO1xuY29uc3R7Y3VycmVudFAsdGFpbFB9PXByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoXG5zdGF0ZSxcbmZhY2V0cyk7XG5cbmlmKHB1Ymxpc2hDb3VudD09PWN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIHRhaWxQO1xuIH1lbHNlIGlmKHB1Ymxpc2hDb3VudDxjdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiBjdXJyZW50UHx8cHJvdmlkZUN1cnJlbnRQKHN0YXRlLGZhY2V0cyx0YWlsUCk7XG4gfWVsc2V7XG50aHJvdyBFcnJvcihcbidzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicpO1xuXG4gfVxuIH0sXG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCl7XG5jb25zdHtcbmZhY2V0czp7c3Vic2NyaWJlcn19PVxudGhpcztcbmlmKHVwZGF0ZUNvdW50PT09dW5kZWZpbmVkKXtcbnJldHVybiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCkudGhlbihtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQpO1xuIH1cbnVwZGF0ZUNvdW50PUJpZ0ludCh1cGRhdGVDb3VudCk7XG5yZXR1cm4oXG5zdWJzY3JpYmVyXG4vKiBgc3Vic2NyaWJlQWZ0ZXJgIG1heSByZXNvbHZlIHdpdGggdGhlIHVwZGF0ZSByZWNvcmQgbnVtYmVyZWQqL1xuLyogYHVwZGF0ZUNvdW50ICsgMWAsIGV2ZW4gaWYgc2V2ZXJhbCB1cGRhdGVzIGFyZSBwdWJsaXNoZWQgaW4gdGhlKi9cbi8qIHNhbWUgY3JhbmsuLi4qLy5cbnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuLyogLi4uIHNvIHdlIHBvbGwgdGhlIGxhdGVzdCBwdWJsaXNoZWQgdXBkYXRlLCB3aXRob3V0IHdhaXRpbmcgZm9yIGFueSovXG4vKiBmdXJ0aGVyIG9uZXMuKi8uXG50aGVuKCgpPT5zdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKCkpKTtcblxuIH19fSxcblxuXG57XG5zdGF0ZVNoYXBlOkR1cmFibGVQdWJsaXNoS2l0U3RhdGVTaGFwZX0pO1xuXG5cbiB9OyRo4oCNX29uY2UucHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5oYXJkZW4ocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcblxuY29uc3QgICAgICAgIFN1YnNjcmliZXJTaGFwZT1NLnJlbW90YWJsZSgnU3Vic2NyaWJlcicpOyRo4oCNX29uY2UuU3Vic2NyaWJlclNoYXBlKFN1YnNjcmliZXJTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHVibGlzaGVySSI6WyJQdWJsaXNoZXJJIl0sIlVwZGF0ZUNvdW50U2hhcGUiOlsiVXBkYXRlQ291bnRTaGFwZSJdLCJTdWJzY3JpYmVySSI6WyJTdWJzY3JpYmVySSJdLCJwdWJsaXNoS2l0SUtpdCI6WyJwdWJsaXNoS2l0SUtpdCJdLCJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSwiSXRlcmFibGVFYWNoVG9waWNJIjpbIkl0ZXJhYmxlRWFjaFRvcGljSSJdLCJJdGVyYWJsZUxhdGVzdFRvcGljSSI6WyJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLCJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCJdLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiOlsicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Il0sIlN1YnNjcmliZXJTaGFwZSI6WyJTdWJzY3JpYmVyU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvgEwJIMKAACDCgAALgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZWQtbm90aWZpZXIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxFLEZhcixvYnNlcnZlTm90aWZpZXI7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsIFskaOKAjV9hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZU5vdGlmaWVyXCIsIFskaOKAjV9hID0+IChvYnNlcnZlTm90aWZpZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD4gJiBPbWl0PFN0b3JlZEZhY2V0LCAnZ2V0U3RvcmVLZXknPn0gU3RvcmVkTm90aWZpZXJcbiAqL1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkTm90aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8VD4+fSBub3RpZmllclxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZE5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZE5vdGlmaWVyPShub3RpZmllcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuYXNzZXJ0QWxsRGVmaW5lZCh7bm90aWZpZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcn0pO1xuXG5jb25zdCBtYXJzaGFsbFRvU3RvcmFnZT1tYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpO1xuXG5vYnNlcnZlTm90aWZpZXIobm90aWZpZXIse1xudXBkYXRlU3RhdGUodmFsdWUpe1xubWFyc2hhbGxUb1N0b3JhZ2UodmFsdWUpLmNhdGNoKChyZWFzb24pPT5cbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byB1cGRhdGVTdGF0ZScscmVhc29uKSk7XG5cbiB9LFxuZmFpbChyZWFzb24pe1xuY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLHJlYXNvbik7XG4gfX0pLlxuY2F0Y2goKHJlYXNvbik9PntcbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGhhbHRlZCBpdGVyYXRpb24nLHJlYXNvbik7XG4gfSk7XG5cbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG5mcm9tQ2FwRGF0YTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSl9KTtcblxuXG4vKiogQHR5cGUge1N0b3JlZE5vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgc3RvcmVkTm90aWZpZXI9RmFyKCdTdG9yZWROb3RpZmllcicse1xuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+RShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuZ2V0UGF0aDooKT0+RShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXJ9KTtcblxucmV0dXJuIHN0b3JlZE5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkTm90aWZpZXIobWFrZVN0b3JlZE5vdGlmaWVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RvcmVkTm90aWZpZXIiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOs+VGqwIgAAsCIAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVzdWIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCIsIm1ha2VTdG9yZWRQdWJsaXNoS2l0IiwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCIsIm1ha2VTdG9yZWRTdWJzY3JpYmVyIiwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixtYWtlTWFyc2hhbCxhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Usb2JzZXJ2ZUl0ZXJhdGlvbixtYWtlUHVibGlzaEtpdCxtYWtlU3Vic2NyaXB0aW9uS2l0LHN1YnNjcmliZUVhY2g7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsIFskaOKAjV9hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjigI1fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVJdGVyYXRpb25cIiwgWyRo4oCNX2EgPT4gKG9ic2VydmVJdGVyYXRpb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVN1YnNjcmlwdGlvbktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogTkI6IGRvZXMgbm90IHlldCBzdXJ2aXZlIHVwZ3JhZGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82ODkzXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHsodjogVCkgPT4gdm9pZH0gY29uc3VtZVZhbHVlXG4gKi9cbmNvbnN0ICAgICAgICBmb3JFYWNoUHVibGljYXRpb25SZWNvcmQ9YXN5bmMoc3Vic2NyaWJlcixjb25zdW1lVmFsdWUpPT57XG4vKiBXZSBvcGVuLWNvZGUgdGhlIGZvci1hd2FpdC1vZiBpbXBsZW1lbnRhdGlvbiByYXRoZXIgdGhhbiB1c2luZyB0aGF0IHN5bnRheCovXG4vKiBkaXJlY3RseSBiZWNhdXNlIHdlIHdhbnQgdG8gcnVuIHRoZSBjb25zdW1lciBvbiB0aGUgZG9uZSB2YWx1ZSBhcyB3ZWxsLiovXG5jb25zdCBpdGVyYXRvcj1zdWJzY3JpYmVFYWNoKHN1YnNjcmliZXIpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG5sZXQgZmluaXNoZWQ9ZmFsc2U7XG53aGlsZSghZmluaXNoZWQpe1xuLyogQWxsb3cgbmVzdGVkIGF3YWl0cyAoaW4gbG9vcCkgYmVjYXVzZSBpdCdzIHNhZmUgZm9yIGVhY2ggdG8gcnVuIGluIGEgdHVybiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcCwgQGplc3NpZS5qcy9uby1uZXN0ZWQtYXdhaXQqL1xuY29uc3R7dmFsdWUsZG9uZX09YXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AsIEBqZXNzaWUuanMvbm8tbmVzdGVkLWF3YWl0Ki9cbmF3YWl0IGNvbnN1bWVWYWx1ZSh2YWx1ZSk7XG5maW5pc2hlZD0hIWRvbmU7XG4gfVxuIH07XG5cbi8qKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIG5vIGZ1cnRoZXIgd3JpdGVzIHRvIGl0IHdpbGxcbiAqIGJlIGF0dGVtcHRlZCAoYnV0IHJlc3VsdHMgd2lsbCByZW1haW4gYXZhaWxhYmxlIGZyb20gdGhlIHN1YnNjcmliZXIpLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpYmVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPFJldHVyblR5cGU8dHlwZW9mIG1ha2VNYXJzaGFsPj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fVxuICovJGjigI1fb25jZS5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkU3Vic2NyaWJlcj0oc3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuYXNzZXJ0QWxsRGVmaW5lZCh7c3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyfSk7XG5cbmNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlPW1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik7XG5cbi8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xuZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKHN1YnNjcmliZXIsbWFyc2hhbGxUb1N0b3JhZ2UpLmNhdGNoKChlcnIpPT57XG4vKiBUT0RPOiBIb3cgc2hvdWxkIHdlIGhhbmRsZSBhbmQvb3Igc3VyZmFjZSB0aGlzIGZhaWx1cmU/Ki9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU3NjYjZGlzY3Vzc2lvbl9yOTIyNDk4MDg4Ki9cbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZFN1YnNjcmliZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLGVycik7XG4gfSk7XG5cbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG5mcm9tQ2FwRGF0YTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSl9KTtcblxuXG4vKiogQHR5cGUge1N0b3JlZFN1YnNjcmliZXI8VD59ICovXG5jb25zdCBzdG9yZXN1Yj1GYXIoJ1N0b3JlZFN1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQpPT5zdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG5nZXRVcGRhdGVTaW5jZToodXBkYXRlQ291bnQpPT5zdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbmdldFBhdGg6KCk9PkUoc3RvcmFnZU5vZGUpLmdldFBhdGgoKSxcbmdldFN0b3JlS2V5OigpPT5FKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpLFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXJ9KTtcblxucmV0dXJuIHN0b3Jlc3ViO1xuIH07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIG1ha2VTdG9yZWRTdWJzY3JpYmVyXG4gKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIHRoZSBpdGVyYXRpb24gd2lsbCBiZSB0ZXJtaW5hdGVkLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaXB0aW9uXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZWY8UmV0dXJuVHlwZTx0eXBlb2YgbWFrZU1hcnNoYWw+Pn0gW21hcnNoYWxsZXJdXG4gKiBAcmV0dXJucyB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fVxuICovJGjigI1fb25jZS5tYWtlU3RvcmVkU3Vic2NyaWJlcihtYWtlU3RvcmVkU3Vic2NyaWJlcik7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFN1YnNjcmlwdGlvbj0oXG5zdWJzY3JpcHRpb24sXG5zdG9yYWdlTm9kZSxcbm1hcnNoYWxsZXI9bWFrZU1hcnNoYWwodW5kZWZpbmVkLHVuZGVmaW5lZCx7XG5tYXJzaGFsU2F2ZUVycm9yOigpPT57IH0sXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidzbWFsbGNhcHMnfSkpPT5cblxue1xuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbmZyb21DYXBEYXRhOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKX0pO1xuXG5cbi8qIEFib3J0IHRoZSBpdGVyYXRpb24gb24gdGhlIG5leHQgb2JzZXJ2YXRpb24gaWYgdGhlIHB1Ymxpc2hlciBldmVyIGZhaWxzLiovXG5sZXQgcHVibGlzaEZhaWxlZD1mYWxzZTtcbmxldCBwdWJsaXNoRXhjZXB0aW9uO1xuXG5jb25zdCBmYWlsPShlcnIpPT57XG5wdWJsaXNoRmFpbGVkPXRydWU7XG5wdWJsaXNoRXhjZXB0aW9uPWVycjtcbiB9O1xuXG4vKiBNdXN0ICpub3QqIGJlIGFuIGFzeW5jIGZ1bmN0aW9uLCBiZWNhdXNlIGl0IHNvbWV0aW1lcyBtdXN0IHRocm93IHRvIGFib3J0Ki9cbi8qIHRoZSBpdGVyYXRpb24uKi9cbmNvbnN0IHB1Ymxpc2hWYWx1ZT0ob2JqKT0+e1xuYXNzZXJ0KHN0b3JhZ2VOb2RlKTtcbmlmKHB1Ymxpc2hGYWlsZWQpe1xuLyogVG8gcHJvcGVybHkgYWJvcnQgdGhlIGl0ZXJhdGlvbiwgdGhpcyBtdXN0IGJlIGEgc3luY2hyb25vdXMgZXhjZXB0aW9uLiovXG50aHJvdyBwdWJsaXNoRXhjZXB0aW9uO1xuIH1cblxuLyogUHVibGlzaCB0aGUgdmFsdWUsIGNhcHR1cmluZyBhbnkgZXJyb3IuKi9cbkUobWFyc2hhbGxlcikuXG50b0NhcERhdGEob2JqKS5cbnRoZW4oKHNlcmlhbGl6ZWQpPT57XG5jb25zdCBlbmNvZGVkPUpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuIH0pLlxuY2F0Y2goZmFpbCk7XG4gfTtcblxuaWYoc3RvcmFnZU5vZGUpe1xuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5vYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmlwdGlvbix7XG51cGRhdGVTdGF0ZTpwdWJsaXNoVmFsdWUsXG5maW5pc2g6cHVibGlzaFZhbHVlfSkuXG5jYXRjaChmYWlsKTtcbiB9XG5cbi8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpcHRpb24nLHtcbi8qIEB0cy1leHBlY3QtZXJyb3IgZ2V0U3RvcmVLZXkgdHlwZSBkb2VzIG5vdCBoYXZlIGBzdWJzY3JpcHRpb25gKi9cbmdldFN0b3JlS2V5OmFzeW5jKCk9PntcbmlmKCFzdG9yYWdlTm9kZSl7XG5yZXR1cm4gaGFyZGVuKHtzdWJzY3JpcHRpb259KTtcbiB9XG5jb25zdCBzdG9yZUtleT1hd2FpdCBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpO1xucmV0dXJuIGhhcmRlbih7Li4uc3RvcmVLZXksc3Vic2NyaXB0aW9ufSk7XG4gfSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyLFxuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6KCk9Plxuc3Vic2NyaXB0aW9uLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCksXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zdWJzY3JpcHRpb25bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCksXG5zdWJzY3JpYmVBZnRlcjoocHVibGlzaENvdW50KT0+c3Vic2NyaXB0aW9uLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCl9KTtcblxucmV0dXJuIHN0b3Jlc3ViO1xuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBTdG9yZWRQdWJsaXNoS2l0XG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaGVyS2l0XG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaWJlclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGlzaGVyXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbmNvbXBhdGlibGUgd2l0aCBkdXJhYmlsaXR5OyBpbnN0ZWFkIGhhbmRsZSB2c3RvcmFnZSBlcGhlbWVyYWxseSBvbiBhIGR1cmFibGUgUHVibGlzaEtpdFxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBbbWFyc2hhbGxlcl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hpbGRQYXRoXVxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hlcktpdDxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQ9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIsY2hpbGRQYXRoKT0+e1xuY29uc3R7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufT1tYWtlU3Vic2NyaXB0aW9uS2l0KCk7XG5cbmlmKHN0b3JhZ2VOb2RlJiZjaGlsZFBhdGgpe1xuc3RvcmFnZU5vZGU9RShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZFBhdGgpO1xuIH1cblxuLyogd3JhcCB0aGUgc3Vic2NyaXB0aW9uIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSwgcmVwZWF0aW5nIHRvIHRoaXMgYHN1YnNjcmliZXJgKi9cbmNvbnN0IHN1YnNjcmliZXI9bWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcik7XG5cblxucmV0dXJue1xucHVibGlzaGVyOnB1YmxpY2F0aW9uLFxuc3Vic2NyaWJlcn07XG5cbiB9O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIGluY29tcGF0aWJsZSB3aXRoIGR1cmFiaWxpdHk7IGluc3RlYWQgaGFuZGxlIHZzdG9yYWdlIGVwaGVtZXJhbGx5IG9uIGEgZHVyYWJsZSBQdWJsaXNoS2l0XG4gKlxuICogTGlrZSBtYWtlUHVibGlzaEtpdCB0aGlzIG1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIFdoYXQncyBkaWZmZXJlbnQgaXMgYHN1YnNjcmliZXJgIHRlZXMgcmVjb3Jkcywgd3JpdGluZyBvdXQgdG8gc3RvcmFnZU5vZGUuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaEtpdDxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hlcktpdChtYWtlU3RvcmVkUHVibGlzaGVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkUHVibGlzaEtpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5yZXR1cm57XG5wdWJsaXNoZXIsXG4vKiB3cmFwIHRoZSBzdWJzY3JpYmVyIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSovXG5zdWJzY3JpYmVyOm1ha2VTdG9yZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcil9O1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWRQdWJsaXNoS2l0KG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCJdLCJtYWtlU3RvcmVkU3Vic2NyaWJlciI6WyJtYWtlU3RvcmVkU3Vic2NyaWJlciJdLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIjpbIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCI6WyJtYWtlU3RvcmVkUHVibGlzaGVyS2l0Il0sIm1ha2VTdG9yZWRQdWJsaXNoS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHVi4yhuJAAAbiQAACgAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbInN1YnNjcmliZSIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsaXNPYmplY3QsaXNVcGdyYWRlRGlzY29ubmVjdGlvbjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qc1wiLCBbW1wiaXNVcGdyYWRlRGlzY29ubmVjdGlvblwiLCBbJGjigI1fYSA9PiAoaXNVcGdyYWRlRGlzY29ubmVjdGlvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcbmNvbnN0IHNpbms9KCk9PnsgfTtcblxuLyoqXG4gKiBDaGVjayB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGZvciByZWplY3Rpb24gYnkgdmF0IHVwZ3JhZGUsXG4gKiBhbmQgcmVmZXRjaCB1cG9uIGVuY291bnRlcmluZyB0aGF0IGNvbmRpdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBFUmVmPFQ+fSBnZXR0ZXJcbiAqIEBwYXJhbSB7RVJlZjxUPltdfSBbc2VlZF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fVxuICovXG5jb25zdCByZWNvbm5lY3RBc05lZWRlZD1hc3luYyhnZXR0ZXIsc2VlZD1bXSk9PntcbmxldCBkaXNjb25uZWN0aW9uO1xubGV0IGxhc3RWZXJzaW9uPS1JbmZpbml0eTtcbi8qIEVuZCBzeW5jaHJvbm91cyBwcmVsdWRlLiovXG5hd2FpdCBudWxsO1xuZm9yKGxldCBpPTA7O2krPTEpe1xudHJ5e1xuY29uc3QgcmVzdWx0UD1pPHNlZWQubGVuZ3RoP3NlZWRbaV06Z2V0dGVyKCk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcCwgQGplc3NpZS5qcy9uby1uZXN0ZWQtYXdhaXQqL1xuY29uc3QgcmVzdWx0PWF3YWl0IHJlc3VsdFA7XG5yZXR1cm4gcmVzdWx0O1xuIH1jYXRjaChlcnIpe1xuaWYoaXNVcGdyYWRlRGlzY29ubmVjdGlvbihlcnIpKXtcbmlmKCFkaXNjb25uZWN0aW9uKXtcbmRpc2Nvbm5lY3Rpb249ZXJyO1xuIH1cbmNvbnN0e2luY2FybmF0aW9uTnVtYmVyOnZlcnNpb259PWVycjtcbmlmKHZlcnNpb24+bGFzdFZlcnNpb24pe1xuLyogV2UgZG9uJ3QgZXhwZWN0IGFub3RoZXIgdXBncmFkZSBpbiBiZXR3ZWVuIHJlY2VpdmluZyovXG4vKiBhIGRpc2Nvbm5lY3Rpb24gYW5kIHJlLXJlcXVlc3RpbmcgYW4gdXBkYXRlLCBidXQgbXVzdCovXG4vKiBuZXZlcnRoZWxlc3MgYmUgcHJlcGFyZWQgZm9yIHRoYXQuKi9cbmxhc3RWZXJzaW9uPXZlcnNpb247XG5jb250aW51ZTtcbiB9XG4gfVxuLyogaWYgYGVycmAgaXMgYW4gKEVycm9yKSBvYmplY3QsIHdlIGNhbiB0cnkgdG8gYXNzb2NpYXRlIGl0IHdpdGgqL1xuLyogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRpc2Nvbm5lY3Rpb24gdGhhdCBwcm9tcHRlZCB0aGUgcmVxdWVzdCovXG4vKiBmb3Igd2hpY2ggaXQgaXMgYSByZXN1bHQuKi9cbmlmKGlzT2JqZWN0KGVycikmJmRpc2Nvbm5lY3Rpb24mJmRpc2Nvbm5lY3Rpb24hPT1lcnIpe1xudHJ5e1xuYXNzZXJ0Lm5vdGUoXG5lcnIsXG5YIGBBdHRlbXB0aW5nIHRvIHJlY292ZXIgZnJvbSBkaXNjb25uZWN0aW9uOiAke2Rpc2Nvbm5lY3Rpb259YCk7XG5cbiB9Y2F0Y2goX2Vycil7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHkqL1xuIH1cbiB9XG50aHJvdyBlcnI7XG4gfVxuIH1cbiB9O1xuXG4vKipcbiAqIENyZWF0ZSBhIG5lYXIgaXRlcmFibGUgdGhhdCBjb3JyZXNwb25kcyB0byBhIHBvdGVudGlhbGx5IGZhciBvbmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VD4+fSBpdFBcbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZT0oaXRQKT0+XG5GYXIoJ0FzeW5jSXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbmNvbnN0IGl0PUUoaXRQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbmNvbnN0IHNlbGY9RmFyKCdBc3luY0l0ZXJhYmxlSXRlcmF0b3InLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PnNlbGYsXG5uZXh0OmFzeW5jKCk9PkUoaXQpLm5leHQoKX0pO1xuXG5yZXR1cm4gc2VsZjtcbiB9fSk7XG5cblxuLyoqXG4gKiBBc3luY3Jvbm91c2x5IGl0ZXJhdGVzIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGEgUHVibGljYXRpb25SZWNvcmQgY2hhaW4gYXMgdGhleVxuICogYXBwZWFyLiAgVGhpcyBpdGVyYXRpb24gbXVzdCBkcm9wIHBhcnRzIG9mIHB1YmxpY2F0aW9uIHJlY29yZHMgdGhhdCBhcmUgbm9cbiAqIGxvbmdlciBuZWVkZWQgc28gdGhleSBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICogQHBhcmFtIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gbmV4dENlbGxQXG4gKiAgIFB1YmxpY2F0aW9uUmVjb3JkIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgZmlyc3QgaXRlcmF0aW9uIHJlc3VsdFxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovJGjigI1fb25jZS5zdWJzY3JpYmUoc3Vic2NyaWJlKTtcbmNvbnN0IG1ha2VFYWNoSXRlcmF0b3I9KHRvcGljLG5leHRDZWxsUCk9Pntcbi8qIFRvIHVuZGVyc3RhbmQgdGhlIGltcGxlbWVudGF0aW9uLCBzdGFydCB3aXRoKi9cbi8qIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MDQwNDEyMjI1MC9odHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1zdHJhd21hbjpjb25jdXJyZW5jeSNpbmZpbml0ZV9xdWV1ZSovXG5jb25zdCBzZWxmPUZhcignRWFjaEl0ZXJhdG9yJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zZWxmLFxubmV4dDooKT0+e1xuY29uc3R7XG5oZWFkOnJlc3VsdFAsXG5wdWJsaXNoQ291bnQ6cHVibGlzaENvdW50UCxcbnRhaWw6dGFpbFB9PVxuRS5nZXQobmV4dENlbGxQKTtcblxuLyogSWYgdGFpbFAgaXMgYnJva2VuIGJ5IHVwZ3JhZGUsIHdlIHdpbGwgbmVlZCB0byByZS1yZXF1ZXN0IGl0Ki9cbi8qIGRpcmVjdGx5IGZyb20gYHRvcGljYC4qL1xuY29uc3QgZ2V0U3VjY2Vzc29yPWFzeW5jKCk9PntcbmNvbnN0IHB1Ymxpc2hDb3VudD1hd2FpdCBwdWJsaXNoQ291bnRQO1xuYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsJ2JpZ2ludCcpO1xuY29uc3Qgc3VjY2Vzc29yPWF3YWl0IEUodG9waWMpLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCk7XG5jb25zdCBuZXdQdWJsaXNoQ291bnQ9c3VjY2Vzc29yLnB1Ymxpc2hDb3VudDtcbmlmKG5ld1B1Ymxpc2hDb3VudCE9PXB1Ymxpc2hDb3VudCsxbil7XG5GYWlsIGBlYWNoSXRlcmF0b3IgYnJva2VuIGJ5IGdhcCBmcm9tIHB1Ymxpc2hDb3VudCAke3B1Ymxpc2hDb3VudH0gdG8gJHtuZXdQdWJsaXNoQ291bnR9YDtcbiB9XG5yZXR1cm4gc3VjY2Vzc29yO1xuIH07XG5cbi8qIFJlcGxhY2UgbmV4dENlbGxQIG9uIGV2ZXJ5IGNhbGwgdG8gbmV4dCgpIHNvIHRoaW5ncyB3b3JrIGV2ZW4qL1xuLyogd2l0aCBhbiBlYWdlciBjb25zdW1lciB0aGF0IGRvZXNuJ3Qgd2FpdCBmb3IgcmVzdWx0cyB0byBzZXR0bGUuKi9cbm5leHRDZWxsUD1yZWNvbm5lY3RBc05lZWRlZChnZXRTdWNjZXNzb3IsW3RhaWxQXSk7XG5cbi8qIEF2b2lkIHVuaGFuZGxlZCByZWplY3Rpb24gd2FybmluZ3MgaGVyZSBpZiB0aGUgcHJldmlvdXMgY2VsbCB3YXMgcmVqZWN0ZWQgb3IqL1xuLyogdGhlcmUgaXMgbm8gZnVydGhlciByZXF1ZXN0IG9mIHRoaXMgaXRlcmF0b3IuKi9cbi8qIGB0YWlsUGAgaXMgaGFuZGxlZCBpbnNpZGUgYHJlY29ubmVjdEFzTmVlZGVkYCBhbmQgYHJlc3VsdFBgIGlzIHRoZSBjYWxsZXIncyovXG4vKiBjb25jZXJuLCBsZWF2aW5nIG9ubHkgYHB1Ymxpc2hDb3VudFBgIGFuZCB0aGUgbmV3IGBuZXh0Q2VsbFBgLiovXG52b2lkIEUud2hlbihwdWJsaXNoQ291bnRQLHNpbmssc2luayk7XG52b2lkIEUud2hlbihuZXh0Q2VsbFAsc2luayxzaW5rKTtcbnJldHVybiByZXN1bHRQO1xuIH0sXG5mb3JrOigpPT5tYWtlRWFjaEl0ZXJhdG9yKHRvcGljLG5leHRDZWxsUCl9KTtcblxucmV0dXJuIHNlbGY7XG4gfTtcblxuLyoqXG4gKiBHaXZlbiBhIGxvY2FsIG9yIHJlbW90ZSBzdWJzY3JpYmVyLCByZXR1cm5zIGEgbG9jYWwgQXN5bmNJdGVyYWJsZSB3aGljaFxuICogcHJvdmlkZXMgXCJwcmVmaXggbG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwicHJlZml4IGxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgZXZlcnl0aGluZyBwdWJsaXNoZWQgYmVmb3JlXG4gKiB5b3UgYXNrIHRoZSByZXR1cm5lZCBpdGVyYWJsZSBmb3IgYW4gaXRlcmF0b3IuIEJ1dCB0aGUgcmV0dXJuZWQgaXRlcmF0b3JcbiAqIHdpbGwgZW51bWVyYXRlIGVhY2ggdGhpbmcgcHVibGlzaGVkIGZyb20gdGhhdCBpdGVyYXRvcidzIHN0YXJ0aW5nIHBvaW50XG4gKiB1cCB0byBhIGRpc2Nvbm5lY3Rpb24gcmVzdWx0IGluZGljYXRpbmcgdXBncmFkZSBvZiB0aGUgcHJvZHVjZXJcbiAqICh3aGljaCBicmVha3MgdGhlIGdhcC1mcmVlIGd1YXJhbnRlZSBhbmQgdGhlcmVmb3JlIHRlcm1pbmF0ZXMgYW55IGFjdGl2ZVxuICogaXRlcmF0b3Igd2hpbGUgc3RpbGwgc3VwcG9ydGluZyBjcmVhdGlvbiBvZiBuZXcgaXRlcmF0b3JzKS5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZUVhY2g9KHRvcGljKT0+e1xuY29uc3QgaXRlcmFibGU9RmFyKCdFYWNoSXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbmNvbnN0IGZpcnN0Q2VsbFA9cmVjb25uZWN0QXNOZWVkZWQoKCk9PkUodG9waWMpLnN1YnNjcmliZUFmdGVyKCkpO1xucmV0dXJuIG1ha2VFYWNoSXRlcmF0b3IodG9waWMsZmlyc3RDZWxsUCk7XG4gfX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLnN1YnNjcmliZUVhY2goc3Vic2NyaWJlRWFjaCk7XG5oYXJkZW4oc3Vic2NyaWJlRWFjaCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKiBAcGFyYW0ge2JpZ2ludH0gW2xvY2FsVXBkYXRlQ291bnRdXG4gKiBAcGFyYW0ge0l0ZXJhdG9yUmV0dXJuUmVzdWx0PFQ+fSBbdGVybWluYWxSZXN1bHRdXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVD59XG4gKi9cbmNvbnN0IGNsb25lTGF0ZXN0SXRlcmF0b3I9KHRvcGljLGxvY2FsVXBkYXRlQ291bnQsdGVybWluYWxSZXN1bHQpPT57XG5sZXQgbXV0ZXg9UHJvbWlzZS5yZXNvbHZlKCk7XG5cbi8qKlxuICogUmVxdWVzdCB0aGUgbmV4dCB1cGRhdGUgcmVjb3JkIGZyb20gdGhlIHRvcGljLCB1cGRhdGluZyBvdXIgbG9jYWwgc3RhdGUsXG4gKiBhbmQgY29udmVydCBpdCB0byBhbiBpdGVyYXRvciByZXN1bHQuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVD4+fVxuICovXG5jb25zdCBtYXliZVJlcXVlc3ROZXh0UmVzdWx0PWFzeW5jKCk9PntcbmlmKHRlcm1pbmFsUmVzdWx0KXtcbi8qIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdG9waWMsIGp1c3Qga2VlcCByZXR1cm5pbmcgdGhlIGxhc3QgcmVzdWx0Ki9cbi8qIHdpdGhvdXQgZnVydGhlciByZXF1ZXN0cy4qL1xucmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuIH1cblxuLyogU2VuZCB0aGUgbmV4dCByZXF1ZXN0IG5vdywgc2tpcHBpbmcgcGFzdCBpbnRlcm1lZGlhdGUgdXBkYXRlcyovXG4vKiBhbmQgdXBncmFkZSBkaXNjb25uZWN0aW9ucy4qL1xuY29uc3R7dmFsdWUsdXBkYXRlQ291bnR9PWF3YWl0IHJlY29ubmVjdEFzTmVlZGVkKCgpPT5cbkUodG9waWMpLmdldFVwZGF0ZVNpbmNlKGxvY2FsVXBkYXRlQ291bnQpKTtcblxuLyogTWFrZSBzdXJlIHRoZSBuZXh0IHJlcXVlc3QgaXMgZm9yIGEgZnJlc2hlciB2YWx1ZS4qL1xubG9jYWxVcGRhdGVDb3VudD11cGRhdGVDb3VudDtcblxuLyogTWFrZSBhbiBJdGVyYXRvclJlc3VsdC4qL1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xudGVybWluYWxSZXN1bHQ9aGFyZGVuKHtkb25lOnRydWUsdmFsdWV9KTtcbnJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfTtcblxuY29uc3Qgc2VsZj1GYXIoJ0xhdGVzdEl0ZXJhdG9yJyx7XG5mb3JrOigpPT5jbG9uZUxhdGVzdEl0ZXJhdG9yKHRvcGljLGxvY2FsVXBkYXRlQ291bnQsdGVybWluYWxSZXN1bHQpLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+c2VsZixcbm5leHQ6YXN5bmMoKT0+e1xuLyogSW4gdGhpcyBhZGFwdG9yLCBvbmNlIGBuZXh0KClgIGlzIGNhbGxlZCBhbmQgcmV0dXJucyBhbiB1bnJlc29sdmVkKi9cbi8qIHByb21pc2UsIGZ1cnRoZXIgYG5leHQoKWAgY2FsbHMgd2lsbCBhbHNvIHJldHVybiB1bnJlc29sdmVkIHByb21pc2VzKi9cbi8qIGJ1dCBlYWNoIGNhbGwgd2lsbCBub3QgdHJpZ2dlciBhbm90aGVyIGB0b3BpY2AgcmVxdWVzdCB1bnRpbCB0aGUgcHJpb3IqL1xuLyogb25lIGhhcyBzZXR0bGVkLiovXG4vKiovXG4vKiBUaGlzIGxpbmVhciBxdWV1ZWluZyBiZWhhdmlvciBpcyBvbmx5IG5lZWRlZCBmb3IgY29kZSB0aGF0IHVzZXMgdGhlKi9cbi8qIGFzeW5jIGl0ZXJhdG9yIHByb3RvY29sIGV4cGxpY2l0bHkuIFdoZW4gdGhpcyBhc3luYyBpdGVyYXRvciBpcyovXG4vKiBjb25zdW1lZCBieSBhIGZvci9hd2FpdC9vZiBsb29wLCBgbmV4dCgpYCB3aWxsIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZSovXG4vKiBwcm9taXNlIGZvciB0aGUgcHJldmlvdXMgaXRlcmF0aW9uIHJlc3VsdCBoYXMgZnVsZmlsbGVkLiBJZiBpdCBmdWxmaWxscyovXG4vKiB3aXRoIGBkb25lOiB0cnVlYCwgdGhlIGZvci9hd2FpdC9vZiBsb29wIHdpbGwgbmV2ZXIgY2FsbCBgbmV4dCgpYCovXG4vKiBhZ2Fpbi4qL1xuLyoqL1xuLyogU2VlKi9cbi8qIGh0dHBzOi8vMmFsaXR5LmNvbS8yMDE2LzEwL2FzeW5jaHJvbm91cy1pdGVyYXRpb24uaHRtbCNxdWV1aW5nLW5leHQoKS1pbnZvY2F0aW9ucyovXG4vKiBmb3IgYW4gZXhwbGljaXQgdXNlIHRoYXQgc2VuZHMgYG5leHQoKWAgd2l0aG91dCB3YWl0aW5nLiovXG5cbmlmKHRlcm1pbmFsUmVzdWx0KXtcbi8qIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdG9waWMsIGp1c3Qga2VlcCByZXR1cm5pbmcgdGhlIGxhc3QqL1xuLyogcmVzdWx0LiovXG5yZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gfVxuXG4vKiBCRUdJTiBDUklUSUNBTCBTRUNUSU9OIC0gc3luY2hyb25vdXNseSBlbnF1ZXVlIGFuZCByZWFzc2lnbiBgbXV0ZXhgKi9cbi8qKi9cbi8qIFVzZSBgbXV0ZXhgIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgbm8gbW9yZSB0aGFuIGEgc2luZ2xlIHJlcXVlc3QgaW4qL1xuLyogZmxpZ2h0LiovXG5jb25zdCBuZXh0UmVzdWx0PW11dGV4LnRoZW4obWF5YmVSZXF1ZXN0TmV4dFJlc3VsdCk7XG5tdXRleD1uZXh0UmVzdWx0LnRoZW4oc2luayxzaW5rKTtcbi8qIEVORCBDUklUSUNBTCBTRUNUSU9OKi9cblxucmV0dXJuIG5leHRSZXN1bHQ7XG4gfX0pO1xuXG5yZXR1cm4gc2VsZjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovXG5jb25zdCBtYWtlTGF0ZXN0SXRlcmF0b3I9KHRvcGljKT0+Y2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYyk7XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwibG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwibG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBhbnkgcHVibGlzaGVkIHN0YXRlIGlmIGEgbW9yZVxuICogcmVjZW50IHB1Ymxpc2hlZCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCBieSB1cGdyYWRlIG9mIHRoZSBwcm9kdWNlcixcbiAqIGl0IHdpbGwgYmUgcmUtcmVxdWVzdGVkLiBBbGwgb3RoZXIgdGVybWluYWwgdmFsdWVzIHdpbGwgYmUgbG9zc2xlc3NseVxuICogcHJvcGFnYXRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gdG9waWNcbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZUxhdGVzdD0odG9waWMpPT57XG5jb25zdCBpdGVyYWJsZT1GYXIoJ0xhdGVzdEl0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5tYWtlTGF0ZXN0SXRlcmF0b3IodG9waWMpfSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2Uuc3Vic2NyaWJlTGF0ZXN0KHN1YnNjcmliZUxhdGVzdCk7XG5oYXJkZW4oc3Vic2NyaWJlTGF0ZXN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdWJzY3JpYmUiOlsic3Vic2NyaWJlIl0sInN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCJdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACeyOyPFCwAAxQsAACkAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlci5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL3RvcGljLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsc3Vic2NyaWJlRWFjaCxtYWtlUHVibGlzaEtpdCxtYWtlUGlubmVkSGlzdG9yeVRvcGljOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUVhY2hcIiwgWyRo4oCNX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaOKAjV9hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vdG9waWMuanNcIiwgW1tcIm1ha2VQaW5uZWRIaXN0b3J5VG9waWNcIiwgWyRo4oCNX2EgPT4gKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICogQHJldHVybnMge1N1YnNjcmlwdGlvbjxUPn1cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbj0odG9waWMpPT57XG5jb25zdCBzdWJzY3JpcHRpb249RmFyKCdTdWJzY3JpcHRpb24nLHtcbi4uLnN1YnNjcmliZUVhY2godG9waWMpLFxuc3Vic2NyaWJlQWZ0ZXI6YXN5bmMocHVibGlzaENvdW50KT0+RSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgU3Vic2NyaXB0aW9uIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBTdWJzY3JpcHRpb24gdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZVN1YnNjcmlwdGlvbmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBTdWJzY3JpcHRpb24gYXQgdGhhdCBzaXRlLlxuICovXG5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczphc3luYygpPT50b3BpYyxcblxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7c3Vic2NyaXB0aW9ufSl9KTtcblxucmV0dXJuIHN1YnNjcmlwdGlvbjtcbiB9OyRo4oCNX29uY2UubWFrZVN1YnNjcmlwdGlvbihtYWtlU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uKTtcblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFByb2R1Y2VycyBzaG91bGQgdXNlXG4gKiBgYGBqc1xuICogY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VQdWJsaXNoS2l0KCk7XG4gKiBjb25zdCB0b3BpYyA9IG1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG4gKiBgYGBcbiAqIGluc3RlYWQsIHdoaWNoIG1ha2VzIGl0IGNsZWFyZXIgdGhhdCBhbGwgdGhlIHN1YnNjcmliZXIncyBoaXN0b3J5IGlzXG4gKiByZXRhaW5lZCwgcHJldmVudGluZyBHQy4gIFBvdGVudGlhbGx5IHJlbW90ZSBjb25zdW1lcnMgdXNlXG4gKiBgYGBqc1xuICogZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBzdWJzY3JpYmVFYWNoKHRvcGljKSkgeyAuLi4gfVxuICogYGBgXG4gKlxuICogTWFrZXMgYSBgeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH1gIGZvciBkb2luZyBsb3NzbGVzcyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb25SZWNvcmQ8VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb25LaXQ9KCk9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG4vKiBUaGUgcHVibGlzaCBraXQgc3Vic2NyaWJlciBpcyBwcmVmaXgtbG9zc3ksIHNvIG1ha2luZyAqdGhpcyogc3Vic2NyaWJlciBjb21wbGV0ZWx5Ki9cbi8qIGxvc3NsZXNzIGZyb20gaW5pdGlhbGlzYXRpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgZm9ybWVyJ3MgaGlzdG9yeS4qL1xuXG5jb25zdCBwaW5uZWRIaXN0b3J5VG9waWM9bWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhzdWJzY3JpYmVyKTtcbmNvbnN0IHN1YnNjcmlwdGlvbj1tYWtlU3Vic2NyaXB0aW9uKHBpbm5lZEhpc3RvcnlUb3BpYyk7XG5cbi8qKiBAdHlwZSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59ICovXG5jb25zdCBwdWJsaWNhdGlvbj1GYXIoJ3B1YmxpY2F0aW9uJyx7XG51cGRhdGVTdGF0ZToobm9uRmluYWxWYWx1ZSk9PnB1Ymxpc2hlci5wdWJsaXNoKG5vbkZpbmFsVmFsdWUpLFxuZmluaXNoOihjb21wbGV0aW9uKT0+cHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbmZhaWw6KHJlYXNvbik9PnB1Ymxpc2hlci5mYWlsKHJlYXNvbil9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtwdWJsaWNhdGlvbixzdWJzY3JpcHRpb259KTtcbiB9OyRo4oCNX29uY2UubWFrZVN1YnNjcmlwdGlvbktpdChtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3Vic2NyaXB0aW9uIjpbIm1ha2VTdWJzY3JpcHRpb24iXSwibWFrZVN1YnNjcmlwdGlvbktpdCI6WyJtYWtlU3Vic2NyaXB0aW9uS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACGBFnIMBgAADAYAACQAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdG9waWMuanN7ImltcG9ydHMiOlsiLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgQSBwaW5uZWQtaGlzdG9yeSB0b3BpYyBwcmVzZXJ2ZXMgYWxsIG9mIGl0cyBwdWJsaXNoZWQgdmFsdWVzIGluXG4gKiBtZW1vcnkuICBVc2UgYSBwcmVmaXgtbG9zc3kgbWFrZVB1Ymxpc2hLaXQgaW5zdGVhZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFYWNoVG9waWM8VD4gJiBMYXRlc3RUb3BpYzxUPn0gdG9waWMgbmVlZHMgdG8gYmUgbmVhciBpbiBvcmRlciB0b1xuICogcHJlc2VydmUgc3Vic2NyaXB0aW9uIHRpbWluZ3MuICBUT0RPOiBkcm9wIExhdGVzdFRvcGljPFQ+IHJlcXVpcmVtZW50XG4gKiBAcmV0dXJucyB7RWFjaFRvcGljPFQ+ICYgTGF0ZXN0VG9waWM8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUGlubmVkSGlzdG9yeVRvcGljPSh0b3BpYyk9Pntcbi8qIFN1Y2ggbG9zc2xlc3NuZXNzIGluaGliaXRzIEdDLCB3aGljaCBpcyB3aHkgd2UncmUgbW92aW5nIGF3YXkgZnJvbSBpdC4qL1xuXG4vKiBXZSBuZWVkIHRvIHRha2UgYW4gaW1tZWRpYXRlIHNuYXBzaG90IG9mIHRoZSB0b3BpYydzIGN1cnJlbnQgc3RhdGUuKi9cbmNvbnN0IHBpbm5lZFB1Ykxpc3Q9dG9waWMuc3Vic2NyaWJlQWZ0ZXIoKTtcblxucmV0dXJuIEZhcignUGlubmVkSGlzdG9yeVRvcGljJyx7XG5zdWJzY3JpYmVBZnRlcjphc3luYyhwdWJsaXNoQ291bnQ9LTFuKT0+e1xuaWYocHVibGlzaENvdW50PT09LTFuKXtcbnJldHVybiBwaW5uZWRQdWJMaXN0O1xuIH1cbnJldHVybiB0b3BpYy5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuIH0sXG5nZXRVcGRhdGVTaW5jZTphc3luYyh1cGRhdGVDb3VudD11bmRlZmluZWQpPT57XG4vKiBUT0RPOiBCdWlsZCB0aGlzIG91dCBvZiBFYWNoVG9waWM8VD4uKi9cbnJldHVybiB0b3BpYy5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VQaW5uZWRIaXN0b3J5VG9waWMobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG5oYXJkZW4obWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPhRDxM/MAAAPzAAACwAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxUPn0gRVJlZlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wcm9taXNlLWtpdCcpLlByb21pc2VLaXQ8VD59IFByb21pc2VLaXRcbiAqL1xuXG4vKipcbiAqIERlcHJlY2F0ZWQuIFVzZSBQcm9taXNlS2l0IGluc3RlYWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wcm9taXNlLWtpdCcpLlByb21pc2VSZWNvcmQ8VD59IFByb21pc2VSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgW1RSZXR1cm49YW55XVxuICogQHRlbXBsYXRlIFtUTmV4dD11bmRlZmluZWRdXG4gKiBAdHlwZWRlZiB7QXN5bmNJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD4gJiB7XG4gKiAgIGZvcmsoKTogRm9ya2FibGVBc3luY0l0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PlxuICogfX0gRm9ya2FibGVBc3luY0l0ZXJhdG9yIEFuIEFzeW5jSXRlcmF0b3IgdGhhdCBjYW4gYmUgZm9ya2VkIGF0IGEgZ2l2ZW4gcG9zaXRpb25cbiAqIGludG8gbXVsdGlwbGUgaW5kZXBlbmRlbnQgRm9ya2FibGVBc3luY0l0ZXJhdG9ycyBzdGFydGluZyBmcm9tIHRoYXQgcG9zaXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtUUmV0dXJuPWFueV1cbiAqIEB0ZW1wbGF0ZSBbVE5leHQ9dW5kZWZpbmVkXVxuICogQHR5cGVkZWYge3sgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+IH19IEFzeW5jSXRlcmFibGVPbmx5XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtUUmV0dXJuPWFueV1cbiAqIEB0ZW1wbGF0ZSBbVE5leHQ9dW5kZWZpbmVkXVxuICogQHR5cGVkZWYge3tcbiAqICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD4sXG4gKiAgIGZvcmsoKTogRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+IH0gJlxuICogICBGb3JrYWJsZUFzeW5jSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+XG4gKiB9IEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtUUmV0dXJuPWFueV1cbiAqIEB0ZW1wbGF0ZSBbVE5leHQ9dW5kZWZpbmVkXVxuICogQHR5cGVkZWYge3tcbiAqICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gRm9ya2FibGVBc3luY0l0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PlxuICogfX0gRm9ya2FibGVBc3luY0l0ZXJhYmxlXG4gKiBBbiBBc3luY0l0ZXJhYmxlIHRoYXQgcHJvZHVjZXMgRm9ya2FibGVBc3luY0l0ZXJhdG9ycy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJdGVyYXRpb25PYnNlcnZlcjxUPlxuICogQSB2YWxpZCBzZXF1ZW5jZSBvZiBjYWxscyB0byB0aGUgbWV0aG9kcyBvZiBhbiBgSXRlcmF0aW9uT2JzZXJ2ZXJgXG4gKiByZXByZXNlbnRzIGFuIGl0ZXJhdGlvbi4gQSB2YWxpZCBzZXF1ZW5jZSBjb25zaXN0cyBvZiBhbnkgbnVtYmVyIG9mIGNhbGxzXG4gKiB0byBgdXBkYXRlU3RhdGVgIHdpdGggdGhlIHN1Y2Nlc3NpdmUgbm9uLWZpbmFsIHZhbHVlcywgZm9sbG93ZWQgYnkgYVxuICogZmluYWwgY2FsbCB0byBlaXRoZXIgYGZpbmlzaGAgd2l0aCBhIHN1Y2Nlc3NmdWwgYGNvbXBsZXRpb25gIHZhbHVlXG4gKiBvciBgZmFpbGAgd2l0aCB0aGUgYWxsZWdlZCBgcmVhc29uYCBmb3IgZmFpbHVyZS4gQWZ0ZXIgYXQgbW9zdCBvbmVcbiAqIHRlcm1pbmF0aW5nIGNhbGxzLCBubyBmdXJ0aGVyIGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYXJlIHZhbGlkIGFuZCBtdXN0IGJlXG4gKiByZWplY3RlZC5cbiAqIEBwcm9wZXJ0eSB7KG5vbkZpbmFsVmFsdWU6IFQpID0+IHZvaWR9IHVwZGF0ZVN0YXRlXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBUKSA9PiB2b2lkfSBmaW5pc2hcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbjogdW5rbm93bikgPT4gdm9pZH0gZmFpbFxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGljYXRpb25SZWNvcmRcbiAqIFdpbGwgYmUgc2hhcmVkIGJldHdlZW4gbWFjaGluZXMsIHNvIGl0IG11c3QgYmUgc2FmZSB0byBleHBvc2UuIEJ1dCBzb2Z0d2FyZVxuICogb3V0c2lkZSB0aGUgY3VycmVudCBwYWNrYWdlIHNob3VsZCBjb25zaWRlciBpdCBvcGFxdWUsIG5vdCBkZXBlbmRpbmcgb24gaXRzXG4gKiBpbnRlcm5hbCBzdHJ1Y3R1cmUuXG4gKiBAcHJvcGVydHkge0l0ZXJhdG9yUmVzdWx0PFQ+fSBoZWFkXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gcHVibGlzaENvdW50IHN0YXJ0cyBhdCAxIGZvciB0aGUgZmlyc3QgcmVzdWx0XG4gKiAgIGFuZCBhZHZhbmNlcyBieSAxIGZvciBlYWNoIHN1YnNlcXVlbnQgcmVzdWx0XG4gKiBAcHJvcGVydHkge1Byb21pc2U8UHVibGljYXRpb25SZWNvcmQ8VD4+fSB0YWlsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gRWFjaFRvcGljXG4gKiBAcHJvcGVydHkgeyhwdWJsaXNoQ291bnQ/OiBiaWdpbnQpID0+IFByb21pc2U8UHVibGljYXRpb25SZWNvcmQ8VD4+fSBzdWJzY3JpYmVBZnRlclxuICogUmV0dXJucyBhIHByb21pc2UgZm9yIGEgXCJjdXJyZW50XCIgUHVibGljYXRpb25SZWNvcmQgKHJlZmVyZW5jaW5nIGl0c1xuICogaW1tZWRpYXRlIHN1Y2Nlc3NvciB2aWEgYSBgdGFpbGAgcHJvbWlzZSkgdGhhdCBpcyBsYXRlciB0aGFuIHRoZVxuICogcHJvdmlkZWQgcHVibGlzaENvdW50LlxuICogVXNlZCB0byBtYWtlIGZvcndhcmQtbG9zc2xlc3MgKFwiZWFjaFwiKSBpdGVyYXRvcnMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0ZvcmthYmxlQXN5bmNJdGVyYWJsZTxULCBUPiAmIEVhY2hUb3BpYzxUPn0gSXRlcmFibGVFYWNoVG9waWNcbiAqIEFuIEVhY2hUb3BpYyB3aXRoIGRlZmF1bHQgYXN5bmNJdGVyYWJsZSBiZWhhdmlvdXIuXG4gKlxuICogTk9URTogdGhlIHB1YmxpY2F0aW9uIHJlY29yZHMgYW5kIGl0ZXJhdG9ycyByZXR1cm5lZCBieSB0aGlzIG9iamVjdCBhcmVcbiAqIGVwaGVtZXJhbCBhbmQgd2lsbCBiZSBzZXZlcmVkIGR1cmluZyB1cGdyYWRlLiAgQSBjYWxsZXIgc2hvdWxkIHVzZVxuICogYHN1YnNjcmliZUVhY2hgIHRvIHdyYXAgdGhpcyB0b3BpYyBpbiBhIGxvY2FsIGl0ZXJhYmxlIHdoaWNoIGF1dG9tYXRpY2FsbHlcbiAqIGF0dGVtcHRzIHRvIHJlY29ubmVjdCB1cG9uIGJlaW5nIHNldmVyZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0FzeW5jSXRlcmFibGVPbmx5PFQsIFQ+ICYgTGF0ZXN0VG9waWM8VD59IEl0ZXJhYmxlTGF0ZXN0VG9waWNcbiAqIEEgTGF0ZXN0VG9waWMgd2l0aCBkZWZhdWx0IGFzeW5jSXRlcmFibGUgYmVoYXZpb3VyLlxuICpcbiAqIE5PVEU6IHRoZSBpdGVyYXRvcnMgcmV0dXJuZWQgYnkgdGhpcyBvYmplY3QgYXJlIGVwaGVtZXJhbCBhbmQgd2lsbCBiZSBzZXZlcmVkXG4gKiBkdXJpbmcgdXBncmFkZS4gIEEgY2FsbGVyIHNob3VsZCB1c2UgYHN1YnNjcmliZUxhdGVzdGAgdG8gd3JhcCB0aGlzIHRvcGljIGluXG4gKiBhIGxvY2FsIGl0ZXJhYmxlIHdoaWNoIGF1dG9tYXRpY2FsbHkgYXR0ZW1wdHMgdG8gcmVjb25uZWN0IHVwb24gYmVpbmdcbiAqIHNldmVyZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gTGF0ZXN0VG9waWNcbiAqIEBwcm9wZXJ0eSB7KHVwZGF0ZUNvdW50PzogYmlnaW50IHwgbnVtYmVyKSA9PiBQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59IGdldFVwZGF0ZVNpbmNlXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gdXBkYXRlIHJlY29yZCBhcyBvZiBhbiB1cGRhdGUgY291bnQuXG4gKiBJZiB0aGUgYHVwZGF0ZUNvdW50YCBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCB1cGRhdGUgY291bnQsXG4gKiB0aGUgcHJvbWlzZSBwcm9tcHRseSByZXNvbHZlcyB0byB0aGUgY3VycmVudCByZWNvcmQuXG4gKiBPdGhlcndpc2UsIGFmdGVyIHRoZSBuZXh0IHN0YXRlIGNoYW5nZSwgdGhlIHByb21pc2UgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdGluZyByZWNvcmQuXG4gKiBUaGlzIGlzIGFuIGF0dGVudWF0ZWQgZm9ybSBvZiBgc3Vic2NyaWJlQWZ0ZXJgIHdob3NlIHJldHVybiB2YWx1ZSBzdGFuZHMgYWxvbmUgYW5kXG4gKiBkb2VzIG5vdCBhbGxvdyBjb25zdW1lcnMgdG8gcGluIGEgY2hhaW4gb2YgaGlzdG9yaWNhbCBQdWJsaWNhdGlvblJlY29yZHMuXG4gKiBVc2VkIHRvIG1ha2UgbG9zc3kgKFwibGF0ZXN0XCIpIGl0ZXJhdG9ycy5cbiAqIE5PVEU6IFVzZSBvZiBgbnVtYmVyYCBhcyBhbiBgdXBkYXRlQ291bnRgIGlzIGRlcHJlY2F0ZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0xhdGVzdFRvcGljPFQ+fSBCYXNlTm90aWZpZXIgVGhpcyB0eXBlIGlzIGRlcHJlY2F0ZWQgYnV0IGlzIHN0aWxsXG4gKiB1c2VkIGV4dGVybmFsbHkuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0xhdGVzdFRvcGljPFQ+ICYgRWFjaFRvcGljPFQ+fSBTdWJzY3JpYmVyXG4gKiBBIHN0cmVhbSBvZiByZXN1bHRzIHRoYXQgYWxsb3dzIGNvbnN1bWVycyB0byBjb25maWd1cmVcbiAqIGZvcndhcmQtbG9zc2xlc3MgXCJlYWNoXCIgaXRlcmF0aW9uIHdpdGggYHN1YnNjcmliZUVhY2hgIGFuZFxuICogbG9zc3kgXCJsYXRlc3RcIiBpdGVyYXRpb24gd2l0aCBgc3Vic2NyaWJlTGF0ZXN0YC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaXNoZXJcbiAqIEEgdmFsaWQgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gdGhlIG1ldGhvZHMgb2YgYW4gYEl0ZXJhdGlvbk9ic2VydmVyYFxuICogcmVwcmVzZW50cyBhbiBpdGVyYXRpb24uIEEgdmFsaWQgc2VxdWVuY2UgY29uc2lzdHMgb2YgYW55IG51bWJlciBvZiBjYWxsc1xuICogdG8gYHB1Ymxpc2hgIHdpdGggdGhlIHN1Y2Nlc3NpdmUgbm9uLWZpbmFsIHZhbHVlcywgZm9sbG93ZWQgYnkgYVxuICogZmluYWwgY2FsbCB0byBlaXRoZXIgYGZpbmlzaGAgd2l0aCBhIHN1Y2Nlc3NmdWwgYGNvbXBsZXRpb25gIHZhbHVlXG4gKiBvciBgZmFpbGAgd2l0aCB0aGUgYWxsZWdlZCBgcmVhc29uYCBmb3IgZmFpbHVyZS4gQWZ0ZXIgYXQgbW9zdCBvbmVcbiAqIHRlcm1pbmF0aW5nIGNhbGxzLCBubyBmdXJ0aGVyIGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYXJlIHZhbGlkIGFuZCBtdXN0IGJlXG4gKiByZWplY3RlZC5cbiAqIEBwcm9wZXJ0eSB7KG5vbkZpbmFsVmFsdWU6IFQpID0+IHZvaWR9IHB1Ymxpc2hcbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IFQpID0+IHZvaWR9IGZpbmlzaFxuICogQHByb3BlcnR5IHsocmVhc29uOiBhbnkpID0+IHZvaWR9IGZhaWxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7UGFydGlhbDxQdWJsaXNoZXI8VD4+fSBQdWJsaXNoT2JzZXJ2ZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaXNoS2l0PFQ+XG4gKiBAcHJvcGVydHkge1B1Ymxpc2hlcjxUPn0gcHVibGlzaGVyXG4gKiBAcHJvcGVydHkge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRQdWJsaXNoS2l0PFQ+XG4gKiBAcHJvcGVydHkge1B1Ymxpc2hlcjxUPn0gcHVibGlzaGVyXG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYgeydtYW5kYXRvcnknIHwgJ29wcG9ydHVuaXN0aWMnIHwgJ2lnbm9yZWQnfSBEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eVxuICpcbiAqIER1cmFiaWxpdHkgY29uZmlndXJlcyBjb25zdHJhaW50cyBvbiBub24tdGVybWluYWwgdmFsdWVzIHRoYXQgY2FuIGJlXG4gKiBwdWJsaXNoZWQgdG8gYSBkdXJhYmxlIHB1Ymxpc2gga2l0ICh0ZXJtaW5hbCB2YWx1ZXMgc2VudCB0byBmaW5pc2ggb3IgZmFpbFxuICogbXVzdCBhbHdheXMgYmUgZHVyYWJsZSkuXG4gKiAtICdtYW5kYXRvcnknIG1lYW5zIHRoYXQgZWFjaCB2YWx1ZSBtdXN0IGJlIGR1cmFibGUsIHNvIGl0IGNhbiBiZSByZXN0b3JlZFxuICogICBvbiB1cGdyYWRlLlxuICogLSAnb3Bwb3J0dW5pc3RpYycgbWVhbnMgdGhhdCBhIGR1cmFibGUgdmFsdWUgaXMgcGVyc2lzdGVkIGZvciBwb3N0LXVwZ3JhZGVcbiAqICAgcmVzdG9yYXRpb24sIGJ1dCBhIG5vbi1kdXJhYmxlIHZhbHVlIGlzIHN0aWxsIGFjY2VwdGVkIChhbmQgd2lsbCByZXN1bHQgaW5cbiAqICAgdmFsdWVsZXNzIHJlc3RvcmF0aW9uKS5cbiAqIC0gJ2lnbm9yZWQnIG1lYW5zIHRoYXQgYSB2YWx1ZSBpcyBub3QgcGVyc2lzdGVkIGZvciByZXN0b3JhdGlvbiBldmVuIGlmIGl0XG4gKiAgIGlzIGR1cmFibGUuXG4gKlxuICogJ21hbmRhdG9yeScgaXMgdGhlIG9ubHkgY3VycmVudGx5LXN1cHBvcnRlZCB2YWx1ZSwgYW5kIG90aGVycyBtdXN0IG5vdCBiZVxuICogZW5hYmxlZCB3aXRob3V0IHRlc3QgY292ZXJhZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEdXJhYmxlUHVibGlzaEtpdFN0YXRlXG4gKlxuICogQHByb3BlcnR5IHtEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eX0gdmFsdWVEdXJhYmlsaXR5XG4gKlxuICogQHByb3BlcnR5IHtiaWdpbnR9IHB1Ymxpc2hDb3VudFxuICpcbiAqIEBwcm9wZXJ0eSB7J2xpdmUnIHwgJ2ZpbmlzaGVkJyB8ICdmYWlsZWQnfSBzdGF0dXNcbiAqXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGhhc1ZhbHVlXG4gKiBoYXNWYWx1ZSBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mIHZhbHVlLiBJdCBzdGFydHMgb2ZmIGZhbHNlLFxuICogYW5kIGNhbiBiZSByZXNldCB0byBmYWxzZSB3aGVuIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCBpcyByZXN0b3JlZCBhbmRcbiAqIHRoZSBwcmV2aW91cyB2YWx1ZSB3YXMgbm90IGR1cmFibGUsIG9yIG5vbi10ZXJtaW5hbCBhbmQgdmFsdWVEdXJhYmxpdHkgaXMgJ2lnbm9yZWQnLlxuICpcbiAqIEBwcm9wZXJ0eSB7YW55fSB2YWx1ZVxuICogdmFsdWUgaG9sZHMgZWl0aGVyIGEgbm9uLXRlcm1pbmFsIHZhbHVlIGZyb20gYHB1Ymxpc2hgIG9yIGEgdGVybWluYWwgdmFsdWVcbiAqIGZyb20gYGZpbmlzaGAgb3IgYGZhaWxgLCBkZXBlbmRpbmcgdXBvbiB0aGUgdmFsdWUgaW4gc3RhdHVzLlxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gVXBkYXRlUmVjb3JkPFQ+XG4gKiBAcHJvcGVydHkge1R9IHZhbHVlIGlzIHdoYXRldmVyIHN0YXRlIHRoZSBzZXJ2aWNlIHdhbnRzIHRvIHB1Ymxpc2hcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBbdXBkYXRlQ291bnRdIGlzIGEgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSB1cGRhdGUuICBGb3JcbiAqIHRoZSBsYXN0IHVwZGF0ZSwgaXQgaXMgYHVuZGVmaW5lZGAuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0Jhc2VOb3RpZmllcjxUPn0gTm90aWZpZXJJbnRlcm5hbHMgV2lsbCBiZSBzaGFyZWQgYmV0d2VlbiBtYWNoaW5lcyxcbiAqIHNvIGl0IG11c3QgYmUgc2FmZSB0byBleHBvc2UuIEJ1dCBvdGhlciBzb2Z0d2FyZSBzaG91bGQgYXZvaWQgZGVwZW5kaW5nIG9uXG4gKiBpdHMgaW50ZXJuYWwgc3RydWN0dXJlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtOb3RpZmllckludGVybmFsczxUPiAmXG4gKiAgIEZvcmthYmxlQXN5bmNJdGVyYWJsZTxULCBUPiAmXG4gKiAgIFNoYXJhYmxlTm90aWZpZXI8VD5cbiAqIH0gTm90aWZpZXI8VD4gYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHN0YXRlIG9yIHVwZGF0ZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaGFyYWJsZU5vdGlmaWVyXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Tm90aWZpZXJJbnRlcm5hbHM8VD4+fSBnZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzXG4gKiBVc2VkIHRvIHJlcGxpY2F0ZSB0aGUgbXVsdGljYXN0IHZhbHVlcyBhdCBvdGhlciBzaXRlcy4gVG8gbWFudWFsbHkgY3JlYXRlIGFcbiAqIGxvY2FsIHJlcHJlc2VudGF0aXZlIG9mIGEgTm90aWZpY2F0aW9uLCBkb1xuICogYGBganNcbiAqIGxvY2FsSXRlcmFibGUgPVxuICogICBtYWtlTm90aWZpZXIoRShyZW1vdGVJdGVyYWJsZSkuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFscygpKTtcbiAqIGBgYFxuICogVGhlIHJlc3VsdGluZyBgbG9jYWxJdGVyYWJsZWAgYWxzbyBzdXBwb3J0cyBzdWNoIHJlbW90ZSB1c2UsIGFuZFxuICogd2lsbCByZXR1cm4gYWNjZXNzIHRvIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vdGlmaWVyUmVjb3JkPFQ+IHRoZSBwcm9kdWNlZCBub3RpZmllci91cGRhdGVyIHBhaXJcbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHVwZGF0ZXIgdGhlIChjbG9zZWx5LWhlbGQpIG5vdGlmaWVyIHByb2R1Y2VyXG4gKiBAcHJvcGVydHkge05vdGlmaWVyPFQ+fSBub3RpZmllciB0aGUgKHdpZGVseS1oZWxkKSBub3RpZmllciBjb25zdW1lclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0l0ZXJhYmxlRWFjaFRvcGljPFQ+ICYgRWFjaFRvcGljPFQ+ICZcbiAqICAgU2hhcmFibGVTdWJzY3JpcHRpb248VD59IFN1YnNjcmlwdGlvbjxUPlxuICogQSBmb3JtIG9mIEFzeW5jSXRlcmFibGUgc3VwcG9ydGluZyBkaXN0cmlidXRlZCBhbmQgbXVsdGljYXN0IHVzYWdlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNoYXJhYmxlU3Vic2NyaXB0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8RWFjaFRvcGljPFQ+Pn0gZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBTdWJzY3JpcHRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VTdWJzY3JpcHRpb24oRShyZW1vdGVJdGVyYWJsZSkuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSk7XG4gKiBgYGBcbiAqIFRoZSByZXN1bHRpbmcgYGxvY2FsSXRlcmFibGVgIGFsc28gc3VwcG9ydHMgc3VjaCByZW1vdGUgdXNlLCBhbmRcbiAqIHdpbGwgcmV0dXJuIGFjY2VzcyB0byB0aGUgc2FtZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdWJzY3JpcHRpb25SZWNvcmQ8VD5cbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHB1YmxpY2F0aW9uXG4gKiBAcHJvcGVydHkge1N1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaXB0aW9uXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHRlbXBsYXRlIFtTbG90PXVua25vd25dIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuTWFyc2hhbDxTbG90Pn0gTWFyc2hhbGxlciAqL1xuLyoqIEB0eXBlZGVmIHtQaWNrPE1hcnNoYWxsZXIsICdmcm9tQ2FwRGF0YSc+fSBVbnNlcmlhbGl6ZXIgKi9cblxuLyoqXG4gKiBEZWZpbmVkIGJ5IHZzdG9yYWdlU3RvcmVLZXkgaW4gdnN0b3JhZ2UuZ29cbiAqXG4gKiBAdHlwZWRlZiBWU3RvcmFnZUtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlU3Via2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YVByZWZpeEJ5dGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vRGF0YVZhbHVlXVxuICovXG5cbi8qKlxuICogVGhpcyByZXByZXNlbnRzIGEgbm9kZSBpbiBhbiBJQVZMIHRyZWUuXG4gKlxuICogVGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB4L3ZzdG9yYWdlLCBhbiBBZ29yaWMgZXh0ZW5zaW9uIG9mIHRoZSBDb3Ntb3MgU0RLLlxuICpcbiAqIFZzdG9yYWdlIGlzIGEgaGllcmFyY2hpY2FsIGV4dGVybmFsbHktcmVhY2hhYmxlIHN0b3JhZ2Ugc3RydWN0dXJlIHRoYXRcbiAqIGlkZW50aWZpZXMgY2hpbGRyZW4gYnkgcmVzdHJpY3RlZCBBU0NJSSBuYW1lIGFuZCBpcyBhc3NvY2lhdGVkIHdpdGggYXJiaXRyYXJ5XG4gKiBzdHJpbmctdmFsdWVkIGRhdGEgZm9yIGVhY2ggbm9kZSwgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JhZ2VOb2RlXG4gKiBAcHJvcGVydHkgeyhkYXRhOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD59IHNldFZhbHVlIHB1Ymxpc2hlcyBzb21lIGRhdGEgKGFwcGVuZCB0byB0aGUgbm9kZSlcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8VlN0b3JhZ2VLZXk+fSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeyhzdWJQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7c2VxdWVuY2U/OiBib29sZWFufSkgPT4gU3RvcmFnZU5vZGV9IG1ha2VDaGlsZE5vZGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZEZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8c3RyaW5nPn0gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHtTdG9yYWdlTm9kZVsnZ2V0U3RvcmVLZXknXX0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoKSA9PiBVbnNlcmlhbGl6ZXJ9IGdldFVuc2VyaWFsaXplciBnZXQgdGhlIHVuc2VyaWFsaXplciBmb3IgdGhlIHN0b3JlZCBkYXRhXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgU3RvcmVkU3Vic2NyaWJlclxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtTdWJzY3JpcHRpb248VD4gJiB7XG4gKiAgIGdldFN0b3JlS2V5OiAoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5ICYgeyBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjxUPiB9PixcbiAqICAgZ2V0VW5zZXJpYWxpemVyOiAoKSA9PiBVbnNlcmlhbGl6ZXIsXG4gKiB9fSBTdG9yZWRTdWJzY3JpcHRpb25cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaWJlcjxUPiAmIFN0b3JlZEZhY2V0fSBTdG9yZWRTdWJzY3JpYmVyXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPmJcNlwBAABcAQAAIAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABqgKjv3AsAANwLAAAhAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyIsIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLCJAZW5kby9leG8iLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtdXSxbXCJAZW5kby9leG9cIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzXCIsIFtdXSxbXCIuL2xlZ2FjeS9sZWdhY3lNYXAuanNcIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiQGVuZG8vcGF0dGVybnMiOltbImlzS2V5IiwiaXNLZXkiXSxbImFzc2VydEtleSIsImFzc2VydEtleSJdLFsiYXNzZXJ0U2NhbGFyS2V5IiwiYXNzZXJ0U2NhbGFyS2V5Il0sWyJtYWtlQ29weVNldCIsIm1ha2VDb3B5U2V0Il0sWyJnZXRDb3B5U2V0S2V5cyIsImdldENvcHlTZXRLZXlzIl0sWyJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnIl0sWyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sWyJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlCYWdFbnRyaWVzIl0sWyJtYWtlQ29weU1hcCIsIm1ha2VDb3B5TWFwIl0sWyJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIl0sWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdLFsiY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIl0sWyJjb21wYXJlS2V5cyIsImNvbXBhcmVLZXlzIl0sWyJrZXlMVCIsImtleUxUIl0sWyJrZXlMVEUiLCJrZXlMVEUiXSxbImtleUVRIiwia2V5RVEiXSxbImtleUdURSIsImtleUdURSJdLFsia2V5R1QiLCJrZXlHVCJdLFsiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldENvbXBhcmUiLCJzZXRDb21wYXJlIl0sWyJzZXRVbmlvbiIsInNldFVuaW9uIl0sWyJzZXREaXNqb2ludFVuaW9uIiwic2V0RGlzam9pbnRVbmlvbiJdLFsic2V0SW50ZXJzZWN0aW9uIiwic2V0SW50ZXJzZWN0aW9uIl0sWyJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRTdWJ0cmFjdCJdLFsiYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il0sWyJNIiwiTSJdLFsiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIl0sWyJpc1BhdHRlcm4iLCJpc1BhdHRlcm4iXSxbImFzc2VydFBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIl0sWyJtYXRjaGVzIiwibWF0Y2hlcyJdLFsibXVzdE1hdGNoIiwibXVzdE1hdGNoIl1dLCJAZW5kby9leG8iOltbImluaXRFbXB0eSIsImluaXRFbXB0eSJdLFsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyJdLFsiZGVmaW5lRXhvQ2xhc3NLaXQiLCJkZWZpbmVFeG9DbGFzc0tpdCJdLFsibWFrZUV4byIsIm1ha2VFeG8iXV0sIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyI6W1sibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXV0sIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiXV0sIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyI6W1sibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiXV0sIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXV0sIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjpbWyJwcm92aWRlTGF6eSIsInByb3ZpZGVMYXp5Il1dLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiOltbIm1ha2VMZWdhY3lNYXAiLCJtYWtlTGVnYWN5TWFwIl1dLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjpbWyJtYWtlTGVnYWN5V2Vha01hcCIsIm1ha2VMZWdhY3lXZWFrTWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADir4B9RgsAAEYLAAAsAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMuanMiLCJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcSxGYWlsOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBhbmQgaXRzIGZyYXRlcm5hbCBzaWJsaW5nIGxlZ2FjeVdlYWtNYXAgZXhpc3Qgb25seSB0b1xuICogZWFzZSBhIHRyYW5zaXRpb24gdG8gdGhlIG1vZGVybiBgc3RvcmVgIHN5c3RlbSwgYXJlIGRlcHJlY2F0ZWQsXG4gKiBhbmQgd2lsbCBldmVudHVhbGx5IGRpc2FwcGVhci4gVGhleSBhcmUgbmVlZGVkIGZvciBub3cgdG8gc3VwcG9ydFxuICogc29tZSBvZiB0aGUgdXNlcyBvZiB0aGUgb2xkIGJlaGF2aW9yIHRoYXQgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGhcbiAqIHRoZSBuZXcuIFRoZSBjb25zdHJhaW50IGltcG9zZWQgYnkgdGhlIG5ldyBpcyB0aGF0IG9ubHkgcGFzc2FibGVzIGNhblxuICogYmUgdXNlZCBhcyB2YWx1ZXMsIGFuZCBvbmx5IGtleXMgKHJvdWdobHksIHN0cnVjdHVyZXMsIGFrYSBjb21wYXJhYmxlcylcbiAqIGNhbiBiZSB1c2VkIGFzIHZhbHVlcy5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvMzU2N1xuICogVE9ETyBPbmNlIHRoYXQgUFIgaXMgbWVyZ2VkLCBsaW5rIHRvIHRoZSBkb2N1bWVudHMgcmF0aGVyIHRoYW4gdGhlIFBScy5cbiAqXG4gKiBFYWNoIG9mIHRoZXNlIG5vbi1jb25mb3JtaW5nIHVzZXMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoIGFcbiAqIGBgYGpzXG4gKiAvLyBMZWdhY3kgYmVjYXVzZS4uLlxuICogYGBgXG4gKiBjb21tZW50IGV4cGxhaW5pbmcgdGhlIHByb2JsZW0gaW5oaWJpdGluZyBjb252ZXJzaW9uIHRvIHRoZSBuZXdcbiAqIHN5c3RlbS4gU29tZSBvZiB0aGVzZSBwcm9ibGVtcyBhcyBvZiB0aGlzIHdyaXRpbmc6XG4gKiAgICAqIEEgcHJvbWlzZUtpdCB1c2VkIGFzIGEgdmFsdWUsIGV2ZW4gdGhvdWdoIGEgcHJvbWlzZUtpdCBpcyBub3RcbiAqICAgICAgYSBwYXNzYWJsZS4gU29sdXRpb25zIGFyZSB0byBtYWtlIGl0IGEgcGFzc2FibGUsIG9yIHRvIGNvbnZlcnRcbiAqICAgICAgdGhlIGNvbnRhaW5lciBiYWNrIHRvIGEgY29udmVudGlvbmFsIEphdmFTY3JpcHQgTWFwLlxuICogICAgKiBBIG11dGFibGUgYXJyYXkgdXNlZCBhcyBhIHZhbHVlLCB0aGF0IGlzIHN1YnNlcXVlbnRseSBtdXRhdGVkLlxuICogICAgICBGcmVlemluZyB0aGUgYXJyYXkgd291bGRuJ3Qgd29yayBvZiBjb3Vyc2UgYmVjYXVzZSBpdCB3b3VsZCBicmVha1xuICogICAgICB0aGUgc3Vic2VxdWVudCBtdXRhdGlvbi4gVXNpbmcgYSBmYXIgb2JqZWN0IHdyYXBwaW5nIGFuIGFycmF5IHdvdWxkXG4gKiAgICAgIGxpa2VseSB3b3JrIGZpbmUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhck1hcCBpZiBwb3NzaWJsZSwgTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VMZWdhY3lNYXA9KHRhZz0na2V5Jyk9PntcbmNvbnN0IG09bmV3IE1hcCgpO1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiFtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbm0uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiBtLmhhcyhrZXkpO1xuIH0sXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbm0uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5yZXR1cm4gbS5nZXQoa2V5KTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbm0uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLmRlbGV0ZShrZXkpO1xuIH0sXG5rZXlzOigpPT5tLmtleXMoKSxcbnZhbHVlczooKT0+bS52YWx1ZXMoKSxcbmVudHJpZXM6KCk9Pm0uZW50cmllcygpLFxuZ2V0U2l6ZTooKT0+bS5zaXplLFxuY2xlYXI6KCk9Pm0uY2xlYXIoKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lNYXAobWFrZUxlZ2FjeU1hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeU1hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeU1hcCI6WyJtYWtlTGVnYWN5TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKaDTbTCBgAAwgYAADAAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMuanMiLCJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHEsRmFpbDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG4vKipcbiAqIFNlZSBkb2Njb21tZW50IGluIHRoZSBjbG9zZWx5IHJlbGF0ZWQgYGxlZ2FjeU1hcC5qc2AgbW9kdWxlLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJXZWFrTWFwIGlmIHBvc3NpYmxlLCBXZWFrTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lXZWFrTWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTGVnYWN5V2Vha01hcD0odGFnPSdrZXknKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSAqL1xuY29uc3Qgd209bmV3IFdlYWtNYXAoKTtcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hd20uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9Plxud20uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiB3bS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtWfSAqL3dtLmdldChrZXkpKTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xud20uZGVsZXRlKGtleSk7XG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lXZWFrTWFwKG1ha2VMZWdhY3lXZWFrTWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5V2Vha01hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeVdlYWtNYXAiOlsibWFrZUxlZ2FjeVdlYWtNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmgO61xYWAAAWFgAAMQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLGZpbHRlckl0ZXJhYmxlLG1hcEl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weU1hcCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjigI1fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaOKAjV9hKV1dLFtcIm1hcEl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChtYXBJdGVyYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weU1hcFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlNYXAgPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIi4vc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kc1wiLCBbJGjigI1fYSA9PiAobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsIFskaOKAjV9hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge01hcDxLLFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKX0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ11cbiAqIEByZXR1cm5zIHtNYXBTdG9yZTxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZU1hcFN0b3JlTWV0aG9kcz0oXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxudGFnPSdrZXknKT0+XG57XG5jb25zdHthc3NlcnRVcGRhdGVPbkFkZCxhc3NlcnRVcGRhdGVPbkRlbGV0ZSxpdGVyYWJsZUtleXN9PVxubWFrZUN1cnJlbnRLZXlzS2l0KFxuKCk9PmpzbWFwLmtleXMoKSxcbihrKT0+anNtYXAuaGFzKGspLFxuY29tcGFyZVJhbmssXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlLFxudGFnKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbmNvbnN0IGtleXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGl0ZXJhYmxlS2V5cztcbiB9XG5jb25zdCBmaWx0ZXI9KGspPT57XG5pZihrZXlQYXR0IT09dW5kZWZpbmVkJiYhbWF0Y2hlcyhrLGtleVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vKiBVc2VzIHRoZSBjdXJyZW50IGpzbWFwIHZhbHVlLCBzaW5jZSB0aGUgaXRlcmF0YXRvciBzdXJ2aXZlcyBgLnNldGAqL1xuaWYodmFsdWVQYXR0IT09dW5kZWZpbmVkJiYhbWF0Y2hlcyhqc21hcC5nZXQoayksdmFsdWVQYXR0KSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcbnJldHVybiBmaWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsZmlsdGVyKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Vj59XG4gKi9cbmNvbnN0IHZhbHVlcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT4vKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGspKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHBhcmFtIHtQYXR0ZXJufSBbdmFsdWVQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuY29uc3QgZW50cmllcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT5bXG5rLFxuLyoqIEB0eXBlIHtWfSAqL2pzbWFwLmdldChrKV0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbi8qKiBAdHlwZSB7KGs6IEssIHY6IFYpID0+IHZvaWR9ICovYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbnRhZyksXG5cbmtleXMsXG52YWx1ZXMsXG5lbnRyaWVzLFxuXG5zbmFwc2hvdDooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFrZUNvcHlNYXAoZW50cmllcyhrZXlQYXR0LHZhbHVlUGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQ/XG5qc21hcC5zaXplOlxuWy4uLmtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+e1xuaWYoa2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkKXtcbmpzbWFwLmNsZWFyKCk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSl7XG5qc21hcC5kZWxldGUoa2V5KTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gYWRkaW5nIGEgbmV3IGtleSAoaW5pdCkgYW5kIHVwZGF0aW5nIG9yXG4gKiByZWZlcmVuY2luZyBhIGtleSAoZ2V0LCBzZXQsIGRlbGV0ZSkuXG4gKlxuICogYGluaXRgIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuIGBHZXRgLFxuICogYHNldGAgYW5kIGBkZWxldGVgIGFyZSBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIGFscmVhZHkgZXhpc3QuXG4gKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIG1hcCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlTWFwcyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0aGUgY29sdW1uIG5hbWUgZm9yIHRoZSBrZXlcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtNYXBTdG9yZTxLLFY+fVxuICovJGjigI1fb25jZS5tYWtlTWFwU3RvcmVNZXRob2RzKG1ha2VNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJNYXBTdG9yZT0oXG50YWc9J2tleScsXG57a2V5U2hhcGU9dW5kZWZpbmVkLHZhbHVlU2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNtYXA9bmV3IE1hcCgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S1ZPa1RvU2V0PShfa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4odmFsdWUpO1xuXG5hc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaCh2YWx1ZSx2YWx1ZVNoYXBlLCdtYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5cbmFzc2VydFNjYWxhcktleShrZXkpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnbWFwU3RvcmUga2V5Jyk7XG4gfVxuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBNYXBTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJNYXBTdG9yZShtYWtlU2NhbGFyTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcFN0b3JlTWV0aG9kcyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnQOWIEEPAABBDwAAMQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5U2V0XCIsIFskaOKAjV9hID0+IChtYWtlQ29weVNldCA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzXCIsIFskaOKAjV9hID0+IChtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtTZXQ8Sz59IGpzc2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRLZXlPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXRTdG9yZU1ldGhvZHM9KFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdHthc3NlcnRVcGRhdGVPbkFkZCxhc3NlcnRVcGRhdGVPbkRlbGV0ZSxpdGVyYWJsZUtleXN9PVxubWFrZUN1cnJlbnRLZXlzS2l0KFxuKCk9Pmpzc2V0LmtleXMoKSxcbihrKT0+anNzZXQuaGFzKGspLFxuY29tcGFyZVJhbmssXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbmtleU5hbWUpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/XG5pdGVyYWJsZUtleXM6XG5maWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsKGspPT5tYXRjaGVzKGssa2V5UGF0dCkpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKFxuanNzZXQsXG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxua2V5TmFtZSksXG5cblxua2V5cyxcblxudmFsdWVzOmtleXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCk9Pm1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZD9qc3NldC5zaXplOlsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQpe1xuanNzZXQuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpe1xuanNzZXQuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVNldFN0b3JlTWV0aG9kcyhtYWtlU2V0U3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2tleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyBTZXQoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S2V5T2tUb0FkZD0oa2V5KT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCdzZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VTZXRTdG9yZU1ldGhvZHMoanNzZXQsYXNzZXJ0S2V5T2tUb0FkZCx1bmRlZmluZWQsdGFnKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJTZXRTdG9yZShtYWtlU2NhbGFyU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVNldFN0b3JlTWV0aG9kcyI6WyJtYWtlU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGUFp2OMSAADjEgAANQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4vc3RvcmUtdXRpbHMuanMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLHBhc3NTdHlsZU9mLGdldENvcHlNYXBFbnRyaWVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weU1hcDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldENvcHlNYXBFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wiaXNDb3B5TWFwXCIsIFskaOKAjV9hID0+IChpc0NvcHlNYXAgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPn0ganNtYXBcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb0FkZFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvU2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzPShcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIWpzbWFwLmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcblxuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbmpzbWFwLmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4ganNtYXAuaGFzKGtleSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4vKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoa2V5KSk7XG4gfSxcblxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG5hc3NlcnRLVk9rVG9BZGQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH0sXG5zZXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmlmKGFzc2VydEtleU9rVG9EZWxldGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuIH1cbmpzbWFwLmRlbGV0ZShrZXkpO1xuIH0sXG5cbmFkZEFsbDooZW50cmllcyk9PntcbmlmKGlzQ29weU1hcChlbnRyaWVzKSl7XG5lbnRyaWVzPWdldENvcHlNYXBFbnRyaWVzKGVudHJpZXMpO1xuIH1cbmZvcihjb25zdFtrZXksdmFsdWVdb2YvKiogQHR5cGUge0l0ZXJhYmxlPFtLLCBWXT59ICovZW50cmllcyl7XG4vKiBEb24ndCBhc3NlcnQgdGhhdCB0aGUga2V5IGVpdGhlciBkb2VzIG9yIGRvZXMgbm90IGV4aXN0LiovXG5hc3NlcnRLVk9rVG9BZGQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBtYXBTdG9yZSBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXM6XG4gKiBwcmltaXRpdmVzIG9yIHJlbW90YWJsZXMuXG4gKiBPdGhlciBtYXBTdG9yZXMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIFRPRE8gRm9yIG5vdywgdGhpcyBzY2FsYXJXZWFrTWFwIGFjY2VwdHMgb25seSByZW1vdGFibGVzLCByZWZsZWN0aW5nIHRoZVxuICogY29uc3RyYWludHMgb2YgdGhlIHVuZGVybHlpbmcgSmF2YVNjcmlwdCBXZWFrTWFwIGl0IHVzZXMgaW50ZXJuYWxseS4gQnV0XG4gKiBpdCBzaG91bGQgYWNjZXB0IHRoZSBwcmltaXRpdmVzIGFzIHdlbGwsIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGludGVybmFsXG4gKiBtYXAuIFdoYXQgbWFrZXMgaXQgXCJ3ZWFrXCIgaXMgdGhhdCBpdCBwcm92aWRlcyBubyBBUEkgZm9yIGVudW1lcmF0aW5nIHdoYXQnc1xuICogdGhlcmUuIFRob3VnaCBub3RlIHRoYXQgdGhpcyB3b3VsZCBvbmx5IGVuYWJsZXMgY29sbGVjdGlvbiBvZiB0aGVcbiAqIHJlbW90YWJsZXMsIHNpbmNlIHRoZSBvdGhlciBwcmltaXRpdmVzIG1heSBhbHdheXMgcmVhcHBlYXIuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrTWFwU3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZCx2YWx1ZVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzbWFwPW5ldyhsb25nTGl2ZWQ/V2Vha01hcDpNYXApKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKHZhbHVlLHZhbHVlU2hhcGUsJ3dlYWtNYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrTWFwU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnd2Vha01hcFN0b3JlIGtleScpO1xuIH1cbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgV2Vha01hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUobWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG2sP72EDgAAhA4AADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixwYXNzU3R5bGVPZixnZXRDb3B5U2V0S2V5cyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlTZXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJpc0NvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKGlzQ29weVNldCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7V2Vha1NldDxLICYgb2JqZWN0Pn0ganNzZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IGFzc2VydEtleU9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzPShcbmpzc2V0LFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbmpzc2V0LmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgc2V0LiovXG5yZXR1cm4ganNzZXQuaGFzKGtleSk7XG4gfSxcblxuYWRkOihrZXkpPT57XG5hc3NlcnRLZXlPa1RvQWRkKGtleSk7XG5qc3NldC5hZGQoa2V5KTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmlmKGFzc2VydEtleU9rVG9EZWxldGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuIH1cbmpzc2V0LmRlbGV0ZShrZXkpO1xuIH0sXG5cbmFkZEFsbDooa2V5cyk9PntcbmlmKGlzQ29weVNldChrZXlzKSl7XG5rZXlzPWdldENvcHlTZXRLZXlzKGtleXMpO1xuIH1cbmZvcihjb25zdCBrZXkgb2YvKiogQHR5cGUge0l0ZXJhYmxlPEs+fSAqL2tleXMpe1xuYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuanNzZXQuYWRkKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIHNldCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlU2V0cyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIFRPRE8gRm9yIG5vdywgdGhpcyBzY2FsYXJXZWFrU2V0IGFjY2VwdHMgb25seSByZW1vdGFibGVzLCByZWZsZWN0aW5nIHRoZVxuICogY29uc3RyYWludHMgb2YgdGhlIHVuZGVybHlpbmcgSmF2YVNjcmlwdCBXZWFrU2V0IGl0IHVzZXMgaW50ZXJuYWxseS4gQnV0XG4gKiBpdCBzaG91bGQgYWNjZXB0IHRoZSBwcmltaXRpdmVzIGFzIHdlbGwsIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGludGVybmFsXG4gKiBzZXQuIFdoYXQgbWFrZXMgaXQgXCJ3ZWFrXCIgaXMgdGhhdCBpdCBwcm92aWRlcyBubyBBUEkgZm9yIGVudW1lcmF0aW5nIHdoYXQnc1xuICogdGhlcmUuIFRob3VnaCBub3RlIHRoYXQgdGhpcyB3b3VsZCBvbmx5IGVuYWJsZXMgY29sbGVjdGlvbiBvZiB0aGVcbiAqIHJlbW90YWJsZXMsIHNpbmNlIHRoZSBvdGhlciBwcmltaXRpdmVzIG1heSBhbHdheXMgYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyhsb25nTGl2ZWQ/V2Vha1NldDpTZXQpKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtleU9rVG9BZGQ9KGtleSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnd2Vha1NldFN0b3JlIGtleScpO1xuIH1cbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFdlYWtTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKGpzc2V0LGFzc2VydEtleU9rVG9BZGQsdW5kZWZpbmVkLHRhZyl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACy12MInRkAAJ0ZAAAuAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJhcHBlbmRUb1N0b3JlZEFycmF5IiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUN1cnJlbnRLZXlzS2l0IiwicHJvdmlkZUxhenkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLE0sbWF0Y2hlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIFNob3VsZCBiZWhhdmUgaWRlbnRpY2FsbHkgdG8gdGhlIG9uZSBpbiBgQGVuZG8vcGF0dGVybnNgLCBidXRcbiAqIHJlaW1wbGVtZW50ZWQgZm9yIG5vdyBiZWNhdXNlIGBAZW5kby9wYXR0ZXJuc2AgZm9yZ290IHRvIGV4cG9ydCB0aGlzIG9uZS5cbiAqIFRoaXMgb25lIGlzIHNpbXBsZSBlbm91Z2ggdGhhdCBJIHByZWZlciBhIHJlaW1wbGVtZW50YXRpb24gdG8gYSBkZWVwIGltcG9ydC5cbiAqIFRPRE86IFVuZGF0ZSBgQGVuZG8vcGF0dGVybnNgIHRvIGV4cG9ydCB0aGUgb3JpZ2luYWwsIGFuZCBkZWxldGUgdGhlXG4gKiByZWltcGxlbWVudGF0aW9uIGhlcmUuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHJldHVybnMge3MgaXMgQ29weVNldH1cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weVNldD0ocyk9Pm1hdGNoZXMocyxNLnNldCgpKTtcblxuLyoqXG4gKiBTaG91bGQgYmVoYXZlIGlkZW50aWNhbGx5IHRvIHRoZSBvbmUgaW4gYEBlbmRvL3BhdHRlcm5zYCwgYnV0XG4gKiByZWltcGxlbWVudGVkIGZvciBub3cgYmVjYXVzZSBgQGVuZG8vcGF0dGVybnNgIGZvcmdvdCB0byBleHBvcnQgdGhpcyBvbmUuXG4gKiBUaGlzIG9uZSBpcyBzaW1wbGUgZW5vdWdoIHRoYXQgSSBwcmVmZXIgYSByZWltcGxlbWVudGF0aW9uIHRvIGEgZGVlcCBpbXBvcnQuXG4gKiBUT0RPOiBVbmRhdGUgYEBlbmRvL3BhdHRlcm5zYCB0byBleHBvcnQgdGhlIG9yaWdpbmFsLCBhbmQgZGVsZXRlIHRoZVxuICogcmVpbXBsZW1lbnRhdGlvbiBoZXJlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHttIGlzIENvcHlNYXB9XG4gKi8kaOKAjV9vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuY29uc3QgICAgICAgIGlzQ29weU1hcD0obSk9Pm1hdGNoZXMobSxNLm1hcCgpKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDdXJyZW50S2V5c0tpdFxuICogQHByb3BlcnR5IHsoazogSywgdj86IFYpID0+IHZvaWR9IGFzc2VydFVwZGF0ZU9uQWRkXG4gKiBAcHJvcGVydHkgeyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkRlbGV0ZVxuICogQHByb3BlcnR5IHtJdGVyYWJsZTxLPn0gaXRlcmFibGVLZXlzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0geygpID0+IEl0ZXJhYmxlPEs+fSBnZXRSYXdLZXlzXG4gKiBAcGFyYW0geyhrOiBLKSA9PiBib29sZWFufSBjaGVja0hhc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHsoazogSywgdj86IFYpID0+IHZvaWR9IGFzc2VydE9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge0N1cnJlbnRLZXlzS2l0PEssVj59XG4gKi8kaOKAjV9vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuY29uc3QgICAgICAgIG1ha2VDdXJyZW50S2V5c0tpdD0oXG5nZXRSYXdLZXlzLFxuY2hlY2tIYXMsXG5jb21wYXJlLFxuYXNzZXJ0T2tUb0FkZCxcbmFzc2VydE9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xubGV0IHVwZGF0ZUNvdW50PTA7XG5sZXQgc29ydGVkS2V5c01lbW87XG5cbmNvbnN0IGFzc2VydFVwZGF0ZU9uQWRkPShrLHY9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0T2tUb0FkZChrLHYpO1xudXBkYXRlQ291bnQrPTE7XG5zb3J0ZWRLZXlzTWVtbz11bmRlZmluZWQ7XG4gfTtcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25EZWxldGU9KGspPT5hc3NlcnRPa1RvRGVsZXRlJiZhc3NlcnRPa1RvRGVsZXRlKGspO1xuXG5jb25zdCBnZXRTb3J0ZWRLZXlzPSgpPT57XG5pZihzb3J0ZWRLZXlzTWVtbz09PXVuZGVmaW5lZCl7XG5zb3J0ZWRLZXlzTWVtbz1oYXJkZW4oWy4uLmdldFJhd0tleXMoKV0uc29ydChjb21wYXJlKSk7XG4gfVxucmV0dXJuIHNvcnRlZEtleXNNZW1vO1xuIH07XG5cbmNvbnN0IGl0ZXJhYmxlS2V5cz1GYXIoJ0l0ZXJhYmxlIG9mIGtleXMnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBnZW5lcmF0aW9uPXVwZGF0ZUNvdW50O1xuZ2V0U29ydGVkS2V5cygpO1xuY29uc3QgbGVuPXNvcnRlZEtleXNNZW1vLmxlbmd0aDtcbmxldCBpPTA7XG5yZXR1cm4gRmFyKCdJdGVyYXRvciBvZiBrZXlzJyx7XG5uZXh0OigpPT57XG5nZW5lcmF0aW9uPT09dXBkYXRlQ291bnR8fEZhaWwgYFN0b3JlICR7cShrZXlOYW1lKX0gY3Vyc29yIHN0YWxlYDtcbi8qIElmIHRoZXkncmUgZXF1YWwsIHRoZW4gdGhlIHNvcnRlZEtleU1lbW8gaXMgdGhlIHNhbWUgb25lKi9cbi8qIHdlIHN0YXJ0ZWQgd2l0aC4qL1xuZm9yKDs7KXtcbmlmKGk8bGVuKXtcbmNvbnN0IHZhbHVlPXNvcnRlZEtleXNNZW1vW2ldO1xuaSs9MTtcbmlmKGNoZWNrSGFzKHZhbHVlKSl7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfVxuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbml0ZXJhYmxlS2V5c30pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VDdXJyZW50S2V5c0tpdChtYWtlQ3VycmVudEtleXNLaXQpO1xuaGFyZGVuKG1ha2VDdXJyZW50S2V5c0tpdCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUxhenlgIHRvIGdldCBvciBtYWtlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS5cbiAqIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yXG4gKiB0aGF0IGtleSwgYW5kIHJldHVybiBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxLLFY+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVMYXp5PShtYXBTdG9yZSxrZXksbWFrZVZhbHVlKT0+e1xuaWYoIW1hcFN0b3JlLmhhcyhrZXkpKXtcbm1hcFN0b3JlLmluaXQoa2V5LG1ha2VWYWx1ZShrZXkpKTtcbiB9XG5yZXR1cm4gbWFwU3RvcmUuZ2V0KGtleSk7XG4gfTskaOKAjV9vbmNlLnByb3ZpZGVMYXp5KHByb3ZpZGVMYXp5KTtcbmhhcmRlbihwcm92aWRlTGF6eSk7XG5cbi8qKlxuICogSGVscGVyIGZvciB1c2UgY2FzZXMgaW4gd2hpY2ggdGhlIG1ha2VyIGZ1bmN0aW9uIGlzIGFzeW5jLlxuICogRm9yIHR3byBwcm92aWRlTGF6eSBjYWxscyB3aXRoIHRoZSBzYW1lIGtleSwgb25lIG1heSBiZSBtYWtpbmcgd2hlbiB0aGVcbiAqIG90aGVyIGNhbGwgc3RhcnRzIGFuZCBpdCB3b3VsZCBtYWtlIGFnYWluLlxuICogKFRoZW4gdGhlcmUnZCBiZSBhIGNvbGxpc2lvbiB3aGVuIHRoZSBzZWNvbmQgdHJpZXMgdG8gc3RvcmVcbiAqIHRoZSBrZXkuKSBUaGlzIHByZXZlbnRzIHRoYXQgcmFjZSBjb25kaXRpb24gYnkgaW1tZWRpYXRlbHkgc3RvcmluZyBhIFByb21pc2VcbiAqIGZvciB0aGUgbWFrZXIgaW4gYW4gZXBoZW1lcmFsIHN0b3JlLlxuICpcbiAqIFdoZW4gdGhlIGBzdG9yZWAgYXJndW1lbnQgaXMgZHVyYWJsZSBzdG9yYWdlLCBub3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3JcbiAqIHRlcm1pbmF0aW9uIHRvIGhhcHBlbiBhZnRlciB0aGUgbWFrZSBjb21wbGV0ZXMgYW5kIGJlZm9yZSBpdCByZWFjaGVzIGR1cmFibGVcbiAqIHN0b3JhZ2UuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxLLCBWPn0gc3RvcmVcbiAqL1xuY29uc3QgICAgICAgIG1ha2VBdG9taWNQcm92aWRlcj0oc3RvcmUpPT57XG4vKiogQHR5cGUge01hcDxLLCBQcm9taXNlPFY+Pn0gKi9cbmNvbnN0IHBlbmRpbmc9bmV3IE1hcCgpO1xuXG4vKipcbiAqIENhbGwgYHByb3ZpZGVBc3luY2AgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LFxuICogd2hlbiB0aGUgbWFrZXIgaXMgYXN5bmNocm9ub3VzLlxuICogSWYgdGhlcmUgYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsXG4gKiBjYWxsIGBtYWtlVmFsdWUoa2V5KWAsIHJlbWVtYmVyIGl0IGFzIHRoZSB2YWx1ZSBmb3JcbiAqIHRoYXQga2V5LCBhbmQgcmV0dXJuIGl0LlxuICpcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFByb21pc2U8Vj59IG1ha2VWYWx1ZSBtYWtlIHRoZSB2YWx1ZSBmb3IgdGhlIHN0b3JlXG4gKiBpZiBpdCBoYXNuJ3QgYmVlbiBtYWRlIHlldCBvciB0aGUgbGFzdCBtYWtlIGZhaWxlZFxuICogQHBhcmFtIHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gUHJvbWlzZTx2b2lkPn0gW2ZpbmlzaFZhbHVlXSBydW5zIGV4YWN0bHlcbiAqIG9uY2UgYWZ0ZXIgYSBuZXcgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIHN0b3JlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxWPn1cbiAqL1xuY29uc3QgcHJvdmlkZUFzeW5jPShrZXksbWFrZVZhbHVlLGZpbmlzaFZhbHVlKT0+e1xuaWYoc3RvcmUuaGFzKGtleSkpe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShzdG9yZS5nZXQoa2V5KSk7XG4gfVxuaWYoIXBlbmRpbmcuaGFzKGtleSkpe1xuY29uc3QgdmFsUD1tYWtlVmFsdWUoa2V5KS5cbnRoZW4oKHYpPT57XG5zdG9yZS5pbml0KGtleSx2KTtcbnJldHVybiB2O1xuIH0pLlxudGhlbigodik9PntcbmlmKGZpbmlzaFZhbHVlKXtcbnJldHVybiBmaW5pc2hWYWx1ZShrZXksdikudGhlbigoKT0+dik7XG4gfVxucmV0dXJuIHY7XG4gfSkuXG5maW5hbGx5KCgpPT57XG5wZW5kaW5nLmRlbGV0ZShrZXkpO1xuIH0pO1xucGVuZGluZy5zZXQoa2V5LHZhbFApO1xuIH1cbmNvbnN0IHZhbFA9cGVuZGluZy5nZXQoa2V5KTtcbmFzc2VydCh2YWxQKTtcbnJldHVybiB2YWxQO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe3Byb3ZpZGVBc3luY30pO1xuIH07JGjigI1fb25jZS5tYWtlQXRvbWljUHJvdmlkZXIobWFrZUF0b21pY1Byb3ZpZGVyKTtcbmhhcmRlbihtYWtlQXRvbWljUHJvdmlkZXIpO1xuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXRvbWljUHJvdmlkZXI8SywgVj4+fSBBdG9taWNQcm92aWRlcjxLLCBWPlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssIFZcbiAqIEBwYXJhbSB7TWFwU3RvcmU8SywgVltdPn0gbWFwU3RvcmVcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0ge1Z9IGl0ZW1cbiAqL1xuY29uc3QgICAgICAgIGFwcGVuZFRvU3RvcmVkQXJyYXk9KG1hcFN0b3JlLGtleSxpdGVtKT0+e1xuaWYobWFwU3RvcmUuaGFzKGtleSkpe1xuY29uc3QgZXh0YW50PW1hcFN0b3JlLmdldChrZXkpO1xubWFwU3RvcmUuc2V0KGtleSxoYXJkZW4oWy4uLmV4dGFudCxpdGVtXSkpO1xuIH1lbHNle1xubWFwU3RvcmUuaW5pdChrZXksaGFyZGVuKFtpdGVtXSkpO1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwZW5kVG9TdG9yZWRBcnJheShhcHBlbmRUb1N0b3JlZEFycmF5KTtcbmhhcmRlbihhcHBlbmRUb1N0b3JlZEFycmF5KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0Il0sImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiXSwibWFrZUN1cnJlbnRLZXlzS2l0IjpbIm1ha2VDdXJyZW50S2V5c0tpdCJdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSJdLCJtYWtlQXRvbWljUHJvdmlkZXIiOlsibWFrZUF0b21pY1Byb3ZpZGVyIl0sImFwcGVuZFRvU3RvcmVkQXJyYXkiOlsiYXBwZW5kVG9TdG9yZWRBcnJheSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADFAKyCWCoAAFgqAAAhAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVRhZ2dlZH0gQ29weVRhZ2dlZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXkgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlcicpLlJhbmtDb21wYXJpc29ufSBSYW5rQ29tcGFyaXNvbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG4vKiBQbGFjZWhvbGRlciByZWR1bmRhbnQgdHlwZXMsIHRvIGJlIGltcG9ydGVkIGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkLiovXG5cbi8qKlxuICogQHR5cGVkZWYge1Bhc3NhYmxlfSBLZXlcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1Bhc3NhYmxlfSBQYXR0ZXJuXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5U2V0JyxcbiAqICAgcGF5bG9hZDogQXJyYXk8Sz4sXG4gKiB9fSBDb3B5U2V0XG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5QmFnJyxcbiAqICAgcGF5bG9hZDogQXJyYXk8W0ssIGJpZ2ludF0+LFxuICogfX0gQ29weUJhZ1xuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XVxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gW1Y9UGFzc2FibGVdXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5TWFwJyxcbiAqICAgcGF5bG9hZDogeyBrZXlzOiBBcnJheTxLPiwgdmFsdWVzOiBBcnJheTxWPiB9LFxuICogfX0gQ29weU1hcFxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHdWFyZE1ha2Vyc1xuICogQHByb3BlcnR5IHs8TSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+KGludGVyZmFjZU5hbWU6IHN0cmluZyxcbiAqICAgICAgICAgICAgIG1ldGhvZEd1YXJkczogTSxcbiAqICAgICAgICAgICAgIG9wdGlvbnM/OiB7c2xvcHB5PzogYm9vbGVhbn1cbiAqICkgPT4gSW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZVxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKlxuICogQHByb3BlcnR5IHsoLi4uYXJnR3VhcmRzOiBBcmdHdWFyZFtdKSA9PiBNZXRob2RHdWFyZE1ha2VyfSBjYWxsIEd1YXJkIGEgc3luY2hyb25vdXMgY2FsbFxuICpcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ0d1YXJkczogQXJnR3VhcmRbXSkgPT4gTWV0aG9kR3VhcmRNYWtlcn0gY2FsbFdoZW4gR3VhcmQgYW4gYXN5bmMgY2FsbFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFyZ0d1YXJkOiBBcmdHdWFyZCkgPT4gQXJnR3VhcmR9IGF3YWl0IEd1YXJkIGFuIGF3YWl0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IE1ldGhvZFxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICoga2xhc3M6ICdJbnRlcmZhY2UnLFxuICogaW50ZXJmYWNlTmFtZTogc3RyaW5nLFxuICogbWV0aG9kR3VhcmRzOiBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBNZXRob2RHdWFyZD5cbiAqIHNsb3BweT86IGJvb2xlYW5cbiAqIH19IEludGVyZmFjZUd1YXJkXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHthbnl9IE1ldGhvZEd1YXJkTWFrZXJcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sga2xhc3M6ICdtZXRob2RHdWFyZCcsIGNhbGxLaW5kOiAnc3luYycgfCAnYXN5bmMnLCByZXR1cm5HdWFyZDogdW5rbm93biB9fSBNZXRob2RHdWFyZFxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7YW55fSBBcmdHdWFyZFxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlT3B0aW9uc1xuICogT2YgdGhlIGRpbWVuc2lvbnMgb24gd2hpY2ggS2V5ZWRTdG9yZXMgY2FuIGRpZmZlciwgd2Ugb25seSByZXByZXNlbnQgYSBmZXdcbiAqIG9mIHRoZW0gYXMgc3RhbmRhcmQgb3B0aW9ucy4gQSBnaXZlbiBzdG9yZSBtYWtlciBzaG91bGQgZG9jdW1lbnQgd2hpY2hcbiAqIG9wdGlvbnMgaXQgc3VwcG9ydHMsIGFzIHdlbGwgYXMgaXRzIHBvc2l0aW9ucyBvbiBkaW1lbnNpb25zIGZvciB3aGljaCBpdFxuICogZG9lcyBub3Qgc3VwcG9ydCBvcHRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbG9uZ0xpdmVkPXRydWVdIFdoaWNoIHdheSB0byBvcHRpbWl6ZSBhIHdlYWsgc3RvcmUuIFRydWUgbWVhbnNcbiAqIHRoYXQgd2UgZXhwZWN0IHRoaXMgd2VhayBzdG9yZSB0byBvdXRsaXZlIG1vc3Qgb2YgaXRzIGtleXMsIGluIHdoaWNoXG4gKiBjYXNlIHdlIGludGVybmFsbHkgbWF5IHVzZSBhIEphdmFTY3JpcHQgYFdlYWtNYXBgLiBPdGhlcndpc2Ugd2UgaW50ZXJuYWxseVxuICogbWF5IHVzZSBhIEphdmFTY3JpcHQgYE1hcGAuXG4gKiBEZWZhdWx0cyB0byB0cnVlLCBzbyBwbGVhc2UgbWFyayBzaG9ydCBsaXZlZCBzdG9yZXMgZXhwbGljaXRseS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2R1cmFibGU9ZmFsc2VdICBUaGUgY29udGVudHMgb2YgdGhpcyBzdG9yZSBzdXJ2aXZlIHRlcm1pbmF0aW9uXG4gKiAgIG9mIGl0cyBjb250YWluaW5nIHByb2Nlc3MsIGFsbG93aW5nIGZvciByZXN0YXJ0IG9yIHVwZ3JhZGUgYnV0IGF0IHRoZSBjb3N0XG4gKiAgIG9mIGZvcmJpZGRpbmcgc3RvcmFnZSBvZiByZWZlcmVuY2VzIHRvIGVwaGVtZXJhbCBkYXRhLiAgRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWtlRHVyYWJsZT1mYWxzZV0gIFRoaXMgc3RvcmUgcHJldGVuZHMgdG8gYmUgYSBkdXJhYmxlIHN0b3JlXG4gKiAgIGJ1dCBkb2VzIG5vdCBlbmZvcmNlIHRoYXQgdGhlIHRoaW5ncyBzdG9yZWQgaW4gaXQgYWN0dWFsbHkgYmUgdGhlbXNlbHZlc1xuICogICBkdXJhYmxlICh3aGVyZWFzIGFuIGFjdHVhbCBkdXJhYmxlIHN0b3JlIHdvdWxkIGZvcmJpZCBzdG9yYWdlIG9mIHN1Y2hcbiAqICAgaXRlbXMpLiAgVGhpcyBpcyBpbiBzZXJ2aWNlIG9mIGFsbG93aW5nIGluY3JlbWVudGFsIHRyYW5zaXRpb24gdG8gdXNlIG9mXG4gKiAgIGR1cmFibGUgc3RvcmVzLCB0byBlbmFibGUgbm9ybWFsIG9wZXJhdGlvbiBhbmQgdGVzdGluZyB3aGVuIHNvbWUgc3R1ZmZcbiAqICAgaW50ZW5kZWQgdG8gZXZlbnR1YWxseSBiZSBkdXJhYmxlIGhhcyBub3QgeWV0IGJlZW4gbWFkZSBkdXJhYmxlLiAgQSBzdG9yZVxuICogICBtYXJrZWQgYXMgZmFrZUR1cmFibGUgd2lsbCBhcHBlYXIgdG8gb3BlcmF0ZSBub3JtYWxseSBidXQgYW55IGF0dGVtcHQgdG9cbiAqICAgdXBncmFkZSBpdHMgY29udGFpbmluZyB2YXQgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IuXG4gKiBAcHJvcGVydHkge1BhdHRlcm59IFtrZXlTaGFwZV1cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybn0gW3ZhbHVlU2hhcGVdXG4gKi9cblxuLyoqXG4gKiBNb3N0IHN0b3JlIG1ldGhvZHMgYXJlIGluIG9uZSBvZiB0aHJlZSBjYXRlZ29yaWVzXG4gKiAgICogbG9va3VwIG1ldGhvZHMgKGBoYXNgLGBnZXRgKVxuICogICAqIHVwZGF0ZSBtZXRob2RzIChgYWRkYCxgaW5pdGAsYHNldGAsYGRlbGV0ZWAsYGFkZEFsbGApXG4gKiAgICogcXVlcnkgbWV0aG9kcyAoYHNuYXBzaG90YCxga2V5c2AsYHZhbHVlc2AsYGVudHJpZXNgLGBnZXRTaXplYClcbiAqICAgKiBxdWVyeS11cGRhdGUgbWV0aG9kcyAoYGNsZWFyYClcbiAqXG4gKiBXZWFrU3RvcmVzIGhhdmUgdGhlIGxvb2t1cCBhbmQgdXBkYXRlIG1ldGhvZHMgYnV0IG5vdCB0aGUgcXVlcnlcbiAqIG9yIHF1ZXJ5LXVwZGF0ZSBtZXRob2RzLlxuICogTm9uLXdlYWsgU3RvcmVzIGFyZSBsaWtlIHRoZWlyIGNvcnJlc3BvbmRpbmcgV2Vha1N0b3JlcywgYnV0IHdpdGggdGhlXG4gKiBhZGRpdGlvbmFsIHF1ZXJ5IGFuZCBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5ICYgb2JqZWN0fSBbSz1LZXldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXZWFrU2V0U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gYWRkXG4gKiBBZGQgdGhlIGtleSB0byB0aGUgc2V0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiBEbyBub3RoaW5nIHNpbGVudGx5IGlmXG4gKiBhbHJlYWR5IHRoZXJlLlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5czogQ29weVNldDxLPiB8IEl0ZXJhYmxlPEs+KSA9PiB2b2lkfSBhZGRBbGxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXRTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBhZGRcbiAqIEFkZCB0aGUga2V5IHRvIHRoZSBzZXQgaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmUuIERvIG5vdGhpbmcgc2lsZW50bHkgaWZcbiAqIGFscmVhZHkgdGhlcmUuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXlzOiBDb3B5U2V0PEs+IHwgSXRlcmFibGU8Sz4pID0+IHZvaWR9IGFkZEFsbFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IENvcHlTZXQ8Sz59IHNuYXBzaG90XG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gdm9pZH0gY2xlYXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5ICYgb2JqZWN0fSBbSz1LZXldXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVj1QYXNzYWJsZV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYWtNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IENvcHlNYXA8SyxWPiB8IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XVxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gW1Y9UGFzc2FibGVdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIG1hcFxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IENvcHlNYXA8SyxWPiB8IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxWPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeyhcbiAqICAga2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgIHZhbHVlUGF0dD86IFBhdHRlcm5cbiAqICkgPT4gSXRlcmFibGU8W0ssVl0+fSBlbnRyaWVzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gQ29weU1hcDxLLFY+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBEZXByZWNhdGVkIExlZ2FjeSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExlZ2FjeVdlYWtNYXBcbiAqIExlZ2FjeVdlYWtNYXAgaXMgZGVwcmVjYXRlZC4gVXNlIFdlYWtNYXBTdG9yZSBpbnN0ZWFkIGlmIHBvc3NpYmxlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExlZ2FjeU1hcFxuICogTGVnYWN5TWFwIGlzIGRlcHJlY2F0ZWQuIFVzZSBNYXBTdG9yZSBpbnN0ZWFkIGlmIHBvc3NpYmxlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Vj59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxbSyxWXT59IGVudHJpZXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsZWFyXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAIZgh2L8BAAC/AQAAHAAAAEBhZ29yaWMvdGltZS12MC4zLjIvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvdGltZU1hdGguanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdGltZU1hdGguanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdGltZU1hdGguanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMBAN+aoIgAAqCIAACMAAABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90aW1lTWF0aC5qc3siaW1wb3J0cyI6WyIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiVGltZU1hdGgiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbXVzdE1hdGNoLE5hdCxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxUaW1lc3RhbXBSZWNvcmRTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJUaW1lc3RhbXBSZWNvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoVGltZXN0YW1wUmVjb3JkU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVyQnJhbmR9IFRpbWVyQnJhbmRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuVGltZXN0YW1wfSBUaW1lc3RhbXBcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuUmVsYXRpdmVUaW1lfSBSZWxhdGl2ZVRpbWVcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuUmVsYXRpdmVUaW1lVmFsdWV9IFJlbGF0aXZlVGltZVZhbHVlXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVzdGFtcFZhbHVlfSBUaW1lc3RhbXBWYWx1ZVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5UaW1lTWF0aFR5cGV9IFRpbWVNYXRoVHlwZVxuICpcbiAqL1xuXG4vKipcbiAqIGBhZ3JlZWRUaW1lckJyYW5kYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAcGFyYW0ge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9IGxlZnRCcmFuZFxuICogQHBhcmFtIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfSByaWdodEJyYW5kXG4gKiBAcmV0dXJucyB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgYWdyZWVkVGltZXJCcmFuZD0obGVmdEJyYW5kLHJpZ2h0QnJhbmQpPT57XG5pZihsZWZ0QnJhbmQ9PT11bmRlZmluZWQpe1xuaWYocmlnaHRCcmFuZD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1lbHNle1xucmV0dXJuIHJpZ2h0QnJhbmQ7XG4gfVxuIH1lbHNlIGlmKHJpZ2h0QnJhbmQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGxlZnRCcmFuZDtcbiB9ZWxzZXtcbmxlZnRCcmFuZD09PXJpZ2h0QnJhbmR8fFxuRmFpbCBgVGltZXJCcmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnRCcmFuZCl9IHZzICR7cShyaWdodEJyYW5kKX1gO1xucmV0dXJuIGxlZnRCcmFuZDtcbiB9XG4gfTtcblxuLyoqXG4gKiBgc2hhcmVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCBpbXBsZW1lbnRzIHRoZVxuICogdHJhbnNpdGlvbmFsIGJyYW5kIGNoZWNraW5nIGFuZCBjb250YWlnaW9uIGxvZ2ljIGV4cGxhaW5lZCBpbiB0aGUgYFRpbWVNYXRoYFxuICogY29tbWVudC4gSXQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGJpbmFyeSBvcGVyYXRvcnMgdGhhdCBzaG91bGQgZm9sbG93XG4gKiB0aGlzIGxvZ2ljLiBJdCBkb2VzIHRoZSBlcnJvciBjaGVja2luZyBiZXR3ZWVuIHRoZSBvcGVyYW5kcywgYW5kIHJldHVybnNcbiAqIHRoZSBicmFuZCwgaWYgYW55LCB0aGF0IHNob3VsZCBsYWJlbCB0aGUgcmVzdWx0aW5nIHRpbWUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IHNoYXJlZFRpbWVyQnJhbmQ9KGxlZnQscmlnaHQpPT57XG5jb25zdCBsZWZ0QnJhbmQ9dHlwZW9mIGxlZnQ9PT0nYmlnaW50Jz91bmRlZmluZWQ6bGVmdC50aW1lckJyYW5kO1xuY29uc3QgcmlnaHRCcmFuZD10eXBlb2YgcmlnaHQ9PT0nYmlnaW50Jz91bmRlZmluZWQ6cmlnaHQudGltZXJCcmFuZDtcbnJldHVybiBhZ3JlZWRUaW1lckJyYW5kKGxlZnRCcmFuZCxyaWdodEJyYW5kKTtcbiB9O1xuXG4vKipcbiAqIGBhYnNMaWtlYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnlcbiAqIG9wZXJhdG9ycyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgYSBgVGltZXN0YW1wYFxuICogcmF0aGVyIHRoYW4gYSBgUmVsYXRpdmVUaW1lYC5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcFZhbHVlfSBhYnNWYWx1ZVxuICogQHJldHVybnMge1RpbWVzdGFtcH1cbiAqL1xuY29uc3QgYWJzTGlrZT0obGVmdCxyaWdodCxhYnNWYWx1ZSk9Pntcbk5hdChhYnNWYWx1ZSk7XG5jb25zdCB0aW1lckJyYW5kPXNoYXJlZFRpbWVyQnJhbmQobGVmdCxyaWdodCk7XG5pZih0aW1lckJyYW5kKXtcbnJldHVybiBoYXJkZW4oe1xudGltZXJCcmFuZCxcbmFic1ZhbHVlfSk7XG5cbiB9ZWxzZXtcbnJldHVybiBhYnNWYWx1ZTtcbiB9XG4gfTtcblxuLyoqXG4gKiBgcmVsTGlrZWAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5XG4gKiBvcGVyYXRvcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIGEgYFJlbGF0aXZlVGltZWBcbiAqIHJhdGhlciB0aGFuIGEgYFRpbWVzdGFtcGAuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWVWYWx1ZX0gcmVsVmFsdWVcbiAqIEByZXR1cm5zIHtSZWxhdGl2ZVRpbWV9XG4gKi9cbmNvbnN0IHJlbExpa2U9KGxlZnQscmlnaHQscmVsVmFsdWUpPT57XG5OYXQocmVsVmFsdWUpO1xuY29uc3QgdGltZXJCcmFuZD1zaGFyZWRUaW1lckJyYW5kKGxlZnQscmlnaHQpO1xuaWYodGltZXJCcmFuZCl7XG5yZXR1cm4gaGFyZGVuKHtcbnRpbWVyQnJhbmQsXG5yZWxWYWx1ZX0pO1xuXG4gfWVsc2V7XG5yZXR1cm4gcmVsVmFsdWU7XG4gfVxuIH07XG5cbi8qIEZvciBhbGwgdGhlIGZvbGxvd2luZyB0aW1lIG9wZXJhdG9ycywgdGhlaXIgZG9jdW1lbnRhdGlvbiBpcyBpbiovXG4vKiB0aGUgYFRpbWVNYXRoVHlwZWAsIHNpbmNlIHRoYXQgaXMgdGhlIGRvY3VtZW50YXRpb24gdGhhdCBzaG93cyB1cCovXG4vKiBpbiB0aGUgSURFLiBXZWxsLCBhdCBsZWFzdCB0aGUgdnNjb2RlIElERS4qL1xuXG5jb25zdCBhYnNWYWx1ZT0oYWJzKT0+e1xuaWYodHlwZW9mIGFicz09PSdiaWdpbnQnKXtcbnJldHVybiBOYXQoYWJzKTtcbiB9XG5tdXN0TWF0Y2goYWJzLFRpbWVzdGFtcFJlY29yZFNoYXBlLCd0aW1lc3RhbXAnKTtcbnJldHVybiBOYXQoYWJzLmFic1ZhbHVlKTtcbiB9O1xuXG5jb25zdCByZWxWYWx1ZT0ocmVsKT0+e1xuaWYodHlwZW9mIHJlbD09PSdiaWdpbnQnKXtcbnJldHVybiBOYXQocmVsKTtcbiB9XG5tdXN0TWF0Y2gocmVsLFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLCdyZWxhdGl2ZScpO1xucmV0dXJuIE5hdChyZWwucmVsVmFsdWUpO1xuIH07XG5cbmNvbnN0IG1ha2VUaW1lc3RhbXBSZWNvcmQ9KGFicyx0aW1lckJyYW5kKT0+XG5oYXJkZW4oe2Fic1ZhbHVlOmFicyx0aW1lckJyYW5kfSk7XG5jb25zdCBtYWtlUmVsYXRpdmVUaW1lUmVjb3JkPShyZWwsdGltZXJCcmFuZCk9PlxuaGFyZGVuKHtyZWxWYWx1ZTpyZWwsdGltZXJCcmFuZH0pO1xuXG5jb25zdCBjb2VyY2VUaW1lc3RhbXBSZWNvcmQ9KHRzLGJyYW5kKT0+e1xuYnJhbmR8fEZhaWwgYG11c3QgaGF2ZSBhIGJyYW5kYDtcbmlmKHR5cGVvZiB0cz09PSdudW1iZXInKXtcbnRzPU5hdCh0cyk7XG4gfVxuaWYodHlwZW9mIHRzPT09J2JpZ2ludCcpe1xucmV0dXJuIG1ha2VUaW1lc3RhbXBSZWNvcmQodHMsYnJhbmQpO1xuIH1lbHNle1xuY29uc3R7dGltZXJCcmFuZH09dHM7XG5tdXN0TWF0Y2godHMsVGltZXN0YW1wUmVjb3JkU2hhcGUsJ3RpbWVzdGFtcCcpO1xuYWdyZWVkVGltZXJCcmFuZCh0aW1lckJyYW5kLGJyYW5kKTtcbnJldHVybiB0cztcbiB9XG4gfTtcblxuY29uc3QgY29lcmNlUmVsYXRpdmVUaW1lUmVjb3JkPShydCxicmFuZCk9PntcbmJyYW5kfHxGYWlsIGBtdXN0IGhhdmUgYSBicmFuZGA7XG5pZih0eXBlb2YgcnQ9PT0nbnVtYmVyJyl7XG5ydD1OYXQocnQpO1xuIH1cbmlmKHR5cGVvZiBydD09PSdiaWdpbnQnKXtcbnJldHVybiBtYWtlUmVsYXRpdmVUaW1lUmVjb3JkKHJ0LGJyYW5kKTtcbiB9ZWxzZXtcbmNvbnN0e3RpbWVyQnJhbmR9PXJ0O1xubXVzdE1hdGNoKHJ0LFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLCdyZWxhdGl2ZVRpbWUnKTtcbmFncmVlZFRpbWVyQnJhbmQodGltZXJCcmFuZCxicmFuZCk7XG5yZXR1cm4gcnQ7XG4gfVxuIH07XG5cbmNvbnN0IGFkZEFic1JlbD0oYWJzLHJlbCk9PlxuYWJzTGlrZShhYnMscmVsLGFic1ZhbHVlKGFicykrcmVsVmFsdWUocmVsKSk7XG5cbmNvbnN0IGFkZFJlbFJlbD0ocmVsMSxyZWwyKT0+XG5yZWxMaWtlKHJlbDEscmVsMixyZWxWYWx1ZShyZWwxKStyZWxWYWx1ZShyZWwyKSk7XG5cbmNvbnN0IHN1YnRyYWN0QWJzQWJzPShhYnMxLGFiczIpPT5cbnJlbExpa2UoYWJzMSxhYnMyLGFic1ZhbHVlKGFiczEpLWFic1ZhbHVlKGFiczIpKTtcblxuY29uc3QgY2xhbXBlZFN1YnRyYWN0QWJzQWJzPShhYnMxLGFiczIpPT57XG5jb25zdCB2YWwxPWFic1ZhbHVlKGFiczEpO1xuY29uc3QgdmFsMj1hYnNWYWx1ZShhYnMyKTtcbnJldHVybiByZWxMaWtlKGFiczEsYWJzMix2YWwxPnZhbDI/dmFsMS12YWwyOjBuKTtcbiB9O1xuXG5jb25zdCBzdWJ0cmFjdEFic1JlbD0oYWJzLHJlbCk9PlxuYWJzTGlrZShhYnMscmVsLGFic1ZhbHVlKGFicyktcmVsVmFsdWUocmVsKSk7XG5cbmNvbnN0IHN1YnRyYWN0UmVsUmVsPShyZWwxLHJlbDIpPT5cbnJlbExpa2UocmVsMSxyZWwyLHJlbFZhbHVlKHJlbDEpLXJlbFZhbHVlKHJlbDIpKTtcblxuY29uc3QgaXNSZWxaZXJvPShyZWwpPT5yZWxWYWx1ZShyZWwpPT09MG47XG5cbmNvbnN0IG11bHRpcGx5UmVsTmF0PShyZWwsbmF0KT0+cmVsTGlrZShyZWwsbmF0LHJlbFZhbHVlKHJlbCkqbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsTmF0PShyZWwsbmF0KT0+cmVsTGlrZShyZWwsbmF0LHJlbFZhbHVlKHJlbCkvbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsUmVsPShyZWwxLHJlbDIpPT57XG5zaGFyZWRUaW1lckJyYW5kKHJlbDEscmVsMik7LyoganVzdCBlcnJvciBjaGVjayovXG5yZXR1cm4gcmVsVmFsdWUocmVsMSkvcmVsVmFsdWUocmVsMik7XG4gfTtcblxuY29uc3QgbW9kQWJzUmVsPShhYnMsc3RlcCk9PlxucmVsTGlrZShhYnMsc3RlcCxhYnNWYWx1ZShhYnMpJXJlbFZhbHVlKHN0ZXApKTtcblxuY29uc3QgbW9kUmVsUmVsPShyZWwsc3RlcCk9PlxucmVsTGlrZShyZWwsc3RlcCxyZWxWYWx1ZShyZWwpJXJlbFZhbHVlKHN0ZXApKTtcblxuLyoqXG4gKiBgY29tcGFyZVZhbHVlc2AgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudFxuICogdGhlIHRpbWUgY29tcGFyaXNvbiBvcGVyYXRvcnMuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtiaWdpbnR9IHYxXG4gKiBAcGFyYW0ge2JpZ2ludH0gdjJcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuY29uc3QgY29tcGFyZVZhbHVlcz0obGVmdCxyaWdodCx2MSx2Mik9PntcbnNoYXJlZFRpbWVyQnJhbmQobGVmdCxyaWdodCk7XG5pZih2MTx2Mil7XG5yZXR1cm4tMTtcbiB9ZWxzZSBpZih2MT09PXYyKXtcbnJldHVybiAwO1xuIH1lbHNle1xuYXNzZXJ0KHYxPnYyKTtcbnJldHVybiAxO1xuIH1cbiB9O1xuXG4vKipcbiAqIFRoZSBgVGltZU1hdGhgIG9iamVjdCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyB0byBkbyBhcml0aG1ldGljIG9uIGxhYmVsZWRcbiAqIHRpbWUgdmFsdWVzLCBtdWNoIGxpa2UgYEFtb3VudE1hdGhgIHByb3ZpZGVzIGhlbHBlciBtZXRob2RzIHRvIGRvIGFyaXRobWV0aWNcbiAqIG9uIGxhYmVsZWQgYXNzZXQvbW9uZXkgdmFsdWVzLiBCb3RoIGNoZWNrIGZvciBjb25zaXN0ZW5jeSBvZiBsYWJlbHM6IGFcbiAqIGJpbmFyeSBvcGVyYXRpb24gb24gdHdvIGxhYmVsZWQgb2JqZWN0cyBlbnN1cmVzIHRoYXQgdGhlIGJvdGggY2FycnlcbiAqIHRoZSBzYW1lIGxhYmVsLiBJZiB0aGV5IHByb2R1Y2UgYW5vdGhlciBvYmplY3QgZnJvbSB0aGUgc2FtZSBkb21haW4sIGl0XG4gKiB3aWxsIGNhcnJ5IHRoZSBzYW1lIGxhYmVsLiBJZiB0aGUgb3BlcmFuZHMgaGF2ZSBpbmNvbXBhdGlibGUgbGFiZWxzLFxuICogYW4gZXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIFVubGlrZSBhbW91bnQgYXJpdGhtZXRpYywgdGltZSBhcml0aG1ldGljIGRlYWxzIGluIHR3byBraW5kcyBvZiB0aW1lIG9iamVjdHM6XG4gKiBUaW1lc3RhbXBzLCB3aGljaCByZXByZXNlbnQgYWJzb2x1dGUgdGltZSwgYW5kIFJlbGF0aXZlVGltZSwgd2hpY2ggcmVwcmVzZW50c1xuICogdGhlIGR1cmF0aW9uIGJldHdlZW4gdHdvIGFic29sdXRlIHRpbWVzLiBCb3RoIGtpbmRzIG9mIHRpbWUgb2JqZWN0XG4gKiBhcmUgbGFiZWxlZCBieSBhIGBUaW1lckJyYW5kYC4gRm9yIGEgVGltZXN0YW1wIG9iamVjdCwgdGhlIHZhbHVlIGlzXG4gKiBhIGJpZ2ludCBpbiBhbiBgYWJzVmFsdWVgIHByb3BlcnR5LiBGb3IgYSBSZWxhdGl2ZVRpbWUgb2JqZWN0LCB0aGUgdmFsdWVcbiAqIGlzIGEgYmlnaW50IGluIGEgYHJlbFZhbHVlYCBwcm9wZXJ0eS4gVGh1cyB3ZSBoYXZlIGEgcnVudGltZSBzYWZldHkgY2hlY2tcbiAqIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGNvbmZ1c2VkIHRoZSB0d28sIGV2ZW4gaWYgd2UgaGF2ZSBtYW5hZ2VkIHRvIGZvb2xcbiAqIHRoZSAodW5zb3VuZCkgc3RhdGljIHR5cGUgc3lzdGVtLlxuICpcbiAqIEFzIGEgdHJhbnNpdGlvbmFsIG1lYXN1cmUsIGN1cnJlbnRseSBtYW55IFRpbWVzdGFtcHMgYW5kIFJlbGF0aXZlVGltZXMgYXJlXG4gKiBzdGlsbCByZXByZXNlbnRlZCBieSB1bmxhYmVsZWQgYmlnaW50cy4gRHVyaW5nIHRoaXMgdHJhbnNpdGlvbmFsIHBlcmlvZCxcbiAqIHdlIGFsbG93IHRoaXMsIGJvdGggc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkuIEZvciBhIG5vcm1hbCBiaW5hcnlcbiAqIG9wZXJhdGlvbiwgaWYgYm90aCBpbnB1dHMgYXJlIGxhYmVsZWQsIHRoZW4gd2UgZG8gdGhlIGZ1bGwgY2hlY2tpbmcgYXNcbiAqIGV4cGxhaW5lZCBhYm92ZSBhbmQgcmV0dXJuIGEgbGFiZWxlZCByZXN1bHQuIElmIGJvdGggaW5wdXRzIGFyZSB1bmxhYmVsZWRcbiAqIGJpZ2ludHMsIHdlICphc3N1bWUqIHRoYXQgdGhleSBpbmRpY2F0ZSBhIHRpbWUgb2YgdGhlIHJpZ2h0IGtpbmRcbiAqIChUaW1lc3RhbXAgdnMgUmVsYXRpdmVUaW1lKSBhbmQgdGltZXIgYnJhbmQuIFNpbmNlIHdlIGRvbid0IGtub3cgd2hhdFxuICogYnJhbmQgd2FzIGludGVuZGVkLCB3ZSBjYW4gb25seSByZXR1cm4geWV0IGFub3RoZXIgdW5sYWJlbGVkIGJpZ2ludC5cbiAqXG4gKiBJZiBvbmUgb3BlcmFuZCBpcyBsYWJlbGVkIGFuZCB0aGUgb3RoZXIgaXMgbm90LCB3ZSBjaGVjayB0aGUgbGFiZWxlZCBvcGVyYW5kLFxuICogKmFzc3VtZSogdGhlIHVubGFiZWxlZCBiaWdpbnQgcmVwcmVzZW50cyB0aGUgdmFsdWUgbmVlZGVkIGZvciB0aGUgb3RoZXJcbiAqIG9wZXJhbmQsIGFuZCByZXR1cm4gYSBsYWJlbGVkIHRpbWUgb2JqZWN0IHdpdGggdGhlIGJyYW5kIG9mIHRoZSBsYWJlbGVkXG4gKiBvcGVyYW5kLlxuICpcbiAqIEB0eXBlIHtUaW1lTWF0aFR5cGV9XG4gKi9cbmNvbnN0ICAgICAgICBUaW1lTWF0aD1oYXJkZW4oe1xuYWJzVmFsdWUsXG5yZWxWYWx1ZSxcbmNvZXJjZVRpbWVzdGFtcFJlY29yZCxcbmNvZXJjZVJlbGF0aXZlVGltZVJlY29yZCxcbmFkZEFic1JlbCxcbmFkZFJlbFJlbCxcbnN1YnRyYWN0QWJzQWJzLFxuY2xhbXBlZFN1YnRyYWN0QWJzQWJzLFxuc3VidHJhY3RBYnNSZWwsXG5zdWJ0cmFjdFJlbFJlbCxcbmlzUmVsWmVybyxcbm11bHRpcGx5UmVsTmF0LFxuZGl2aWRlUmVsTmF0LFxuZGl2aWRlUmVsUmVsLFxubW9kQWJzUmVsLFxubW9kUmVsUmVsLFxuY29tcGFyZUFiczooYWJzMSxhYnMyKT0+XG5jb21wYXJlVmFsdWVzKGFiczEsYWJzMixhYnNWYWx1ZShhYnMxKSxhYnNWYWx1ZShhYnMyKSksXG5jb21wYXJlUmVsOihyZWwxLHJlbDIpPT5cbmNvbXBhcmVWYWx1ZXMocmVsMSxyZWwyLHJlbFZhbHVlKHJlbDEpLHJlbFZhbHVlKHJlbDIpKX0pOyRo4oCNX29uY2UuVGltZU1hdGgoVGltZU1hdGgpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRpbWVNYXRoIjpbIlRpbWVNYXRoIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG6zHqqnBwAApwcAACUAAABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSIsIlJlbGF0aXZlVGltZVNoYXBlIiwiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSIsIlRpbWVyQnJhbmRTaGFwZSIsIlRpbWVyU2VydmljZVNoYXBlIiwiVGltZXN0YW1wUmVjb3JkU2hhcGUiLCJUaW1lc3RhbXBTaGFwZSIsIlRpbWVzdGFtcFZhbHVlU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0ICAgICAgICBUaW1lckJyYW5kU2hhcGU9TS5yZW1vdGFibGUoJ1RpbWVyQnJhbmQnKTskaOKAjV9vbmNlLlRpbWVyQnJhbmRTaGFwZShUaW1lckJyYW5kU2hhcGUpO1xuY29uc3QgICAgICAgIFRpbWVzdGFtcFZhbHVlU2hhcGU9TS5uYXQoKTskaOKAjV9vbmNlLlRpbWVzdGFtcFZhbHVlU2hhcGUoVGltZXN0YW1wVmFsdWVTaGFwZSk7XG5jb25zdCAgICAgICAgUmVsYXRpdmVUaW1lVmFsdWVTaGFwZT1NLm5hdCgpOy8qIFNob3VsZCB3ZSBhbGxvdyBuZWdhdGl2ZXM/Ki8kaOKAjV9vbmNlLlJlbGF0aXZlVGltZVZhbHVlU2hhcGUoUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBUaW1lc3RhbXBSZWNvcmRTaGFwZT1oYXJkZW4oe1xudGltZXJCcmFuZDpUaW1lckJyYW5kU2hhcGUsXG5hYnNWYWx1ZTpUaW1lc3RhbXBWYWx1ZVNoYXBlfSk7JGjigI1fb25jZS5UaW1lc3RhbXBSZWNvcmRTaGFwZShUaW1lc3RhbXBSZWNvcmRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFJlbGF0aXZlVGltZVJlY29yZFNoYXBlPWhhcmRlbih7XG50aW1lckJyYW5kOlRpbWVyQnJhbmRTaGFwZSxcbnJlbFZhbHVlOlJlbGF0aXZlVGltZVZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLlJlbGF0aXZlVGltZVJlY29yZFNoYXBlKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVGltZXN0YW1wU2hhcGU9TS5vcihUaW1lc3RhbXBSZWNvcmRTaGFwZSxUaW1lc3RhbXBWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLlRpbWVzdGFtcFNoYXBlKFRpbWVzdGFtcFNoYXBlKTtcbmNvbnN0ICAgICAgICBSZWxhdGl2ZVRpbWVTaGFwZT1NLm9yKFxuUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsXG5SZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLlJlbGF0aXZlVGltZVNoYXBlKFJlbGF0aXZlVGltZVNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVGltZXJTZXJ2aWNlU2hhcGU9TS5yZW1vdGFibGUoJ1RpbWVyU2VydmljZScpOyRo4oCNX29uY2UuVGltZXJTZXJ2aWNlU2hhcGUoVGltZXJTZXJ2aWNlU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRpbWVyQnJhbmRTaGFwZSI6WyJUaW1lckJyYW5kU2hhcGUiXSwiVGltZXN0YW1wVmFsdWVTaGFwZSI6WyJUaW1lc3RhbXBWYWx1ZVNoYXBlIl0sIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiOlsiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSJdLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSI6WyJUaW1lc3RhbXBSZWNvcmRTaGFwZSJdLCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSJdLCJUaW1lc3RhbXBTaGFwZSI6WyJUaW1lc3RhbXBTaGFwZSJdLCJSZWxhdGl2ZVRpbWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVTaGFwZSJdLCJUaW1lclNlcnZpY2VTaGFwZSI6WyJUaW1lclNlcnZpY2VTaGFwZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC+1ERjYygAAGMoAAAoAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2V4by11dGlscy5qc3siaW1wb3J0cyI6WyIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImlnbm9yZUNvbnRleHQiLCJtYWtlRXhvVXRpbHMiLCJwcmVwYXJlRXhvIiwicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUtpbmQiLCJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZVNpbmdsZXRvbiIsInByb3ZpZGVLaW5kSGFuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGluaXRFbXB0eSxwcm92aWRlLGdsb2JhbFZhdERhdGE7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wicHJvdmlkZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZSA9ICRo4oCNX2EpXV0sW1wiVmF0RGF0YVwiLCBbJGjigI1fYSA9PiAoZ2xvYmFsVmF0RGF0YSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8VD59IEVSZWYgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkRlZmluZUtpbmRPcHRpb25zPFQ+fSBEZWZpbmVLaW5kT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuS2luZEZhY2V0PFQ+fSBLaW5kRmFjZXQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLktpbmRGYWNldHM8VD59IEtpbmRGYWNldHMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkR1cmFibGVLaW5kSGFuZGxlfSBEdXJhYmxlS2luZEhhbmRsZSAqL1xuXG4vKipcbiAqIE1ha2UgYSB2ZXJzaW9uIG9mIHRoZSBhcmd1bWVudCBmdW5jdGlvbiB0aGF0IHRha2VzIGEga2luZCBjb250ZXh0IGJ1dFxuICogaWdub3JlcyBpdC5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyBGdW5jdGlvbj4oZm46IFQpID0+IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5QbHVzQ29udGV4dDxuZXZlciwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBpZ25vcmVDb250ZXh0PVxuKGZuKT0+XG4oX2NvbnRleHQsLi4uYXJncyk9PlxuZm4oLi4uYXJncyk7JGjigI1fb25jZS5pZ25vcmVDb250ZXh0KGlnbm9yZUNvbnRleHQpO1xuaGFyZGVuKGlnbm9yZUNvbnRleHQpO1xuXG4vKiBUT0RPOiBGaW5kIGEgZ29vZCBob21lIGZvciB0aGlzIGZ1bmN0aW9uIHVzZWQgYnkgQGFnb3JpYy92YXQtZGF0YSBhbmQgdGVzdGluZyBjb2RlKi9cbmNvbnN0ICAgICAgICBtYWtlRXhvVXRpbHM9KFZhdERhdGEpPT57XG5jb25zdHtcbmRlZmluZUtpbmQsXG5kZWZpbmVLaW5kTXVsdGksXG5kZWZpbmVEdXJhYmxlS2luZCxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGksXG5tYWtlS2luZEhhbmRsZX09XG5WYXREYXRhO1xuXG4vKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcmV0dXJucyB7RHVyYWJsZUtpbmRIYW5kbGV9XG4gKi9cbmNvbnN0IHByb3ZpZGVLaW5kSGFuZGxlPShiYWdnYWdlLGtpbmROYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwoKT0+bWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTtcbmhhcmRlbihwcm92aWRlS2luZEhhbmRsZSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG9DbGFzcyBpbnN0ZWFkXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByZXBhcmVLaW5kfVxuICovXG5jb25zdCBwcmVwYXJlS2luZD0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZChcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlS2luZCk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG9DbGFzc0tpdCBpbnN0ZWFkXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByZXBhcmVLaW5kTXVsdGl9XG4gKi9cbmNvbnN0IHByZXBhcmVLaW5kTXVsdGk9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlS2luZE11bHRpKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSBUIGJlaGF2aW9yXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3M9KHRhZyxpbnRlcmZhY2VHdWFyZCxpbml0LG1ldGhvZHMsb3B0aW9ucyk9PlxuZGVmaW5lS2luZCh0YWcsaW5pdCxtZXRob2RzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxuaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IGZhY2V0czogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQ9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk9PlxuXG5kZWZpbmVLaW5kTXVsdGkodGFnLGluaXQsZmFjZXRzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmQ6aW50ZXJmYWNlR3VhcmRLaXR9KTtcblxuaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzcz0oXG5raW5kSGFuZGxlLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmQoa2luZEhhbmRsZSxpbml0LG1ldGhvZHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZH0pO1xuXG5oYXJkZW4oZGVmaW5lRHVyYWJsZUV4b0NsYXNzKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtEdXJhYmxlS2luZEhhbmRsZX0ga2luZEhhbmRsZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgZmFjZXRzOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPn0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgZmFjZXRzOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPn0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQ9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShraW5kSGFuZGxlLGluaXQsZmFjZXRzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmQ6aW50ZXJmYWNlR3VhcmRLaXR9KTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBwcmVwYXJlRXhvQ2xhc3M9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVFeG9DbGFzcyhcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpO1xuXG5oYXJkZW4ocHJlcGFyZUV4b0NsYXNzKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IGZhY2V0czogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBwcmVwYXJlRXhvQ2xhc3NLaXQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKTtcblxuaGFyZGVuKHByZXBhcmVFeG9DbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7TX0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IE0gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMge00gJiBSZW1vdGFibGVCcmFuZDx7fSwgTT59XG4gKi9cbmNvbnN0IHByZXBhcmVFeG89KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbmNvbnN0IG1ha2VTaW5nbGV0b249cHJlcGFyZUV4b0NsYXNzKFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cblxucmV0dXJuIHByb3ZpZGUoYmFnZ2FnZSwgYCR7a2luZE5hbWV9X3NpbmdsZXRvbmAsKCk9Pm1ha2VTaW5nbGV0b24oKSk7XG4gfTtcbmhhcmRlbihwcmVwYXJlRXhvKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBNIG1ldGhvZHNcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvIGluc3RlYWQuXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtNfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogTSB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7TSAmIFJlbW90YWJsZUJyYW5kPHt9LCBNPn1cbiAqL1xuY29uc3QgcHJlcGFyZVNpbmdsZXRvbj0oYmFnZ2FnZSxraW5kTmFtZSxtZXRob2RzLG9wdGlvbnM9dW5kZWZpbmVkKT0+XG5wcmVwYXJlRXhvKGJhZ2dhZ2Usa2luZE5hbWUsdW5kZWZpbmVkLG1ldGhvZHMsb3B0aW9ucyk7XG5oYXJkZW4ocHJlcGFyZVNpbmdsZXRvbik7XG5cbnJldHVybiBoYXJkZW4oe1xuZGVmaW5lVmlydHVhbEV4b0NsYXNzLFxuZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0LFxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0LFxucHJlcGFyZUV4b0NsYXNzLFxucHJlcGFyZUV4b0NsYXNzS2l0LFxucHJlcGFyZUV4byxcbnByZXBhcmVTaW5nbGV0b24sXG5cbnByb3ZpZGVLaW5kSGFuZGxlLFxucHJlcGFyZUtpbmQsXG5wcmVwYXJlS2luZE11bHRpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUV4b1V0aWxzKG1ha2VFeG9VdGlscyk7XG5cbmNvbnN0IGdsb2JhbEV4b1V0aWxzPW1ha2VFeG9VdGlscyhnbG9iYWxWYXREYXRhKTtcblxuY29uc3QgICAgICAge1xuZGVmaW5lVmlydHVhbEV4b0NsYXNzLFxuZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0LFxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0LFxucHJlcGFyZUV4b0NsYXNzLFxucHJlcGFyZUV4b0NsYXNzS2l0LFxucHJlcGFyZUV4byxcbnByZXBhcmVTaW5nbGV0b259PVxuZ2xvYmFsRXhvVXRpbHM7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIEV4b3MvRXhvQ2xhc3NlcyBpbnN0ZWFkIG9mIEtpbmRzXG4gKi8kaOKAjV9vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzcyhkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpOyRo4oCNX29uY2UuZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MoZGVmaW5lRHVyYWJsZUV4b0NsYXNzKTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpOyRo4oCNX29uY2UucHJlcGFyZUV4b0NsYXNzKHByZXBhcmVFeG9DbGFzcyk7JGjigI1fb25jZS5wcmVwYXJlRXhvQ2xhc3NLaXQocHJlcGFyZUV4b0NsYXNzS2l0KTskaOKAjV9vbmNlLnByZXBhcmVFeG8ocHJlcGFyZUV4byk7JGjigI1fb25jZS5wcmVwYXJlU2luZ2xldG9uKHByZXBhcmVTaW5nbGV0b24pO1xuY29uc3QgICAgICAge3Byb3ZpZGVLaW5kSGFuZGxlLHByZXBhcmVLaW5kLHByZXBhcmVLaW5kTXVsdGl9PVxuZ2xvYmFsRXhvVXRpbHM7JGjigI1fb25jZS5wcm92aWRlS2luZEhhbmRsZShwcm92aWRlS2luZEhhbmRsZSk7JGjigI1fb25jZS5wcmVwYXJlS2luZChwcmVwYXJlS2luZCk7JGjigI1fb25jZS5wcmVwYXJlS2luZE11bHRpKHByZXBhcmVLaW5kTXVsdGkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCJdLCJtYWtlRXhvVXRpbHMiOlsibWFrZUV4b1V0aWxzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSwicHJlcGFyZUV4b0NsYXNzIjpbInByZXBhcmVFeG9DbGFzcyJdLCJwcmVwYXJlRXhvQ2xhc3NLaXQiOlsicHJlcGFyZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG8iOlsicHJlcGFyZUV4byJdLCJwcmVwYXJlU2luZ2xldG9uIjpbInByZXBhcmVTaW5nbGV0b24iXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwicHJlcGFyZUtpbmQiOlsicHJlcGFyZUtpbmQiXSwicHJlcGFyZUtpbmRNdWx0aSI6WyJwcmVwYXJlS2luZE11bHRpIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADvjPYiSCAAAkggAACQAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9leG8tdXRpbHMuanMiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW11dLFtcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW11dLFtcIi4vZXhvLXV0aWxzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvc3RvcmUiOltbIk0iLCJNIl0sWyJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjpbWyJtYWtlS2luZEhhbmRsZSIsIm1ha2VLaW5kSGFuZGxlIl0sWyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSxbIndhdGNoUHJvbWlzZSIsIndhdGNoUHJvbWlzZSJdLFsibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLFsiY2FuQmVEdXJhYmxlIiwiY2FuQmVEdXJhYmxlIl0sWyJwaWNrRmFjZXQiLCJwaWNrRmFjZXQiXSxbInBhcnRpYWxBc3NpZ24iLCJwYXJ0aWFsQXNzaWduIl0sWyJwcm92aWRlIiwicHJvdmlkZSJdLFsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl0sWyJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZCJdLFsiZGVmaW5lS2luZE11bHRpIiwiZGVmaW5lS2luZE11bHRpIl0sWyJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kIl0sWyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdXSwiLi9leG8tdXRpbHMuanMiOltbImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyJdLFsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0Il0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiXSxbImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCJdLFsicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzIl0sWyJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvIl0sWyJwcmVwYXJlU2luZ2xldG9uIiwicHJlcGFyZVNpbmdsZXRvbiJdLFsiaWdub3JlQ29udGV4dCIsImlnbm9yZUNvbnRleHQiXSxbInByb3ZpZGVLaW5kSGFuZGxlIiwicHJvdmlkZUtpbmRIYW5kbGUiXSxbInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmQiXSxbInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlS2luZE11bHRpIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADe9I8gUygAAFMoAAAwAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIlZhdERhdGEiLCJjYW5CZUR1cmFibGUiLCJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kTXVsdGkiLCJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZE11bHRpIiwibWFrZUtpbmRIYW5kbGUiLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsIm1ha2VTdG9yZVV0aWxzIiwicGFydGlhbEFzc2lnbiIsInBpY2tGYWNldCIsInByb3ZpZGUiLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJ3YXRjaFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFpbCxwcm92aWRlTGF6eTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzJykuVmF0RGF0YX0gKi9cbmxldCBWYXREYXRhR2xvYmFsO1xuaWYoJ1ZhdERhdGEnaW4gZ2xvYmFsVGhpcyl7XG5nbG9iYWxUaGlzLlZhdERhdGF8fEZhaWwgYFZhdERhdGEgZGVmaW5lZCBpbiBnbG9iYWwgYXMgbnVsbCBvciB1bmRlZmluZWRgO1xuVmF0RGF0YUdsb2JhbD1nbG9iYWxUaGlzLlZhdERhdGE7XG4gfWVsc2V7XG4vKiBYWFggdGhpcyBtb2R1bGUgaGFzIGJlZW4ga25vd24gdG8gZ2V0IGltcG9ydGVkICh0cmFuc2l0aXZlbHkpIGluIGNhc2VzIHRoYXQqL1xuLyogbmV2ZXIgdXNlIGl0IHNvIHdlIG1ha2UgYSB2ZXJzaW9uIHRoYXQgd2lsbCBzYXRpc2Z5IG1vZHVsZSByZXNvbHV0aW9uIGJ1dCovXG4vKiBmYWlsIGF0IHJ1bnRpbWUuKi9cbmNvbnN0IHVudmFpbGFibGU9KCk9PkZhaWwgYFZhdERhdGEgdW5hdmFpbGFibGVgO1xuVmF0RGF0YUdsb2JhbD17XG5kZWZpbmVLaW5kOnVudmFpbGFibGUsXG5kZWZpbmVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kOnVudmFpbGFibGUsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpOnVudmFpbGFibGUsXG5tYWtlS2luZEhhbmRsZTp1bnZhaWxhYmxlLFxucHJvdmlkZVByb21pc2VXYXRjaGVyOnVudmFpbGFibGUsXG53YXRjaFByb21pc2U6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ1NldFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlOnVudmFpbGFibGUsXG5jYW5CZUR1cmFibGU6dW52YWlsYWJsZX07XG5cbiB9XG5cbmNvbnN0IFZhdERhdGFFeHBvcnQ9VmF0RGF0YUdsb2JhbDskaOKAjV9vbmNlLlZhdERhdGFFeHBvcnQoVmF0RGF0YUV4cG9ydCk7XG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRXhvcy9FeG9DbGFzc2VzIGluc3RlYWQgb2YgS2luZHNcbiAqL1xuY29uc3QgICAgICAge1xuZGVmaW5lS2luZCxcbmRlZmluZUtpbmRNdWx0aSxcbmRlZmluZUR1cmFibGVLaW5kLFxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aX09XG5WYXREYXRhR2xvYmFsOyRo4oCNX29uY2UuZGVmaW5lS2luZChkZWZpbmVLaW5kKTskaOKAjV9vbmNlLmRlZmluZUtpbmRNdWx0aShkZWZpbmVLaW5kTXVsdGkpOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUtpbmQoZGVmaW5lRHVyYWJsZUtpbmQpOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShkZWZpbmVEdXJhYmxlS2luZE11bHRpKTtcblxuY29uc3QgICAgICAge1xubWFrZUtpbmRIYW5kbGUsXG5wcm92aWRlUHJvbWlzZVdhdGNoZXIsXG53YXRjaFByb21pc2UsXG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxubWFrZVNjYWxhckJpZ1NldFN0b3JlLFxubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSxcbmNhbkJlRHVyYWJsZX09XG5WYXREYXRhR2xvYmFsO1xuXG4vKipcbiAqIFdoZW4gbWFraW5nIGEgbXVsdGktZmFjZXQga2luZCwgaXQncyBjb21tb24gdG8gcGljayBvbmUgZmFjZXQgdG8gZXhwb3NlLiBFLmcuLFxuICpcbiAqICAgICBjb25zdCBtYWtlRm9vID0gKGEsIGIsIGMsIGQpID0+IG1ha2VGb29CYXNlKGEsIGIsIGMsIGQpLnNlbGY7XG4gKlxuICogVGhpcyBoZWxwZXIgcmVkdWNlcyB0aGUgZHVwbGljYXRpb246XG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSBwaWNrRmFjZXQobWFrZUZvb0Jhc2UsICdzZWxmJyk7XG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMnKS5QaWNrRmFjZXR9XG4gKi8kaOKAjV9vbmNlLm1ha2VLaW5kSGFuZGxlKG1ha2VLaW5kSGFuZGxlKTskaOKAjV9vbmNlLnByb3ZpZGVQcm9taXNlV2F0Y2hlcihwcm92aWRlUHJvbWlzZVdhdGNoZXIpOyRo4oCNX29uY2Uud2F0Y2hQcm9taXNlKHdhdGNoUHJvbWlzZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnTWFwU3RvcmUobWFrZVNjYWxhckJpZ01hcFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnU2V0U3RvcmUobWFrZVNjYWxhckJpZ1NldFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUobWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSk7JGjigI1fb25jZS5jYW5CZUR1cmFibGUoY2FuQmVEdXJhYmxlKTtcbmNvbnN0ICAgICAgICBwaWNrRmFjZXQ9XG4obWFrZXIsZmFjZXROYW1lKT0+XG4oLi4uYXJncyk9PlxubWFrZXIoLi4uYXJncylbZmFjZXROYW1lXTskaOKAjV9vbmNlLnBpY2tGYWNldChwaWNrRmFjZXQpO1xuaGFyZGVuKHBpY2tGYWNldCk7XG5cbi8qKlxuICogQXNzaWduIHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZVxuICogb2JqZWN0IHRvIHRoZWlyIGtleXMgaW4gdGhlIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UGFydGlhbDxUPn0gc291cmNlXG4gKi9cbmNvbnN0ICAgICAgICBwYXJ0aWFsQXNzaWduPSh0YXJnZXQsc291cmNlKT0+e1xuT2JqZWN0LmFzc2lnbih0YXJnZXQsc291cmNlKTtcbiB9OyRo4oCNX29uY2UucGFydGlhbEFzc2lnbihwYXJ0aWFsQXNzaWduKTtcbmhhcmRlbihwYXJ0aWFsQXNzaWduKTtcblxuLyogWFhYIGNvcGllZCBmcm9tIEBhZ29yaWMvc3RvcmUgdHlwZXMqL1xuLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NTYwKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVPcHRpb25zXG4gKiBPZiB0aGUgZGltZW5zaW9ucyBvbiB3aGljaCBLZXllZFN0b3JlcyBjYW4gZGlmZmVyLCB3ZSBvbmx5IHJlcHJlc2VudCBhIGZld1xuICogb2YgdGhlbSBhcyBzdGFuZGFyZCBvcHRpb25zLiBBIGdpdmVuIHN0b3JlIG1ha2VyIHNob3VsZCBkb2N1bWVudCB3aGljaFxuICogb3B0aW9ucyBpdCBzdXBwb3J0cywgYXMgd2VsbCBhcyBpdHMgcG9zaXRpb25zIG9uIGRpbWVuc2lvbnMgZm9yIHdoaWNoIGl0XG4gKiBkb2VzIG5vdCBzdXBwb3J0IG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb25nTGl2ZWQ9dHJ1ZV0gV2hpY2ggd2F5IHRvIG9wdGltaXplIGEgd2VhayBzdG9yZS4gVHJ1ZSBtZWFuc1xuICogdGhhdCB3ZSBleHBlY3QgdGhpcyB3ZWFrIHN0b3JlIHRvIG91dGxpdmUgbW9zdCBvZiBpdHMga2V5cywgaW4gd2hpY2hcbiAqIGNhc2Ugd2UgaW50ZXJuYWxseSBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgV2Vha01hcGAuIE90aGVyd2lzZSB3ZSBpbnRlcm5hbGx5XG4gKiBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgTWFwYC5cbiAqIERlZmF1bHRzIHRvIHRydWUsIHNvIHBsZWFzZSBtYXJrIHNob3J0IGxpdmVkIHN0b3JlcyBleHBsaWNpdGx5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZHVyYWJsZT1mYWxzZV0gIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0b3JlIHN1cnZpdmUgdGVybWluYXRpb25cbiAqICAgb2YgaXRzIGNvbnRhaW5pbmcgcHJvY2VzcywgYWxsb3dpbmcgZm9yIHJlc3RhcnQgb3IgdXBncmFkZSBidXQgYXQgdGhlIGNvc3RcbiAqICAgb2YgZm9yYmlkZGluZyBzdG9yYWdlIG9mIHJlZmVyZW5jZXMgdG8gZXBoZW1lcmFsIGRhdGEuICBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Zha2VEdXJhYmxlPWZhbHNlXSAgVGhpcyBzdG9yZSBwcmV0ZW5kcyB0byBiZSBhIGR1cmFibGUgc3RvcmVcbiAqICAgYnV0IGRvZXMgbm90IGVuZm9yY2UgdGhhdCB0aGUgdGhpbmdzIHN0b3JlZCBpbiBpdCBhY3R1YWxseSBiZSB0aGVtc2VsdmVzXG4gKiAgIGR1cmFibGUgKHdoZXJlYXMgYW4gYWN0dWFsIGR1cmFibGUgc3RvcmUgd291bGQgZm9yYmlkIHN0b3JhZ2Ugb2Ygc3VjaFxuICogICBpdGVtcykuICBUaGlzIGlzIGluIHNlcnZpY2Ugb2YgYWxsb3dpbmcgaW5jcmVtZW50YWwgdHJhbnNpdGlvbiB0byB1c2Ugb2ZcbiAqICAgZHVyYWJsZSBzdG9yZXMsIHRvIGVuYWJsZSBub3JtYWwgb3BlcmF0aW9uIGFuZCB0ZXN0aW5nIHdoZW4gc29tZSBzdHVmZlxuICogICBpbnRlbmRlZCB0byBldmVudHVhbGx5IGJlIGR1cmFibGUgaGFzIG5vdCB5ZXQgYmVlbiBtYWRlIGR1cmFibGUuICBBIHN0b3JlXG4gKiAgIG1hcmtlZCBhcyBmYWtlRHVyYWJsZSB3aWxsIGFwcGVhciB0byBvcGVyYXRlIG5vcm1hbGx5IGJ1dCBhbnkgYXR0ZW1wdCB0b1xuICogICB1cGdyYWRlIGl0cyBjb250YWluaW5nIHZhdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi90eXBlcycpLlBhdHRlcm59IFtrZXlTaGFwZV1cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi90eXBlcycpLlBhdHRlcm59IFt2YWx1ZVNoYXBlXVxuICovXG4vKipcbiAqIFVubGlrZSBgcHJvdmlkZUxhenlgLCBgcHJvdmlkZWAgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2VcbiAqIHdpdGhpbiBhbnkgdmF0IGluY2FybmF0aW9uIHdpdGggYSBnaXZlbiBgYmFnZ2FnZWAsYGtleWAgcGFpci5cbiAqXG4gKiBgcHJvdmlkZWAgc2hvdWxkIG9ubHkgdG8gYmUgdXNlZCB0byBwb3B1bGF0ZSBiYWdnYWdlLFxuICogd2hlcmUgdGhlIHRvdGFsIG51bWJlciBvZiBjYWxscyB0byBgcHJvdmlkZWAgbXVzdCBiZVxuICogbG93IGNhcmRpbmFsaXR5LCBzaW5jZSB3ZSBrZWVwIHRoZSBib29ra2VlcGluZyB0byBkZXRlY3QgY29sbGlzaW9uc1xuICogaW4gbm9ybWFsIGxhbmd1YWdlLWhlYXAgbWVtb3J5LiBBbGwgdGhlIG90aGVyIGJhZ2dhZ2Utb3JpZW50ZWRcbiAqIGBwcm92aWRlKmAgYW5kIGBwcmVwYXJlKmAgZnVuY3Rpb25zIGNhbGwgYHByb3ZpZGVgLFxuICogYW5kIHNvIGltcG9zZSB0aGUgc2FtZSBjb25zdHJhaW50cy4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGhcbiAqIG91ciBleHBlY3RlZCBkdXJhYmlsaXR5IHBhdHRlcm5zOiBXaGF0IHdlIHN0b3JlIGluIGJhZ2dhZ2UgYXJlXG4gKiAgICAqIGtpbmRIYW5kbGVzLCB3aGljaCBhcmUgcGVyIGtpbmQsIHdoaWNoIG11c3QgYmUgbG93IGNhcmRpbmFsaXR5XG4gKiAgICAqIGRhdGEgXCJ2YXJpYWJsZXNcIiBmb3IgcmVlc3RhYmxpc2hpbmcgdGhlIGxleGljYWwgc2NvcGUsIGVzcGVjaWFsbHlcbiAqICAgICAgb2Ygc2luZ2xldG9uc1xuICogICAgKiBuYW1lZCBub24tYmFnZ2FnZSBjb2xsZWN0aW9ucyBhdCB0aGUgbGVhdmVzIG9mIHRoZSBiYWdnYWdlIHRyZWUuXG4gKlxuICogV2hhdCBpcyBleHBlY3RlZCB0byBiZSBoaWdoIGNhcmRpbmFsaXR5IGFyZSB0aGUgaW5zdGFuY2VzIG9mIHRoZSBraW5kcyxcbiAqIGFuZCB0aGUgbWVtYmVycyBvZiB0aGUgbm9uLWJhZ2dnYWdlIGNvbGxlY3Rpb25zLlxuICpcbiAqIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTg3NSA6XG4gKiBJbXBsZW1lbnQgZGV2ZWxvcG1lbnQtdGltZSBpbnN0cnVtZW50YXRpb24gdG8gZGV0ZWN0IHdoZW5cbiAqIGBwcm92aWRlYCB2aW9sYXRlcyB0aGUgYWJvdmUgcHJlc2NyaXB0aW9uLCBhbmQgaXMgY2FsbGVkIG1vcmVcbiAqIHRoYW4gb25jZSBpbiB0aGUgc2FtZSB2YXQgaW5jYXJuYXRpb24gd2l0aCB0aGUgc2FtZVxuICogYmFnZ2FnZSxrZXkgcGFpci5cbiAqL1xuXG5jb25zdCAgICAgICAgcHJvdmlkZT1cbi8qIFhYWCBjYXN0IGJlY2F1c2UgcHJvdmlkZUxhenkgaXMgYGFueWAgZHVlIHRvIGJyb2tlbiB0eXBlIGltcG9ydCovXG4vKiogQHR5cGUgezxLLCBWPihiYWdnYWdlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZSwga2V5OiBLLCBtYWtlVmFsdWU6IChrZXk6IEspID0+IFYpID0+IFZ9ICovXG5wcm92aWRlTGF6eTtcblxuXG4vKiBUT0RPOiBGaW5kIGEgZ29vZCBob21lIGZvciB0aGlzIGZ1bmN0aW9uIHVzZWQgYnkgQGFnb3JpYy92YXQtZGF0YSBhbmQgdGVzdGluZyBjb2RlKi9cbi8qKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEvc3JjL3R5cGVzJykuVmF0RGF0YX0gVmF0RGF0YSAqLyRo4oCNX29uY2UucHJvdmlkZShwcm92aWRlKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVVdGlscz0oVmF0RGF0YSk9PntcbmNvbnN0e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbm1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlfT1cblZhdERhdGE7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lLG9wdGlvbnM9e30pPT5cbnByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT5cbm1ha2VTY2FsYXJCaWdNYXBTdG9yZShuYW1lLHtkdXJhYmxlOnRydWUsLi4ub3B0aW9uc30pKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUpO1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShuYW1lLHtkdXJhYmxlOnRydWUsLi4ub3B0aW9uc30pKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPbWl0PFN0b3JlT3B0aW9ucywgJ2R1cmFibGUnPn0gb3B0aW9uc1xuICovXG5jb25zdCBwcm92aWRlRHVyYWJsZVNldFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ1NldFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZVV0aWxzKG1ha2VTdG9yZVV0aWxzKTtcblxuY29uc3QgZ2xvYmFsU3RvcmVVdGlscz1tYWtlU3RvcmVVdGlscyhWYXREYXRhR2xvYmFsKTtcbmNvbnN0ICAgICAgIHtcbnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZX09XG5nbG9iYWxTdG9yZVV0aWxzOyRo4oCNX29uY2UucHJvdmlkZUR1cmFibGVNYXBTdG9yZShwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVmF0RGF0YSI6WyJWYXREYXRhRXhwb3J0Il0sImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCJdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIl0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIl0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdLCJtYWtlS2luZEhhbmRsZSI6WyJtYWtlS2luZEhhbmRsZSJdLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiOlsicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXSwibWFrZVNjYWxhckJpZ01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSwiY2FuQmVEdXJhYmxlIjpbImNhbkJlRHVyYWJsZSJdLCJwaWNrRmFjZXQiOlsicGlja0ZhY2V0Il0sInBhcnRpYWxBc3NpZ24iOlsicGFydGlhbEFzc2lnbiJdLCJwcm92aWRlIjpbInByb3ZpZGUiXSwibWFrZVN0b3JlVXRpbHMiOlsibWFrZVN0b3JlVXRpbHMiXSwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADlsQnM20MAANtDAAAlAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdGltZSJdLCJleHBvcnRzIjpbIkFkbWluRmFjZXRJIiwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIiwiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSIsIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIiwiQnVuZGxlQ2FwU2hhcGUiLCJCdW5kbGVTaGFwZSIsIkV4aXRPYmplY3RJIiwiRXhpdE9iamVjdFNoYXBlIiwiRmVlTWludEFjY2Vzc1NoYXBlIiwiRnVsbFByb3Bvc2FsU2hhcGUiLCJIYW5kbGVJIiwiSGFuZGxlT2ZmZXJJIiwiSW5zdGFsbGF0aW9uU2hhcGUiLCJJbnN0YW5jZUFkbWluSSIsIkluc3RhbmNlQWRtaW5TaGFwZSIsIkluc3RhbmNlSGFuZGxlU2hhcGUiLCJJbnN0YW5jZVJlY29yZFNoYXBlIiwiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIiwiSW52aXRhdGlvbkhhbmRsZVNoYXBlIiwiSW52aXRhdGlvblNoYXBlIiwiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSIsIklzc3VlclJlY29yZFNoYXBlIiwiS2V5d29yZFNoYXBlIiwiT2ZmZXJIYW5kbGVySSIsIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIiwiUHJpY2VRdW90ZVNoYXBlIiwiUHJvcG9zYWxTaGFwZSIsIlNlYXREYXRhU2hhcGUiLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSIsIlNlYXRTaGFwZSIsIlRlcm1zU2hhcGUiLCJUaW1lclNoYXBlIiwiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiLCJaY2ZNaW50SSIsIlpvZU1pbnRJIiwiWm9lTWludFNoYXBlIiwiWm9lU2VydmljZUkiLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSIsImlzT25EZW1hbmRFeGl0UnVsZSIsImlzV2FpdmVkRXhpdFJ1bGUiLCJtYWtlSGFuZGxlU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50U2hhcGUsQXNzZXRLaW5kU2hhcGUsQnJhbmRTaGFwZSxEaXNwbGF5SW5mb1NoYXBlLElzc3VlcktpdFNoYXBlLElzc3VlclNoYXBlLFBheW1lbnRTaGFwZSxTdWJzY3JpYmVyU2hhcGUsTSxUaW1lc3RhbXBTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudFNoYXBlXCIsIFskaOKAjV9hID0+IChBbW91bnRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiQXNzZXRLaW5kU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZFNoYXBlID0gJGjigI1fYSldXSxbXCJCcmFuZFNoYXBlXCIsIFskaOKAjV9hID0+IChCcmFuZFNoYXBlID0gJGjigI1fYSldXSxbXCJEaXNwbGF5SW5mb1NoYXBlXCIsIFskaOKAjV9hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjigI1fYSldXSxbXCJJc3N1ZXJLaXRTaGFwZVwiLCBbJGjigI1fYSA9PiAoSXNzdWVyS2l0U2hhcGUgPSAkaOKAjV9hKV1dLFtcIklzc3VlclNoYXBlXCIsIFskaOKAjV9hID0+IChJc3N1ZXJTaGFwZSA9ICRo4oCNX2EpXV0sW1wiUGF5bWVudFNoYXBlXCIsIFskaOKAjV9hID0+IChQYXltZW50U2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsIFskaOKAjV9hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlRpbWVzdGFtcFNoYXBlXCIsIFskaOKAjV9hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIGtleXdvcmRzIGhhdmUgYW4gaW5pdGlhbCBjYXAqL1xuY29uc3QgICAgICAgIEtleXdvcmRTaGFwZT1NLnN0cmluZygpOyRo4oCNX29uY2UuS2V5d29yZFNoYXBlKEtleXdvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uSGFuZGxlU2hhcGU9TS5yZW1vdGFibGUoJ0ludml0YXRpb25IYW5kbGUnKTskaOKAjV9vbmNlLkludml0YXRpb25IYW5kbGVTaGFwZShJbnZpdGF0aW9uSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIEludml0YXRpb25TaGFwZT1NLnJlbW90YWJsZSgnSW52aXRhdGlvbicpOyRo4oCNX29uY2UuSW52aXRhdGlvblNoYXBlKEludml0YXRpb25TaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VIYW5kbGVTaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFuY2VIYW5kbGUnKTskaOKAjV9vbmNlLkluc3RhbmNlSGFuZGxlU2hhcGUoSW5zdGFuY2VIYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFsbGF0aW9uU2hhcGU9TS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpOyRo4oCNX29uY2UuSW5zdGFsbGF0aW9uU2hhcGUoSW5zdGFsbGF0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIFNlYXRTaGFwZT1NLnJlbW90YWJsZSgnU2VhdCcpOyRo4oCNX29uY2UuU2VhdFNoYXBlKFNlYXRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsQW1vdW50U2hhcGUpOyRo4oCNX29uY2UuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSk7XG5jb25zdCAgICAgICAgQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKFxuS2V5d29yZFNoYXBlLFxuTS5wYXR0ZXJuKCkpOyRo4oCNX29uY2UuQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZShBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoXG5LZXl3b3JkU2hhcGUsXG5NLmVyZWYoUGF5bWVudFNoYXBlKSk7JGjigI1fb25jZS5QYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZShQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsSXNzdWVyU2hhcGUpOyRo4oCNX29uY2UuSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSk7XG5jb25zdCAgICAgICAgSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKFxuS2V5d29yZFNoYXBlLFxuTS5lcmVmKElzc3VlclNoYXBlKSk7JGjigI1fb25jZS5Jc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlKElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsQnJhbmRTaGFwZSk7JGjigI1fb25jZS5CcmFuZEtleXdvcmRSZWNvcmRTaGFwZShCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBJc3N1ZXJSZWNvcmRTaGFwZT1NLnNwbGl0UmVjb3JkKFxue1xuYnJhbmQ6QnJhbmRTaGFwZSxcbmlzc3VlcjpJc3N1ZXJTaGFwZSxcbmFzc2V0S2luZDpBc3NldEtpbmRTaGFwZX0sXG5cbntkaXNwbGF5SW5mbzpEaXNwbGF5SW5mb1NoYXBlfSk7JGjigI1fb25jZS5Jc3N1ZXJSZWNvcmRTaGFwZShJc3N1ZXJSZWNvcmRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFRlcm1zU2hhcGU9aGFyZGVuKHtcbmlzc3VlcnM6SXNzdWVyS2V5d29yZFJlY29yZFNoYXBlLFxuYnJhbmRzOkJyYW5kS2V5d29yZFJlY29yZFNoYXBlfSk7JGjigI1fb25jZS5UZXJtc1NoYXBlKFRlcm1zU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBJbnN0YW5jZVJlY29yZFNoYXBlPWhhcmRlbih7XG5pbnN0YWxsYXRpb246SW5zdGFsbGF0aW9uU2hhcGUsXG5pbnN0YW5jZTpJbnN0YW5jZUhhbmRsZVNoYXBlLFxudGVybXM6TS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKX0pOyRo4oCNX29uY2UuSW5zdGFuY2VSZWNvcmRTaGFwZShJbnN0YW5jZVJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgSGFuZGxlST1NLmludGVyZmFjZSgnSGFuZGxlJyx7fSk7JGjigI1fb25jZS5IYW5kbGVJKEhhbmRsZUkpO1xuXG5jb25zdCAgICAgICAgbWFrZUhhbmRsZVNoYXBlPShuYW1lKT0+TS5yZW1vdGFibGUoIGAke25hbWV9SGFuZGxlYCk7JGjigI1fb25jZS5tYWtlSGFuZGxlU2hhcGUobWFrZUhhbmRsZVNoYXBlKTtcbmNvbnN0ICAgICAgICBUaW1lclNoYXBlPW1ha2VIYW5kbGVTaGFwZSgndGltZXInKTtcblxuLyoqXG4gKiBBZnRlciBkZWZhdWx0cyBhcmUgZmlsbGVkIGluXG4gKlxuICogQHNlZSB7UHJvcG9zYWxSZWNvcmR9IHR5cGVcbiAqLyRo4oCNX29uY2UuVGltZXJTaGFwZShUaW1lclNoYXBlKTtcbmNvbnN0ICAgICAgICBGdWxsUHJvcG9zYWxTaGFwZT1oYXJkZW4oe1xud2FudDpBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlLFxuZ2l2ZTpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG4vKiBUbyBhY2NlcHQgb25seSBvbmUsIHdlIGNvdWxkIHVzZSBNLm9yIHJhdGhlciB0aGFuIE0uc3BsaXRSZWNvcmQsKi9cbi8qIGJ1dCB0aGUgZXJyb3IgbWVzc2FnZXMgd291bGQgaGF2ZSBiZWVuIHdvcnNlLiBSYXRoZXIsKi9cbi8qIGNsZWFuUHJvcG9zYWwncyBhc3NlcnRFeGl0IGNoZWNrcyB0aGF0IHRoZXJlJ3MgZXhhY3RseSBvbmUuKi9cbmV4aXQ6TS5zcGxpdFJlY29yZChcbnt9LFxue1xub25EZW1hbmQ6bnVsbCxcbndhaXZlZDpudWxsLFxuYWZ0ZXJEZWFkbGluZTp7XG50aW1lcjpNLmVyZWYoVGltZXJTaGFwZSksXG5kZWFkbGluZTpUaW1lc3RhbXBTaGFwZX19LFxuXG5cbnt9KX0pO1xuXG5cbi8qKiBAc2VlIHtQcm9wb3NhbH0gdHlwZSAqLyRo4oCNX29uY2UuRnVsbFByb3Bvc2FsU2hhcGUoRnVsbFByb3Bvc2FsU2hhcGUpO1xuY29uc3QgICAgICAgIFByb3Bvc2FsU2hhcGU9TS5zcGxpdFJlY29yZCh7fSxGdWxsUHJvcG9zYWxTaGFwZSx7fSk7JGjigI1fb25jZS5Qcm9wb3NhbFNoYXBlKFByb3Bvc2FsU2hhcGUpO1xuXG5jb25zdCAgICAgICAgaXNPbkRlbWFuZEV4aXRSdWxlPShleGl0KT0+e1xuY29uc3RbZXhpdEtleV09T2JqZWN0LmtleXMoZXhpdCk7XG5yZXR1cm4gZXhpdEtleT09PSdvbkRlbWFuZCc7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKiBAcmV0dXJucyB7ZXhpdCBpcyBXYWl2ZWRFeGl0UnVsZX1cbiAqLyRo4oCNX29uY2UuaXNPbkRlbWFuZEV4aXRSdWxlKGlzT25EZW1hbmRFeGl0UnVsZSk7XG5jb25zdCAgICAgICAgaXNXYWl2ZWRFeGl0UnVsZT0oZXhpdCk9PntcbmNvbnN0W2V4aXRLZXldPU9iamVjdC5rZXlzKGV4aXQpO1xucmV0dXJuIGV4aXRLZXk9PT0nd2FpdmVkJztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqIEByZXR1cm5zIHtleGl0IGlzIEFmdGVyRGVhZGxpbmVFeGl0UnVsZX1cbiAqLyRo4oCNX29uY2UuaXNXYWl2ZWRFeGl0UnVsZShpc1dhaXZlZEV4aXRSdWxlKTtcbmNvbnN0ICAgICAgICBpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZT0oZXhpdCk9PntcbmNvbnN0W2V4aXRLZXldPU9iamVjdC5rZXlzKGV4aXQpO1xucmV0dXJuIGV4aXRLZXk9PT0nYWZ0ZXJEZWFkbGluZSc7XG4gfTskaOKAjV9vbmNlLmlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKTtcblxuY29uc3QgICAgICAgIEludml0YXRpb25FbGVtZW50U2hhcGU9TS5zcGxpdFJlY29yZCh7XG5kZXNjcmlwdGlvbjpNLnN0cmluZygpLFxuaGFuZGxlOkludml0YXRpb25IYW5kbGVTaGFwZSxcbmluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGUsXG5pbnN0YWxsYXRpb246SW5zdGFsbGF0aW9uU2hhcGV9KTskaOKAjV9vbmNlLkludml0YXRpb25FbGVtZW50U2hhcGUoSW52aXRhdGlvbkVsZW1lbnRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIE9mZmVySGFuZGxlckk9TS5pbnRlcmZhY2UoJ09mZmVySGFuZGxlcicse1xuaGFuZGxlOk0uY2FsbChTZWF0U2hhcGUpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5zdHJpbmcoKSl9KTskaOKAjV9vbmNlLk9mZmVySGFuZGxlckkoT2ZmZXJIYW5kbGVySSk7XG5cblxuY29uc3QgICAgICAgIFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlPU0uYXJyYXlPZihcbmhhcmRlbih7XG5zZWF0SGFuZGxlOlNlYXRTaGFwZSxcbmFsbG9jYXRpb246QW1vdW50S2V5d29yZFJlY29yZFNoYXBlfSkpOyRo4oCNX29uY2UuU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpO1xuXG5cblxuY29uc3QgICAgICAgIFpvZU1pbnRTaGFwZT1NLnJlbW90YWJsZSgnWm9lTWludCcpOyRo4oCNX29uY2UuWm9lTWludFNoYXBlKFpvZU1pbnRTaGFwZSk7XG5jb25zdCAgICAgICAgWm9lTWludEk9TS5pbnRlcmZhY2UoJ1pvZU1pbnQnLHtcbmdldElzc3VlclJlY29yZDpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclJlY29yZFNoYXBlKSxcbm1pbnRBbmRFc2Nyb3c6TS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCksXG53aXRoZHJhd0FuZEJ1cm46TS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLlpvZU1pbnRJKFpvZU1pbnRJKTtcblxuXG5jb25zdCAgICAgICAgWmNmTWludEk9TS5pbnRlcmZhY2UoJ1pjZk1pbnQnLHtcbmdldElzc3VlclJlY29yZDpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclJlY29yZFNoYXBlKSxcbm1pbnRHYWluczpNLmNhbGwoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKS5cbm9wdGlvbmFsKE0ucmVtb3RhYmxlKCd6Y2ZTZWF0JykpLlxucmV0dXJucyhNLnJlbW90YWJsZSgnemNmU2VhdCcpKSxcbmJ1cm5Mb3NzZXM6TS5jYWxsKFxuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuTS5yZW1vdGFibGUoJ3pjZlNlYXQnKSkuXG5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLlpjZk1pbnRJKFpjZk1pbnRJKTtcblxuXG5jb25zdCAgICAgICAgRmVlTWludEFjY2Vzc1NoYXBlPU0ucmVtb3RhYmxlKCdGZWVNaW50QWNjZXNzJyk7JGjigI1fb25jZS5GZWVNaW50QWNjZXNzU2hhcGUoRmVlTWludEFjY2Vzc1NoYXBlKTtcblxuY29uc3QgICAgICAgIEV4aXRPYmplY3RJPU0uaW50ZXJmYWNlKCdFeGl0IE9iamVjdCcse1xuZXhpdDpNLmNhbGwoKS5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLkV4aXRPYmplY3RJKEV4aXRPYmplY3RJKTtcblxuXG5jb25zdCAgICAgICAgRXhpdE9iamVjdFNoYXBlPU0ucmVtb3RhYmxlKCdFeGl0T2JqJyk7JGjigI1fb25jZS5FeGl0T2JqZWN0U2hhcGUoRXhpdE9iamVjdFNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnN0YW5jZUFkbWluU2hhcGU9TS5yZW1vdGFibGUoJ0luc3RhbmNlQWRtaW4nKTskaOKAjV9vbmNlLkluc3RhbmNlQWRtaW5TaGFwZShJbnN0YW5jZUFkbWluU2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbmNlQWRtaW5JPU0uaW50ZXJmYWNlKCdJbnN0YW5jZUFkbWluJyx7XG5tYWtlSW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLE0uc3RyaW5nKCkpLlxub3B0aW9uYWwoTS5yZWNvcmQoKSxNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKEludml0YXRpb25TaGFwZSksXG5zYXZlSXNzdWVyOk0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSksS2V5d29yZFNoYXBlKS5yZXR1cm5zKFxuSXNzdWVyUmVjb3JkU2hhcGUpLFxuXG5tYWtlTm9Fc2Nyb3dTZWF0Ok0uY2FsbChcbkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcblByb3Bvc2FsU2hhcGUsXG5FeGl0T2JqZWN0U2hhcGUsXG5TZWF0U2hhcGUpLlxucmV0dXJucyhTZWF0U2hhcGUpLFxuZXhpdEFsbFNlYXRzOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsQWxsU2VhdHM6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmV4aXRTZWF0Ok0uY2FsbChTZWF0U2hhcGUsTS5hbnkoKSkucmV0dXJucygpLFxuZmFpbFNlYXQ6TS5jYWxsKFNlYXRTaGFwZSxNLmFueSgpKS5yZXR1cm5zKCksXG5tYWtlWm9lTWludDpNLmNhbGwoS2V5d29yZFNoYXBlKS5cbm9wdGlvbmFsKFxuQXNzZXRLaW5kU2hhcGUsXG5EaXNwbGF5SW5mb1NoYXBlLFxuTS5zcGxpdFJlY29yZChoYXJkZW4oe30pLGhhcmRlbih7ZWxlbWVudFNoYXBlOk0ucGF0dGVybigpfSkpKS5cblxucmV0dXJucyhNLnJlbW90YWJsZSgnem9lTWludCcpKSxcbnJlZ2lzdGVyRmVlTWludDpNLmNhbGwoS2V5d29yZFNoYXBlLEZlZU1pbnRBY2Nlc3NTaGFwZSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdmZWVNaW50JykpLFxuXG5yZXBsYWNlQWxsb2NhdGlvbnM6TS5jYWxsKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKS5yZXR1cm5zKCksXG5zdG9wQWNjZXB0aW5nT2ZmZXJzOk0uY2FsbCgpLnJldHVybnMoKSxcbnNldE9mZmVyRmlsdGVyOk0uY2FsbChNLmFycmF5T2YoTS5zdHJpbmcoKSkpLnJldHVybnMoKSxcbmdldE9mZmVyRmlsdGVyOk0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbmdldEV4aXRTdWJzY3JpYmVyOk0uY2FsbChTZWF0U2hhcGUpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbmlzQmxvY2tlZDpNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLmJvb2xlYW4oKSl9KTskaOKAjV9vbmNlLkluc3RhbmNlQWRtaW5JKEluc3RhbmNlQWRtaW5JKTtcblxuXG5jb25zdCAgICAgICAgSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQ9aGFyZGVuKHtcbmluc3RhbmNlU3RvcmFnZU1hbmFnZXI6TS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXInLHtcbmdldFRlcm1zOk0uY2FsbCgpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG5nZXRJc3N1ZXJzOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEJyYW5kczpNLmNhbGwoKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEluc3RhbGxhdGlvbjpNLmNhbGwoKS5yZXR1cm5zKEluc3RhbGxhdGlvblNoYXBlKSxcbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5cbnNhdmVJc3N1ZXI6TS5jYWxsKElzc3VlclNoYXBlLEtleXdvcmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG5tYWtlWm9lTWludDpNLmNhbGwoS2V5d29yZFNoYXBlKS5cbm9wdGlvbmFsKFxuQXNzZXRLaW5kU2hhcGUsXG5EaXNwbGF5SW5mb1NoYXBlLFxuTS5zcGxpdFJlY29yZChoYXJkZW4oe30pLGhhcmRlbih7ZWxlbWVudFNoYXBlOk0ucGF0dGVybigpfSkpKS5cblxucmV0dXJucyhNLmVyZWYoWm9lTWludFNoYXBlKSksXG5yZWdpc3RlckZlZU1pbnQ6TS5jYWxsKEtleXdvcmRTaGFwZSxGZWVNaW50QWNjZXNzU2hhcGUpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnZmVlTWludCcpKSxcblxuZ2V0SW5zdGFuY2VSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZVJlY29yZFNoYXBlKSxcbmdldElzc3VlclJlY29yZHM6TS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoSXNzdWVyUmVjb3JkU2hhcGUpKSxcbmdldFdpdGhkcmF3RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnV2l0aGRyYXdGYWNldCcpKSxcbmluaXRJbnN0YW5jZUFkbWluOk0uY2FsbChcbkluc3RhbmNlSGFuZGxlU2hhcGUsXG5NLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxuZGVsZXRlSW5zdGFuY2VBZG1pbjpNLmNhbGwoSW5zdGFuY2VBZG1pbkkpLnJldHVybnMoKSxcbm1ha2VJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnJlY29yZCgpLE0ucGF0dGVybigpKS5cbnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmdldFJvb3Q6TS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSxcbmdldEFkbWluTm9kZTpNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdhZG1pbk5vZGUnKSl9KSxcblxud2l0aGRyYXdGYWNldDpNLmludGVyZmFjZSgnV2l0aGRyYXdGYWNldCcse1xud2l0aGRyYXdQYXltZW50czpNLmNhbGwoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKS5yZXR1cm5zKFxuUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpfSksXG5cblxuaGVscGVyczpNLmludGVyZmFjZSgnSW5zdGFuY2VTdG9yYWdlTWFuYWdlciBoZWxwZXInLHtcbndyYXBJc3N1ZXJLaXRXaXRoWm9lTWludDpNLmNhbGwoXG5LZXl3b3JkU2hhcGUsXG5Jc3N1ZXJLaXRTaGFwZSxcbk0ucmVtb3RhYmxlKCdhZG1pbk5vZGUnKSkuXG5yZXR1cm5zKFpvZU1pbnRTaGFwZSl9KX0pOyRo4oCNX29uY2UuSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQoSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuXG5cblxuY29uc3QgICAgICAgIEJ1bmRsZUNhcFNoYXBlPU0ucmVtb3RhYmxlKCdidW5kbGVDYXAnKTskaOKAjV9vbmNlLkJ1bmRsZUNhcFNoYXBlKEJ1bmRsZUNhcFNoYXBlKTtcbmNvbnN0ICAgICAgICBCdW5kbGVTaGFwZT1NLmFuZChcbk0uc3BsaXRSZWNvcmQoe21vZHVsZUZvcm1hdDpNLmFueSgpfSksXG5NLnJlY29yZE9mKE0uc3RyaW5nKCksTS5zdHJpbmcoe3N0cmluZ0xlbmd0aExpbWl0OkluZmluaXR5fSkpKTskaOKAjV9vbmNlLkJ1bmRsZVNoYXBlKEJ1bmRsZVNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGU9TS5zcGxpdFJlY29yZChcbmhhcmRlbih7XG5pbnN0YWxsYXRpb246SW5zdGFsbGF0aW9uU2hhcGV9KSxcblxuaGFyZGVuKHtcbmJ1bmRsZTpNLnJlY29yZE9mKE0uc3RyaW5nKCksTS5zdHJpbmcoe3N0cmluZ0xlbmd0aExpbWl0OkluZmluaXR5fSkpLFxuYnVuZGxlQ2FwOkJ1bmRsZUNhcFNoYXBlLFxuYnVuZGxlSUQ6TS5zdHJpbmcoKX0pLFxuXG5oYXJkZW4oe30pKTskaOKAjV9vbmNlLlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlKFVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgWm9lU3RvcmFnZU1hbmFnZXJJS2l0PWhhcmRlbih7XG56b2VTZXJ2aWNlRGF0YUFjY2VzczpNLmludGVyZmFjZSgnWm9lU2VydmljZSBkYXRhQWNjZXNzJyx7XG5nZXRUZXJtczpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpKSxcbmdldElzc3VlcnM6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEJyYW5kczpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG5nZXRJbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSksXG5cbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5cbmdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjpNLmNhbGwoSW5zdGFsbGF0aW9uU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5zdHJpbmcoKSkpLFxuXG5pbnN0YWxsQnVuZGxlOk0uY2FsbChNLm9yKEluc3RhbmNlSGFuZGxlU2hhcGUsQnVuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5wcm9taXNlKCkpLFxuXG5pbnN0YWxsQnVuZGxlSUQ6TS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuXG5nZXRQdWJsaWNGYWNldDpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbk0uZXJlZihNLnJlbW90YWJsZSgnUHVibGljRmFjZXQnKSkpLFxuXG5nZXRPZmZlckZpbHRlcjpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ub3B0KE0ucGF0dGVybigpKSl9KSxcblxuXG5tYWtlT2ZmZXJBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgbWFrZU9mZmVyIGFjY2Vzcycse1xuZ2V0QXNzZXRLaW5kQnlCcmFuZDpNLmNhbGwoQnJhbmRTaGFwZSkucmV0dXJucyhBc3NldEtpbmRTaGFwZSksXG5nZXRJbnN0YW5jZUFkbWluOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKSksXG5cbmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLm9wdChNLnBhdHRlcm4oKSkpLFxuXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuZGVwb3NpdFBheW1lbnRzOk0uY2FsbChQcm9wb3NhbFNoYXBlLFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKS5yZXR1cm5zKFxuTS5wcm9taXNlKCkpfSksXG5cblxuc3RhcnRJbnN0YW5jZUFjY2VzczpNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBzdGFydEluc3RhbmNlIGFjY2Vzcycse1xubWFrZVpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXI6TS5jYWxsKFxuTS5hbnkoKSxcbkluc3RhbGxhdGlvblNoYXBlLFxuTS5hbnkoKSxcbklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUsXG5NLm9yKEluc3RhbmNlSGFuZGxlU2hhcGUsQnVuZGxlU2hhcGUpLFxuTS5vcihCdW5kbGVDYXBTaGFwZSxCdW5kbGVTaGFwZSkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG51bndyYXBJbnN0YWxsYXRpb246TS5jYWxsV2hlbihNLmVyZWYoSW5zdGFsbGF0aW9uU2hhcGUpKS5yZXR1cm5zKFxuVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUpfSksXG5cblxuaW52aXRhdGlvbklzc3VlckFjY2VzczpNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBpbnZpdGF0aW9uSXNzdWVyJyx7XG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpfSl9KTskaOKAjV9vbmNlLlpvZVN0b3JhZ2VNYW5hZ2VySUtpdChab2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuXG5cblxuY29uc3QgICAgICAgIFpvZVNlcnZpY2VJPU0uaW50ZXJmYWNlKCdab2VTZXJ2aWNlJyx7XG5pbnN0YWxsOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmluc3RhbGxCdW5kbGVJRDpNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5zdGFydEluc3RhbmNlOk0uY2FsbChNLmVyZWYoSW5zdGFsbGF0aW9uU2hhcGUpKS5cbm9wdGlvbmFsKElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUsTS5hbnkoKSxNLmFueSgpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxub2ZmZXI6TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5cbm9wdGlvbmFsKFByb3Bvc2FsU2hhcGUsUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUsTS5hbnkoKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblxuZ2V0T2ZmZXJGaWx0ZXI6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcblxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEZlZUlzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEJyYW5kczpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5CcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG5cbmdldElzc3VlcnM6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcblxuZ2V0UHVibGljRmFjZXQ6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JykpLFxuXG5nZXRUZXJtczpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG5nZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZTpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5NLmVyZWYoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSksXG5cbmdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjpNLmNhbGwoSW5zdGFsbGF0aW9uU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5zdHJpbmcoKSkpLFxuXG5cbmdldEluc3RhbGxhdGlvbjpNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0SW5zdGFuY2U6TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldENvbmZpZ3VyYXRpb246TS5jYWxsKCkucmV0dXJucyh7XG5mZWVJc3N1ZXJDb25maWc6e1xubmFtZTpNLnN0cmluZygpLFxuYXNzZXRLaW5kOiduYXQnLFxuZGlzcGxheUluZm86RGlzcGxheUluZm9TaGFwZX19KSxcblxuXG5nZXRJbnZpdGF0aW9uRGV0YWlsczpNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG5nZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5vcHQoUHJvcG9zYWxTaGFwZSkpfSk7JGjigI1fb25jZS5ab2VTZXJ2aWNlSShab2VTZXJ2aWNlSSk7XG5cblxuXG5jb25zdCAgICAgICAgQWRtaW5GYWNldEk9TS5pbnRlcmZhY2UoJ1pjZkFkbWluRmFjZXQnLHtcbmdldFZhdFNodXRkb3duUHJvbWlzZTpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnJlc3RhcnRDb250cmFjdDpNLmNhbGwoKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnVwZ3JhZGVDb250cmFjdDpNLmNhbGwoTS5zdHJpbmcoKSkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSl9KTskaOKAjV9vbmNlLkFkbWluRmFjZXRJKEFkbWluRmFjZXRJKTtcblxuXG5jb25zdCAgICAgICAgU2VhdERhdGFTaGFwZT1NLnNwbGl0UmVjb3JkKFxue1xucHJvcG9zYWw6UHJvcG9zYWxTaGFwZSxcbmluaXRpYWxBbGxvY2F0aW9uOkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbnNlYXRIYW5kbGU6U2VhdFNoYXBlfSxcblxue1xub2ZmZXJBcmdzOk0uYW55KCl9KTskaOKAjV9vbmNlLlNlYXREYXRhU2hhcGUoU2VhdERhdGFTaGFwZSk7XG5cblxuXG5jb25zdCAgICAgICAgSGFuZGxlT2ZmZXJJPU0uaW50ZXJmYWNlKCdIYW5kbGVPZmZlcicse1xuaGFuZGxlT2ZmZXI6TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSxTZWF0RGF0YVNoYXBlKS5yZXR1cm5zKHtcbm9mZmVyUmVzdWx0UHJvbWlzZTpNLnByb21pc2UoKSxcbmV4aXRPYmo6RXhpdE9iamVjdFNoYXBlfSl9KTskaOKAjV9vbmNlLkhhbmRsZU9mZmVySShIYW5kbGVPZmZlckkpO1xuXG5cblxuY29uc3QgICAgICAgIFByaWNlUXVvdGVTaGFwZT1oYXJkZW4oe1xucXVvdGVBbW91bnQ6QW1vdW50U2hhcGUsXG5xdW90ZVBheW1lbnQ6TS5lcmVmKFBheW1lbnRTaGFwZSl9KTskaOKAjV9vbmNlLlByaWNlUXVvdGVTaGFwZShQcmljZVF1b3RlU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IktleXdvcmRTaGFwZSI6WyJLZXl3b3JkU2hhcGUiXSwiSW52aXRhdGlvbkhhbmRsZVNoYXBlIjpbIkludml0YXRpb25IYW5kbGVTaGFwZSJdLCJJbnZpdGF0aW9uU2hhcGUiOlsiSW52aXRhdGlvblNoYXBlIl0sIkluc3RhbmNlSGFuZGxlU2hhcGUiOlsiSW5zdGFuY2VIYW5kbGVTaGFwZSJdLCJJbnN0YWxsYXRpb25TaGFwZSI6WyJJbnN0YWxsYXRpb25TaGFwZSJdLCJTZWF0U2hhcGUiOlsiU2VhdFNoYXBlIl0sIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSI6WyJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiXSwiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSI6WyJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIl0sIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIjpbIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSI6WyJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSI6WyJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIl0sIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIjpbIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclJlY29yZFNoYXBlIjpbIklzc3VlclJlY29yZFNoYXBlIl0sIlRlcm1zU2hhcGUiOlsiVGVybXNTaGFwZSJdLCJJbnN0YW5jZVJlY29yZFNoYXBlIjpbIkluc3RhbmNlUmVjb3JkU2hhcGUiXSwiSGFuZGxlSSI6WyJIYW5kbGVJIl0sIm1ha2VIYW5kbGVTaGFwZSI6WyJtYWtlSGFuZGxlU2hhcGUiXSwiVGltZXJTaGFwZSI6WyJUaW1lclNoYXBlIl0sIkZ1bGxQcm9wb3NhbFNoYXBlIjpbIkZ1bGxQcm9wb3NhbFNoYXBlIl0sIlByb3Bvc2FsU2hhcGUiOlsiUHJvcG9zYWxTaGFwZSJdLCJpc09uRGVtYW5kRXhpdFJ1bGUiOlsiaXNPbkRlbWFuZEV4aXRSdWxlIl0sImlzV2FpdmVkRXhpdFJ1bGUiOlsiaXNXYWl2ZWRFeGl0UnVsZSJdLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSI6WyJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSJdLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIjpbIkludml0YXRpb25FbGVtZW50U2hhcGUiXSwiT2ZmZXJIYW5kbGVySSI6WyJPZmZlckhhbmRsZXJJIl0sIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIjpbIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIl0sIlpvZU1pbnRTaGFwZSI6WyJab2VNaW50U2hhcGUiXSwiWm9lTWludEkiOlsiWm9lTWludEkiXSwiWmNmTWludEkiOlsiWmNmTWludEkiXSwiRmVlTWludEFjY2Vzc1NoYXBlIjpbIkZlZU1pbnRBY2Nlc3NTaGFwZSJdLCJFeGl0T2JqZWN0SSI6WyJFeGl0T2JqZWN0SSJdLCJFeGl0T2JqZWN0U2hhcGUiOlsiRXhpdE9iamVjdFNoYXBlIl0sIkluc3RhbmNlQWRtaW5TaGFwZSI6WyJJbnN0YW5jZUFkbWluU2hhcGUiXSwiSW5zdGFuY2VBZG1pbkkiOlsiSW5zdGFuY2VBZG1pbkkiXSwiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiXSwiQnVuZGxlQ2FwU2hhcGUiOlsiQnVuZGxlQ2FwU2hhcGUiXSwiQnVuZGxlU2hhcGUiOlsiQnVuZGxlU2hhcGUiXSwiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiOlsiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiXSwiWm9lU3RvcmFnZU1hbmFnZXJJS2l0IjpbIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJab2VTZXJ2aWNlSSI6WyJab2VTZXJ2aWNlSSJdLCJBZG1pbkZhY2V0SSI6WyJBZG1pbkZhY2V0SSJdLCJTZWF0RGF0YVNoYXBlIjpbIlNlYXREYXRhU2hhcGUiXSwiSGFuZGxlT2ZmZXJJIjpbIkhhbmRsZU9mZmVySSJdLCJQcmljZVF1b3RlU2hhcGUiOlsiUHJpY2VRdW90ZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALfCvHviBgAA4gYAAB8AAABAYWdvcmljL3pvbmUtdjAuMi4yL3NyYy9oZWFwLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJNIiwiaGVhcFpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUV4byxkZWZpbmVFeG9DbGFzcyxkZWZpbmVFeG9DbGFzc0tpdCxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhclNldFN0b3JlLG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxNLEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlRXhvXCIsIFskaOKAjV9hID0+IChtYWtlRXhvID0gJGjigI1fYSldXSxbXCJkZWZpbmVFeG9DbGFzc1wiLCBbJGjigI1fYSA9PiAoZGVmaW5lRXhvQ2xhc3MgPSAkaOKAjV9hKV1dLFtcImRlZmluZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChkZWZpbmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcIm1ha2VTY2FsYXJTZXRTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhclNldFN0b3JlID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyV2Vha1NldFN0b3JlID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSksJGjigI1fbGl2ZVtcIk1cIl1dXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0eXBlIHtYaW1wb3J0KCcuJykuU3RvcmVzfVxuICovXG5jb25zdCBoZWFwU3RvcmVzPUZhcignaGVhcFN0b3Jlcycse1xuZGV0YWNoZWQ6KCk9PmhlYXBTdG9yZXMsXG5pc1N0b3JhYmxlOihfc3BlY2ltZW4pPT50cnVlLFxuXG5zZXRTdG9yZTptYWtlU2NhbGFyU2V0U3RvcmUsXG5tYXBTdG9yZTptYWtlU2NhbGFyTWFwU3RvcmUsXG53ZWFrTWFwU3RvcmU6bWFrZVNjYWxhcldlYWtNYXBTdG9yZSxcbndlYWtTZXRTdG9yZTptYWtlU2NhbGFyV2Vha1NldFN0b3JlfSk7XG5cblxuLyoqXG4gKiBBIGhlYXAgKGluLW1lbW9yeSkgem9uZSB0aGF0IHVzZXMgdGhlIGRlZmF1bHQgZXhvIGFuZCBzdG9yZSBpbXBsZW1lbnRhdGlvbnMuXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4nKS5ab25lfVxuICovXG5jb25zdCAgICAgICAgaGVhcFpvbmU9RmFyKCdoZWFwWm9uZScse1xuZXhvQ2xhc3M6ZGVmaW5lRXhvQ2xhc3MsXG5leG9DbGFzc0tpdDpkZWZpbmVFeG9DbGFzc0tpdCxcbmV4bzptYWtlRXhvLFxuc3ViWm9uZTooX2xhYmVsLF9vcHRpb25zKT0+aGVhcFpvbmUsXG4uLi5oZWFwU3RvcmVzfSk7JGjigI1fb25jZS5oZWFwWm9uZShoZWFwWm9uZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiTSI6WyJNIixmYWxzZV19LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGVhcFpvbmUiOlsiaGVhcFpvbmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2PQZMI8JAACPCQAAIAAAAEBhZ29yaWMvem9uZS12MC4yLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vaGVhcC5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2hlYXAuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUV4byxkZWZpbmVFeG9DbGFzcyxkZWZpbmVFeG9DbGFzc0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlRXhvXCIsIFskaOKAjV9hID0+IChtYWtlRXhvID0gJGjigI1fYSldXSxbXCJkZWZpbmVFeG9DbGFzc1wiLCBbJGjigI1fYSA9PiAoZGVmaW5lRXhvQ2xhc3MgPSAkaOKAjV9hKV1dLFtcImRlZmluZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChkZWZpbmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlYXAuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuLyogUmVmZXJlbmNlcyB0byBhbGxvdyB0aGUgYmVsb3cgdHlwZW9mcyB0byBzdWNjZWVkLiovXG5tYWtlRXhvO1xuZGVmaW5lRXhvQ2xhc3M7XG5kZWZpbmVFeG9DbGFzc0tpdDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7RXhvWm9uZSAmIFN0b3Jlc30gWm9uZSBBIGJhZyBvZiBtZXRob2RzIGZvciBjcmVhdGluZyBkZWZlbnNpYmxlIG9iamVjdHMgYW5kXG4gKiBjb2xsZWN0aW9ucyB3aXRoIHRoZSBzYW1lIGFsbG9jYXRpb24gc2VtYW50aWNzIChlcGhlbWVyYWwsIHBlcnNpc3RlbnQsIGV0YylcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEV4b1pvbmVcbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIG1ha2VFeG99IGV4byBjcmVhdGUgYSBzaW5nbGV0b24gZXhvLW9iamVjdCBpbnN0YW5jZSBib3VuZCB0byB0aGlzIHpvbmVcbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGRlZmluZUV4b0NsYXNzfSBleG9DbGFzcyBjcmVhdGUgYSBtYWtlciBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBleG8tb2JqZWN0cyBib3VuZCB0byB0aGlzIHpvbmVcbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGRlZmluZUV4b0NsYXNzS2l0fSBleG9DbGFzc0tpdCBjcmVhdGUgYSBcImtpdFwiIG1ha2VyIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgcmVjb3JkIG9mIGV4by1vYmplY3RzIHNoYXJpbmcgdGhlIHNhbWUgc3RhdGVcbiAqIEBwcm9wZXJ0eSB7KGxhYmVsOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yZU9wdGlvbnMpID0+IFpvbmV9IHN1YlpvbmUgY3JlYXRlIGEgbmV3IFpvbmUgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHVudHJ1c3RlZCBjb25zdW1lcnMgd2l0aG91dCBleHBvc2luZyB0aGUgc3RvcmFnZSBvZiB0aGUgcGFyZW50IHpvbmVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3Jlc1xuICogQHByb3BlcnR5IHsoKSA9PiBTdG9yZXN9IGRldGFjaGVkIG9idGFpbiBzdG9yZSBwcm92aWRlcnMgd2hpY2ggYXJlIGRldGFjaGVkICh0aGUgc3RvcmVzIGFyZSBhbm9ueW1vdXMgcmF0aGVyIHRoYW4gYm91bmQgdG8gYGxhYmVsYCBpbiB0aGUgem9uZSlcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiB1bmtub3duKSA9PiBib29sZWFufSBpc1N0b3JhYmxlIHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaW1lbiBjYW4gYmUgc3RvcmVkIGluIHRoZSB6b25lLCB3aGV0aGVyIGFzIGV4by1vYmplY3Qgc3RhdGUgb3IgaW4gYSBzdG9yZVxuICogQHByb3BlcnR5IHs8SyxWPihsYWJlbDogc3RyaW5nLCBvcHRpb25zPzogU3RvcmVPcHRpb25zKSA9PiBNYXBTdG9yZTxLLCBWPn0gbWFwU3RvcmUgcHJvdmlkZSBhIE1hcC1saWtlIHN0b3JlIG5hbWVkIGBsYWJlbGAgaW4gdGhlIHpvbmVcbiAqIEBwcm9wZXJ0eSB7PEs+KGxhYmVsOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yZU9wdGlvbnMpID0+IFNldFN0b3JlPEs+fSBzZXRTdG9yZSBwcm92aWRlIGEgU2V0LWxpa2Ugc3RvcmUgbmFtZWQgYGxhYmVsYCBpbiB0aGUgem9uZVxuICogQHByb3BlcnR5IHs8SyxWPihcbiAqICAgbGFiZWw6IHN0cmluZywgb3B0aW9ucz86IFN0b3JlT3B0aW9ucykgPT4gV2Vha01hcFN0b3JlPEssIFY+XG4gKiB9IHdlYWtNYXBTdG9yZSBwcm92aWRlIGEgV2Vha01hcC1saWtlIHN0b3JlIG5hbWVkIGBsYWJlbGAgaW4gdGhlIHpvbmVcbiAqIEBwcm9wZXJ0eSB7PEs+KFxuICogICBsYWJlbDogc3RyaW5nLCBvcHRpb25zPzogU3RvcmVPcHRpb25zKSA9PiBXZWFrU2V0U3RvcmU8Sz5cbiAqIH0gd2Vha1NldFN0b3JlIHByb3ZpZGUgYSBXZWFrU2V0LWxpa2Ugc3RvcmUgbmFtZWQgYGxhYmVsYCBpbiB0aGUgem9uZVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH4kbi3SEQAA0hEAACQAAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIvc3JjL0UuanN7ImltcG9ydHMiOlsiLi90cmFjay10dXJucy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgdHJhY2tUdXJuczskaOKAjV9pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsIFskaOKAjV9hID0+ICh0cmFja1R1cm5zID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtQcm94eUhhbmRsZXI8YW55Pn0gKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXI9e1xuc2V0KF90YXJnZXQsX3Byb3AsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuaXNFeHRlbnNpYmxlKF90YXJnZXQpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5zZXRQcm90b3R5cGVPZihfdGFyZ2V0LF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmRlbGV0ZVByb3BlcnR5KF90YXJnZXQsX3Byb3Ape1xucmV0dXJuIGZhbHNlO1xuIH19O1xuXG5cbi8qIEUgUHJveHkgaGFuZGxlcnMgcHJldGVuZCB0aGF0IGFueSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIHRhcmdldCBhbmQgcmV0dXJucyovXG4vKiBhIGZ1bmN0aW9uIGZvciB0aGVpciB2YWx1ZS4gV2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBcImJvdW5kXCIgYnkgY29udGV4dCwgaXQgaXMqL1xuLyogbWVhbnQgdG8gYmUgY2FsbGVkIGFzIGEgbWV0aG9kLiBGb3IgdGhhdCByZWFzb24sIHRoZSByZXR1cm5lZCBmdW5jdGlvbiovXG4vKiBpbmNsdWRlcyBhIGNoZWNrIHRoYXQgdGhlIGB0aGlzYCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCovXG4vKiByZWNlaXZlciB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmV0cmlldmVkLiovXG4vKiBFIFByb3h5IGhhbmRsZXJzIGFsc28gZm9yd2FyZCBkaXJlY3QgY2FsbHMgdG8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSByZW1vdGUqL1xuLyogaXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFuIG9iamVjdC4gTm8gc3VjaCByZWNlaXZlciBjaGVja3MgYXJlIG5lY2Vzc2FyeSBpbiovXG4vKiB0aGF0IGNhc2UuKi9cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUoeCkuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSl7XG5yZXR1cm4gaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQoX3RhcmdldCxwLHJlY2VpdmVyKXtcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbmlmKHRoaXMhPT1yZWNlaXZlcil7XG4vKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbmFzc2VydC5lcnJvcihcblggYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtwfVwiIG1ldGhvZCBvZiBFKCR7cSh4KX0pYCkpO1xuXG5cbiB9XG5cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZCh4LHAsYXJncyk7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnQXJyYXk9W10pe1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24oeCxhcmdBcnJheSk7XG4gfSxcbmhhcyhfdGFyZ2V0LF9wKXtcbi8qIFdlIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVzZW5kT25seVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKXtcbnJldHVybiBoYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldChfdGFyZ2V0LHAscmVjZWl2ZXIpe1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3BdKC4uLmFyZ3Mpe1xuLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG50aGlzPT09cmVjZWl2ZXJ8fFxuRmFpbCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocCl9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKFxueClcbiB9KWA7XG5IYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHgscCxhcmdzKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKXtcbkhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seSh4LGFyZ3NBcnJheSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0sXG5oYXMoX3RhcmdldCxfcCl7XG4vKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9pbmRleCcpLkVQcm94eX1cbiAqL1xuZnVuY3Rpb24gICAgICAgICAgICAgICAgbWFrZUUoSGFuZGxlZFByb21pc2Upe1xuZnVuY3Rpb24gRSh4KXtcbmNvbnN0IGhhbmRsZXI9RVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKTtcbnJldHVybiBoYXJkZW4obmV3IFByb3h5KCgpPT57IH0saGFuZGxlcikpO1xuIH1cblxuY29uc3QgbWFrZUVHZXR0ZXJQcm94eT0oeCk9PlxubmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCkse1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhcyhfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiB0cnVlO1xuIH0sXG5nZXQoX3RhcmdldCxwcm9wKXtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5nZXQoeCxwcm9wKTtcbiB9fSk7XG5cblxuRS5nZXQ9bWFrZUVHZXR0ZXJQcm94eTtcbkUucmVzb2x2ZT1IYW5kbGVkUHJvbWlzZS5yZXNvbHZlO1xuRS5zZW5kT25seT0oeCk9PntcbmNvbnN0IGhhbmRsZXI9RXNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpO1xucmV0dXJuIGhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxoYW5kbGVyKSk7XG4gfTtcblxuRS53aGVuPSh4LG9uZnVsZmlsbGVkLG9ucmVqZWN0ZWQpPT57XG5jb25zdFtvbnN1Y2Nlc3Msb25mYWlsdXJlXT10cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSk7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKG9uc3VjY2VzcyxvbmZhaWx1cmUpO1xuIH07XG5cbnJldHVybiBoYXJkZW4oRSk7XG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIG1ha2VFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANwvtTx8CAAAfAgAAKgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoSGFuZGxlZFByb21pc2UpOyRo4oCNX29uY2UuRShFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoVgjP48QAACPEAAALgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQHRzLW5vY2hlY2sqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyogTk9URTogV2UgY2FuJ3QgaW1wb3J0IHRoZXNlIGJlY2F1c2UgdGhleSdyZSBub3QgaW4gc2NvcGUgYmVmb3JlIGxvY2tkb3duLiovXG4vKiBpbXBvcnQgeyBhc3NlcnQsIGRldGFpbHMgYXMgWCwgRmFpbCB9IGZyb20gJ0BhZ29yaWMvYXNzZXJ0JzsqL1xuXG4vKiBXQVJOSU5HOiBHbG9iYWwgTXV0YWJsZSBTdGF0ZSEqL1xuLyogVGhpcyBzdGF0ZSBpcyBjb21tdW5pY2F0ZWQgdG8gYGFzc2VydGAgdGhhdCBtYWtlcyBpdCBhdmFpbGFibGUgdG8gdGhlKi9cbi8qIGNhdXNhbCBjb25zb2xlLCB3aGljaCBhZmZlY3RzIHRoZSBjb25zb2xlIGxvZyBvdXRwdXQuIE5vcm1hbGx5IHdlKi9cbi8qIHJlZ2FyZCB0aGUgYWJpbGl0eSB0byBzZWUgY29uc29sZSBsb2cgb3V0cHV0IGFzIGEgbWV0YS1sZXZlbCBwcml2aWxlZ2UqL1xuLyogYW5hbG9nb3VzIHRvIHRoZSBhYmlsaXR5IHRvIGRlYnVnLiBBc2lkZSBmcm9tIHRoYXQsIHRoaXMgbW9kdWxlIHNob3VsZCovXG4vKiBub3QgaGF2ZSBhbnkgb2JzZXJ2YWJseSBtdXRhYmxlIHN0YXRlLiovXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuPTA7XG5sZXQgaGlkZGVuQ3VycmVudEV2ZW50PTA7XG5cbi8qIFRPRE8gVXNlIGVudmlyb25tZW50LW9wdGlvbnMuanMgY3VycmVudGx5IGluIHNlcy9zcmMgYWZ0ZXIgZmFjdG9yaW5nIGl0IG91dCovXG4vKiB0byBhIG5ldyBwYWNrYWdlLiovXG5jb25zdCBlbnY9KGdsb2JhbFRoaXMucHJvY2Vzc3x8e30pLmVudnx8e307XG5cbi8qIFR1cm4gb24gaWYgeW91IHNlZW0gdG8gYmUgbG9zaW5nIGVycm9yIGxvZ2dpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbG9vcCovXG5jb25zdCBWRVJCT1NFPShlbnYuREVCVUd8fCcnKS5zcGxpdCgnOicpLmluY2x1ZGVzKCd0cmFjay10dXJucycpO1xuXG5jb25zdCB2YWxpZE9wdGlvblZhbHVlcz1mcmVlemUoW3VuZGVmaW5lZCwnZW5hYmxlZCcsJ2Rpc2FibGVkJ10pO1xuXG4vKiBUcmFjay10dXJucyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBkaXNhYmxlZCBieSBhbiBlbnZpcm9ubWVudCovXG4vKiBvcHRpb24uKi9cbmNvbnN0IGVudk9wdGlvblZhbHVlPWVudi5UUkFDS19UVVJOUztcbmlmKCF2YWxpZE9wdGlvblZhbHVlcy5pbmNsdWRlcyhlbnZPcHRpb25WYWx1ZSkpe1xudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgdW5yZWNvZ25pemVkIFRSQUNLX1RVUk5TICR7SlNPTi5zdHJpbmdpZnkoZW52T3B0aW9uVmFsdWUpfWApO1xuXG4gfVxuY29uc3QgRU5BQkxFRD0oZW52T3B0aW9uVmFsdWV8fCdkaXNhYmxlZCcpPT09J2VuYWJsZWQnO1xuXG4vKiBXZSBob2lzdCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBvdXQgb2YgdHJhY2tUdXJucygpIHRvIGRpc2NvdXJhZ2UgdGhlKi9cbi8qIGNsb3N1cmVzIGZyb20gaG9sZGluZyBvbnRvICdhcmdzJyBvciAnZnVuYycgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LCovXG4vKiB3aGljaCB3ZSd2ZSBzZWVuIGNhdXNlIEhhbmRsZWRQcm9taXNlIGFyZ3VtZW50cyB0byBiZSByZXRhaW5lZCBmb3IqL1xuLyogYSBzdXJwcmlzaW5nbHkgbG9uZyB0aW1lLiovXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGU9KGRldGFpbHNOb3RlKT0+KHJlYXNvbik9PntcbmlmKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKHJlYXNvbixkZXRhaWxzTm90ZSk7XG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLHJlYXNvbik7XG4gfVxuIH07XG5cbmNvbnN0IHdyYXBGdW5jdGlvbj1cbihmdW5jLHNlbmRpbmdFcnJvcixYKT0+XG4oLi4uYXJncyk9PntcbmhpZGRlblByaW9yRXJyb3I9c2VuZGluZ0Vycm9yO1xuaGlkZGVuQ3VycmVudFR1cm4rPTE7XG5oaWRkZW5DdXJyZW50RXZlbnQ9MDtcbnRyeXtcbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbmlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLGVycik7XG4gfVxudGhyb3cgZXJyO1xuIH1cbi8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG5jb25zdCBkZXRhaWxzTm90ZT1YIGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xucmV0dXJuIHJlc3VsdDtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9bmV3IEVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuIGZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSk7XG4gfTskaOKAjV9vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADpSrU0cAgAAHAIAABkAAABAZW5kby9leG8tdjAuMi4yL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2V4by1tYWtlcnMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZXhvLW1ha2Vycy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9leG8tbWFrZXJzLmpzIjpbWyJpbml0RW1wdHkiLCJpbml0RW1wdHkiXSxbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiXSxbImRlZmluZUV4b0NsYXNzS2l0IiwiZGVmaW5lRXhvQ2xhc3NLaXQiXSxbIm1ha2VFeG8iLCJtYWtlRXhvIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADGt+tWYxgAAGMYAAAiAAAAQGVuZG8vZXhvLXYwLjIuMi9zcmMvZXhvLW1ha2Vycy5qc3siaW1wb3J0cyI6WyIuL2V4by10b29scy5qcyIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzc0tpdCIsImluaXRFbXB0eSIsIm1ha2VFeG8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgb2JqZWN0TWFwLGRlZmVuZFByb3RvdHlwZSxkZWZlbmRQcm90b3R5cGVLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm9iamVjdE1hcFwiLCBbJGjigI1fYSA9PiAob2JqZWN0TWFwID0gJGjigI1fYSldXV1dLFtcIi4vZXhvLXRvb2xzLmpzXCIsIFtbXCJkZWZlbmRQcm90b3R5cGVcIiwgWyRo4oCNX2EgPT4gKGRlZmVuZFByb3RvdHlwZSA9ICRo4oCNX2EpXV0sW1wiZGVmZW5kUHJvdG90eXBlS2l0XCIsIFskaOKAjV9hID0+IChkZWZlbmRQcm90b3R5cGVLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtjcmVhdGUsc2VhbCxmcmVlemUsZGVmaW5lUHJvcGVydHl9PU9iamVjdDtcblxuLyogVE9ETyBVc2UgZW52aXJvbm1lbnQtb3B0aW9ucy5qcyBjdXJyZW50bHkgaW4gc2VzL3NyYyBhZnRlciBmYWN0b3JpbmcgaXQgb3V0Ki9cbi8qIHRvIGEgbmV3IHBhY2thZ2UuKi9cbmNvbnN0IGVudj0oZ2xvYmFsVGhpcy5wcm9jZXNzfHx7fSkuZW52fHx7fTtcblxuLyogVHVybiBvbiB0byBnaXZlIGVhY2ggZXhvIGluc3RhbmNlIGl0cyBvd24gdG9TdHJpbmdUYWcgdmFsdWUuKi9cbmNvbnN0IExBQkVMX0lOU1RBTkNFUz0oZW52LkRFQlVHfHwnJykuXG5zcGxpdCgnLCcpLlxuaW5jbHVkZXMoJ2xhYmVsLWluc3RhbmNlcycpO1xuXG5jb25zdCBtYWtlU2VsZj0ocHJvdG8saW5zdGFuY2VDb3VudCk9PntcbmNvbnN0IHNlbGY9Y3JlYXRlKHByb3RvKTtcbmlmKExBQkVMX0lOU1RBTkNFUyl7XG5kZWZpbmVQcm9wZXJ0eShzZWxmLFN5bWJvbC50b1N0cmluZ1RhZyx7XG52YWx1ZTogYCR7cHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXX0jJHtpbnN0YW5jZUNvdW50fWAsXG53cml0YWJsZTpmYWxzZSxcbmVudW1lcmFibGU6ZmFsc2UsXG5jb25maWd1cmFibGU6ZmFsc2V9KTtcblxuIH1cbnJldHVybiBoYXJkZW4oc2VsZik7XG4gfTtcblxuY29uc3QgZW1wdHlSZWNvcmQ9aGFyZGVuKHt9KTtcblxuLyoqXG4gKiBXaGVuIGNhbGxpbmcgYGRlZmluZUR1cmFibGVLaW5kYCBhbmRcbiAqIGl0cyBzaWJsaW5ncywgdXNlZCBhcyB0aGUgYGluaXRgIGZ1bmN0aW9uIGFyZ3VtZW50IHRvIGluZGljYXRlIHRoYXQgdGhlXG4gKiBzdGF0ZSByZWNvcmQgb2YgdGhlICh2aXJ0dWFsL2R1cmFibGUpIGluc3RhbmNlcyBvZiB0aGUga2luZC9leG9DbGFzc1xuICogc2hvdWxkIGJlIGVtcHR5LCBhbmQgdGhhdCB0aGUgcmV0dXJuZWQgbWFrZXIgZnVuY3Rpb24gc2hvdWxkIGhhdmUgemVyb1xuICogcGFyYW1ldGVycy5cbiAqXG4gKiBAcmV0dXJucyB7e319XG4gKi9cbmNvbnN0ICAgICAgICBpbml0RW1wdHk9KCk9PmVtcHR5UmVjb3JkO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2V4by10b29scy5qcycpLkZhY2V0TmFtZX0gRmFjZXROYW1lXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9leG8tdG9vbHMuanMnKS5NZXRob2RzfSBNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1MgPSBhbnldXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IFtNID0gYW55XVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vZXhvLXRvb2xzLmpzJykuQ2xhc3NDb250ZXh0fSBDbGFzc0NvbnRleHRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUyA9IGFueV1cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPEZhY2V0TmFtZSwgTWV0aG9kcz59IFtGID0gYW55XVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vZXhvLXRvb2xzLmpzJykuS2l0Q29udGV4dH0gS2l0Q29udGV4dFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tbbmFtZTogc3RyaW5nXTogWGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5QYXR0ZXJufX0gU3RhdGVTaGFwZVxuICogSXQgbG9va3MgbGlrZSBhIGNvcHlSZWNvcmQgcGF0dGVybiwgYnV0IHRoZSBpbnRlcnByZXRhdGlvbiBpcyBkaWZmZXJlbnQuXG4gKiBFYWNoIHByb3BlcnR5IGlzIGRpc3RpbmN0LCBpcyBjaGVja2VkIGFuZCBjaGFuZ2VkIHNlcGFyYXRlbHkuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgQ1xuICogQHR5cGVkZWYge29iamVjdH0gRmFyQ2xhc3NPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhjb250ZXh0OiBDKSA9PiB2b2lkfSBbZmluaXNoXVxuICogQHByb3BlcnR5IHtTdGF0ZVNoYXBlfSBbc3RhdGVTaGFwZV1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEkgaW5pdCBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge00gJiBUaGlzVHlwZTx7IHNlbGY6IE0sIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxDbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPiwgTT4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKE0gJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIE0+KX1cbiAqLyRo4oCNX29uY2UuaW5pdEVtcHR5KGluaXRFbXB0eSk7XG5jb25zdCAgICAgICAgZGVmaW5lRXhvQ2xhc3M9KHRhZyxpbnRlcmZhY2VHdWFyZCxpbml0LG1ldGhvZHMsb3B0aW9ucyk9PntcbmNvbnN0e2ZpbmlzaD11bmRlZmluZWR9PW9wdGlvbnN8fHt9O1xuLyoqIEB0eXBlIHtXZWFrTWFwPE0sQ2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sIE0+Pn0gKi9cbmNvbnN0IGNvbnRleHRNYXA9bmV3IFdlYWtNYXAoKTtcbmNvbnN0IHByb3RvPWRlZmVuZFByb3RvdHlwZShcbnRhZyxcbihzZWxmKT0+LyoqIEB0eXBlIHthbnl9ICovY29udGV4dE1hcC5nZXQoc2VsZiksXG5tZXRob2RzLFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkKTtcblxubGV0IGluc3RhbmNlQ291bnQ9MDtcbi8qKlxuICogQHBhcmFtICB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICovXG5jb25zdCBtYWtlSW5zdGFuY2U9KC4uLmFyZ3MpPT57XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuaW5zdGFuY2VDb3VudCs9MTtcbi8qKiBAdHlwZSB7TX0gKi9cbmNvbnN0IHNlbGY9bWFrZVNlbGYocHJvdG8saW5zdGFuY2VDb3VudCk7XG5cbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbi8qKiBAdHlwZSB7Q2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sTT59ICovXG5jb25zdCBjb250ZXh0PWZyZWV6ZSh7c3RhdGUsc2VsZn0pO1xuY29udGV4dE1hcC5zZXQoc2VsZixjb250ZXh0KTtcbmlmKGZpbmlzaCl7XG5maW5pc2goY29udGV4dCk7XG4gfVxucmV0dXJuICgvKiogQHR5cGUge00gJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIE0+fSAqL1xuc2VsZik7XG5cbiB9O1xucmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2UpO1xuIH07JGjigI1fb25jZS5kZWZpbmVFeG9DbGFzcyhkZWZpbmVFeG9DbGFzcyk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3MpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEkgaW5pdCBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gRiBmYWNldCBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtGICYgVGhpc1R5cGU8eyBmYWNldHM6IEYsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+IH0gbWV0aG9kc0tpdFxuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8S2l0Q29udGV4dDxSZXR1cm5UeXBlPEk+LEY+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEZ9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVFeG9DbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5tZXRob2RzS2l0LFxub3B0aW9ucyk9Plxue1xuY29uc3R7ZmluaXNoPXVuZGVmaW5lZH09b3B0aW9uc3x8e307XG5jb25zdCBjb250ZXh0TWFwS2l0PW9iamVjdE1hcChtZXRob2RzS2l0LCgpPT5uZXcgV2Vha01hcCgpKTtcbmNvbnN0IGdldENvbnRleHRLaXQ9b2JqZWN0TWFwKFxubWV0aG9kc0tpdCxcbihfdixuYW1lKT0+KGZhY2V0KT0+Y29udGV4dE1hcEtpdFtuYW1lXS5nZXQoZmFjZXQpKTtcblxuY29uc3QgcHJvdG90eXBlS2l0PWRlZmVuZFByb3RvdHlwZUtpdChcbnRhZyxcbmdldENvbnRleHRLaXQsXG5tZXRob2RzS2l0LFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0KTtcblxubGV0IGluc3RhbmNlQ291bnQ9MDtcbi8qKlxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKi9cbmNvbnN0IG1ha2VJbnN0YW5jZUtpdD0oLi4uYXJncyk9Pntcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbmNvbnN0IHN0YXRlPXNlYWwoaW5pdCguLi5hcmdzKSk7XG4vKiBEb24ndCBmcmVlemUgY29udGV4dCB1bnRpbCB3ZSBhZGQgZmFjZXRzKi9cbi8qKiBAdHlwZSB7S2l0Q29udGV4dDxSZXR1cm5UeXBlPEk+LEY+fSAqL1xuY29uc3QgY29udGV4dD17c3RhdGUsZmFjZXRzOnt9fTtcbmluc3RhbmNlQ291bnQrPTE7XG5jb25zdCBmYWNldHM9b2JqZWN0TWFwKHByb3RvdHlwZUtpdCwocHJvdG8sZmFjZXROYW1lKT0+e1xuY29uc3Qgc2VsZj1tYWtlU2VsZihwcm90byxpbnN0YW5jZUNvdW50KTtcbmNvbnRleHRNYXBLaXRbZmFjZXROYW1lXS5zZXQoc2VsZixjb250ZXh0KTtcbnJldHVybiBzZWxmO1xuIH0pO1xuY29udGV4dC5mYWNldHM9ZmFjZXRzO1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuZnJlZXplKGNvbnRleHQpO1xuaWYoZmluaXNoKXtcbmZpbmlzaChjb250ZXh0KTtcbiB9XG5yZXR1cm4gY29udGV4dC5mYWNldHM7XG4gfTtcbnJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlS2l0KTtcbiB9OyRo4oCNX29uY2UuZGVmaW5lRXhvQ2xhc3NLaXQoZGVmaW5lRXhvQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmQgQ0FWRUFUOiBzdGF0aWMgdHlwaW5nIGRvZXMgbm90IHlldCBzdXBwb3J0IGBjYWxsV2hlbmAgdHJhbnNmb3JtYXRpb25cbiAqIEBwYXJhbSB7VH0gbWV0aG9kc1xuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8Q2xhc3NDb250ZXh0PHt9LFQ+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRXhvPSh0YWcsaW50ZXJmYWNlR3VhcmQsbWV0aG9kcyxvcHRpb25zPXVuZGVmaW5lZCk9PntcbmNvbnN0IG1ha2VJbnN0YW5jZT1kZWZpbmVFeG9DbGFzcyhcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuaW5pdEVtcHR5LFxubWV0aG9kcyxcbm9wdGlvbnMpO1xuXG5yZXR1cm4gbWFrZUluc3RhbmNlKCk7XG4gfTskaOKAjV9vbmNlLm1ha2VFeG8obWFrZUV4byk7XG5oYXJkZW4obWFrZUV4byk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaW5pdEVtcHR5IjpbImluaXRFbXB0eSJdLCJkZWZpbmVFeG9DbGFzcyI6WyJkZWZpbmVFeG9DbGFzcyJdLCJkZWZpbmVFeG9DbGFzc0tpdCI6WyJkZWZpbmVFeG9DbGFzc0tpdCJdLCJtYWtlRXhvIjpbIm1ha2VFeG8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMbCt8nEmAABxJgAAIQAAAEBlbmRvL2V4by12MC4yLjIvc3JjL2V4by10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImRlZmVuZFByb3RvdHlwZSIsImRlZmVuZFByb3RvdHlwZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixsaXN0RGlmZmVyZW5jZSxvYmplY3RNYXAsbXVzdE1hdGNoLE07JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibGlzdERpZmZlcmVuY2VcIiwgWyRo4oCNX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjigI1fYSldXSxbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuTWV0aG9kfSBNZXRob2QgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5NZXRob2RHdWFyZH0gTWV0aG9kR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZH0gSW50ZXJmYWNlR3VhcmQgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHthcHBseSxvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZGVmaW5lUHJvcGVydGllc309T2JqZWN0O1xuXG4vKipcbiAqIEEgbWV0aG9kIGd1YXJkLCBmb3IgaW5jbHVzaW9uIGluIGFuIGludGVyZmFjZSBndWFyZCwgdGhhdCBlbmZvcmNlcyBvbmx5IHRoYXRcbiAqIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NhYmxlIGFuZCB0aGF0IHRoZSByZXN1bHQgaXMgcGFzc2FibGUuIChJbiBmYXIgY2xhc3NlcyxcbiAqIFwiYW55XCIgbWVhbnMgYW55ICpwYXNzYWJsZSouKSBUaGlzIGlzIHRoZSBsZWFzdCBwb3NzaWJsZSBlbmZvcmNlbWVudCBmb3IgYVxuICogbWV0aG9kIGd1YXJkLCBhbmQgaXMgaW1wbGllZCBieSBhbGwgb3RoZXIgbWV0aG9kIGd1YXJkcy5cbiAqL1xuY29uc3QgTWluTWV0aG9kR3VhcmQ9TS5jYWxsKCkucmVzdChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpO1xuXG5jb25zdCBkZWZlbmRTeW5jQXJncz0oYXJncyxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e2FyZ0d1YXJkcyxvcHRpb25hbEFyZ0d1YXJkcyxyZXN0QXJnR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3QgcGFyYW1zUGF0dGVybj1NLnNwbGl0QXJyYXkoXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJlc3RBcmdHdWFyZCk7XG5cbm11c3RNYXRjaChoYXJkZW4oYXJncykscGFyYW1zUGF0dGVybixsYWJlbCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge01ldGhvZH0gbWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcmV0dXJucyB7TWV0aG9kfVxuICovXG5jb25zdCBkZWZlbmRTeW5jTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtyZXR1cm5HdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdHtzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbnN5bmNNZXRob2QoLi4uYXJncyl7XG5kZWZlbmRTeW5jQXJncyhoYXJkZW4oYXJncyksbWV0aG9kR3VhcmQsbGFiZWwpO1xuY29uc3QgcmVzdWx0PWFwcGx5KG1ldGhvZCx0aGlzLGFyZ3MpO1xubXVzdE1hdGNoKGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xucmV0dXJuIHJlc3VsdDtcbiB9fTtcblxucmV0dXJuIHN5bmNNZXRob2Q7XG4gfTtcblxuY29uc3QgaXNBd2FpdEFyZ0d1YXJkPShhcmdHdWFyZCk9PlxuYXJnR3VhcmQmJnR5cGVvZiBhcmdHdWFyZD09PSdvYmplY3QnJiZhcmdHdWFyZC5rbGFzcz09PSdhd2FpdEFyZyc7XG5cbmNvbnN0IGRlc3luYz0obWV0aG9kR3VhcmQpPT57XG5jb25zdHthcmdHdWFyZHMsb3B0aW9uYWxBcmdHdWFyZHM9W10scmVzdEFyZ0d1YXJkfT1tZXRob2RHdWFyZDtcbiFpc0F3YWl0QXJnR3VhcmQocmVzdEFyZ0d1YXJkKXx8XG5GYWlsIGBSZXN0IGFyZ3MgbWF5IG5vdCBiZSBhd2FpdGVkOiAke3Jlc3RBcmdHdWFyZH1gO1xuY29uc3QgcmF3QXJnR3VhcmRzPVsuLi5hcmdHdWFyZHMsLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG5jb25zdCBhd2FpdEluZGV4ZXM9W107XG5mb3IobGV0IGk9MDtpPHJhd0FyZ0d1YXJkcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBhcmdHdWFyZD1yYXdBcmdHdWFyZHNbaV07XG5pZihpc0F3YWl0QXJnR3VhcmQoYXJnR3VhcmQpKXtcbnJhd0FyZ0d1YXJkc1tpXT1hcmdHdWFyZC5hcmdHdWFyZDtcbmF3YWl0SW5kZXhlcy5wdXNoKGkpO1xuIH1cbiB9XG5yZXR1cm57XG5hd2FpdEluZGV4ZXMsXG5yYXdNZXRob2RHdWFyZDp7XG5hcmdHdWFyZHM6cmF3QXJnR3VhcmRzLnNsaWNlKDAsYXJnR3VhcmRzLmxlbmd0aCksXG5vcHRpb25hbEFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCksXG5yZXN0QXJnR3VhcmR9fTtcblxuXG4gfTtcblxuY29uc3QgZGVmZW5kQXN5bmNNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e3JldHVybkd1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0e2F3YWl0SW5kZXhlcyxyYXdNZXRob2RHdWFyZH09ZGVzeW5jKG1ldGhvZEd1YXJkKTtcbmNvbnN0e2FzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbmFzeW5jTWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgYXdhaXRMaXN0PWF3YWl0SW5kZXhlcy5tYXAoKGkpPT5hcmdzW2ldKTtcbmNvbnN0IHA9UHJvbWlzZS5hbGwoYXdhaXRMaXN0KTtcbmNvbnN0IHJhd0FyZ3M9Wy4uLmFyZ3NdO1xuY29uc3QgcmVzdWx0UD1FLndoZW4ocCwoYXdhaXRlZEFyZ3MpPT57XG5mb3IobGV0IGo9MDtqPGF3YWl0SW5kZXhlcy5sZW5ndGg7ais9MSl7XG5yYXdBcmdzW2F3YWl0SW5kZXhlc1tqXV09YXdhaXRlZEFyZ3Nbal07XG4gfVxuZGVmZW5kU3luY0FyZ3MocmF3QXJncyxyYXdNZXRob2RHdWFyZCxsYWJlbCk7XG5yZXR1cm4gYXBwbHkobWV0aG9kLHRoaXMscmF3QXJncyk7XG4gfSk7XG5yZXR1cm4gRS53aGVuKHJlc3VsdFAsKHJlc3VsdCk9Pntcbm11c3RNYXRjaChoYXJkZW4ocmVzdWx0KSxyZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbnJldHVybiByZXN1bHQ7XG4gfSk7XG4gfX07XG5cbnJldHVybiBhc3luY01ldGhvZDtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge01ldGhvZH0gbWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKi9cbmNvbnN0IGRlZmVuZE1ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7a2xhc3MsY2FsbEtpbmR9PW1ldGhvZEd1YXJkO1xuYXNzZXJ0KGtsYXNzPT09J21ldGhvZEd1YXJkJyk7XG5pZihjYWxsS2luZD09PSdzeW5jJyl7XG5yZXR1cm4gZGVmZW5kU3luY01ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpO1xuIH1lbHNle1xuYXNzZXJ0KGNhbGxLaW5kPT09J2FzeW5jJyk7XG5yZXR1cm4gZGVmZW5kQXN5bmNNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBGYWNldE5hbWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBbTSA9IGFueV1cbiAqIEB0eXBlZGVmIHt7IHN0YXRlOiBTLCBzZWxmOiBNIH19IENsYXNzQ29udGV4dFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gW0YgPSBhbnldXG4gKiBAdHlwZWRlZiB7eyBzdGF0ZTogUywgZmFjZXRzOiBGIH19IEtpdENvbnRleHRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoZmFjZXQ6IGFueSkgPT4gS2l0Q29udGV4dH0gS2l0Q29udGV4dFByb3ZpZGVyXG4gKiBAdHlwZWRlZiB7KChyZXByZXNlbnRhdGl2ZTogYW55KSA9PiBDbGFzc0NvbnRleHQpIHwgS2l0Q29udGV4dFByb3ZpZGVyfSBDb250ZXh0UHJvdmlkZXJcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RUYWdcbiAqIEBwYXJhbSB7Q29udGV4dFByb3ZpZGVyfSBjb250ZXh0UHJvdmlkZXJcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gW21ldGhvZEd1YXJkXVxuICovXG5jb25zdCBiaW5kTWV0aG9kPShcbm1ldGhvZFRhZyxcbmNvbnRleHRQcm92aWRlcixcbmJlaGF2aW9yTWV0aG9kLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5tZXRob2RHdWFyZD11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YoYmVoYXZpb3JNZXRob2QsJ2Z1bmN0aW9uJyk7XG5cbmNvbnN0IGdldENvbnRleHQ9KHNlbGYpPT57XG5jb25zdCBjb250ZXh0PWNvbnRleHRQcm92aWRlcihzZWxmKTtcbmNvbnRleHR8fFxuRmFpbCBgJHtxKG1ldGhvZFRhZyl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtzZWxmfWA7XG5yZXR1cm4gY29udGV4dDtcbiB9O1xuXG4vKiBWaW9sYXRpbmcgYWxsIEplc3NpZSBydWxlcyB0byBjcmVhdGUgcmVwcmVzZW50YXRpdmVzIHRoYXQgaW5oZXJpdCovXG4vKiBtZXRob2RzIGZyb20gYSBzaGFyZWQgcHJvdG90eXBlLiBUaGUgYm91bmQgbWV0aG9kIHRoZXJlZm9yZSBuZWVkcyovXG4vKiB0byBtZW50aW9uIGB0aGlzYC4gV2UgZGVmaW5lIGl0IHVzaW5nIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4vKiBzbyB0aGF0IGl0IHdpbGwgYmUgYHRoaXNgIHNlbnNpdGl2ZSBidXQgbm90IGNvbnN0cnVjdGFibGUuKi9cbi8qKi9cbi8qIFdlIG5vcm1hbGx5IGNvbnNpZGVyIGB0aGlzYCB1bnNhZmUgYmVjYXVzZSBvZiB0aGUgaGF6YXJkIG9mIGEqL1xuLyogbWV0aG9kIG9mIG9uZSBhYnN0cmFjdGlvbiBiZWluZyBhcHBsaWVkIHRvIGFuIGluc3RhbmNlIG9mKi9cbi8qIGFub3RoZXIgYWJzdHJhY3Rpb24uIFRvIHByZXZlbnQgdGhhdCBhdHRhY2ssIHRoZSBib3VuZCBtZXRob2QqL1xuLyogY2hlY2tzIHRoYXQgaXRzIGB0aGlzYCBpcyBpbiB0aGUgbWFwIGluIHdoaWNoIGl0cyByZXByZXNlbnRhdGl2ZXMqL1xuLyogYXJlIHJlZ2lzdGVyZWQuKi9cbmxldHttZXRob2R9PXRoaXNmdWxNZXRob2RzP1xue1xubWV0aG9kKC4uLmFyZ3Mpe1xudGhpc3x8XG5GYWlsIGB0aGlzZnVsIG1ldGhvZCAke21ldGhvZFRhZ30gY2FsbGVkIHdpdGhvdXQgJ3RoaXMnIG9iamVjdGA7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsY29udGV4dCxhcmdzKTtcbiB9fTpcblxue1xubWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgY29udGV4dD1nZXRDb250ZXh0KHRoaXMpO1xucmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLG51bGwsW2NvbnRleHQsLi4uYXJnc10pO1xuIH19O1xuXG5pZihtZXRob2RHdWFyZCl7XG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1lbHNlIGlmKHRoaXNmdWxNZXRob2RzKXtcbi8qIEZvciBmYXIgY2xhc3NlcyBlbnN1cmUgdGhhdCBpbnB1dHMgYW5kIG91dHB1dHMgYXJlIHBhc3NhYmxlLiovXG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxNaW5NZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1cbmRlZmluZVByb3BlcnRpZXMobWV0aG9kLHtcbm5hbWU6e3ZhbHVlOm1ldGhvZFRhZ30sXG5sZW5ndGg6e1xudmFsdWU6dGhpc2Z1bE1ldGhvZHM/YmVoYXZpb3JNZXRob2QubGVuZ3RoOmJlaGF2aW9yTWV0aG9kLmxlbmd0aC0xfX0pO1xuXG5cbnJldHVybiBtZXRob2Q7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0NvbnRleHRQcm92aWRlcn0gY29udGV4dFByb3ZpZGVyXG4gKiBAcGFyYW0ge1R9IGJlaGF2aW9yTWV0aG9kc1xuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBbaW50ZXJmYWNlR3VhcmRdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBkZWZlbmRQcm90b3R5cGU9KFxudGFnLFxuY29udGV4dFByb3ZpZGVyLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5pbnRlcmZhY2VHdWFyZD11bmRlZmluZWQpPT5cbntcbmNvbnN0IHByb3RvdHlwZT17fTtcbmNvbnN0IG1ldGhvZE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzKS5maWx0ZXIoXG4vKiBCeSBpZ25vcmluZyBhbnkgbWV0aG9kIG5hbWVkIFwiY29uc3RydWN0b3JcIiwgd2UgY2FuIHVzZSBhKi9cbi8qIGNsYXNzLnByb3RvdHlwZSBhcyBhIGJlaGF2aW9yTWV0aG9kcy4qL1xuKG5hbWUpPT5uYW1lIT09J2NvbnN0cnVjdG9yJyk7XG5cbmxldCBtZXRob2RHdWFyZHM7XG5pZihpbnRlcmZhY2VHdWFyZCl7XG5jb25zdHtcbmtsYXNzLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkczptZyxcbnNsb3BweT1mYWxzZX09XG5pbnRlcmZhY2VHdWFyZDtcbm1ldGhvZEd1YXJkcz1tZztcbmFzc2VydC5lcXVhbChrbGFzcywnSW50ZXJmYWNlJyk7XG5hc3NlcnQudHlwZW9mKGludGVyZmFjZU5hbWUsJ3N0cmluZycpO1xue1xuY29uc3QgbWV0aG9kR3VhcmROYW1lcz1vd25LZXlzKG1ldGhvZEd1YXJkcyk7XG5jb25zdCB1bmltcGxlbWVudGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZEd1YXJkTmFtZXMsbWV0aG9kTmFtZXMpO1xudW5pbXBsZW1lbnRlZC5sZW5ndGg9PT0wfHxcbkZhaWwgYG1ldGhvZHMgJHtxKHVuaW1wbGVtZW50ZWQpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmlmKCFzbG9wcHkpe1xuY29uc3QgdW5ndWFyZGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZE5hbWVzLG1ldGhvZEd1YXJkTmFtZXMpO1xudW5ndWFyZGVkLmxlbmd0aD09PTB8fFxuRmFpbCBgbWV0aG9kcyAke3EodW5ndWFyZGVkKX0gbm90IGd1YXJkZWQgYnkgJHtxKGludGVyZmFjZU5hbWUpfWA7XG4gfVxuIH1cbiB9XG5mb3IoY29uc3QgcHJvcCBvZiBtZXRob2ROYW1lcyl7XG5wcm90b3R5cGVbcHJvcF09YmluZE1ldGhvZChcbiBgSW4gJHtxKHByb3ApfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuY29udGV4dFByb3ZpZGVyLFxuYmVoYXZpb3JNZXRob2RzW3Byb3BdLFxudGhpc2Z1bE1ldGhvZHMsXG4vKiBUT0RPIHNvbWUgdG9vbCBkb2VzIG5vdCB5ZXQgdW5kZXJzdGFuZCB0aGUgYD8uW2Agc3ludGF4Ki9cbm1ldGhvZEd1YXJkcyYmbWV0aG9kR3VhcmRzW3Byb3BdKTtcblxuIH1cblxucmV0dXJuIEZhcih0YWcsLyoqIEB0eXBlIHtUfSAqL3Byb3RvdHlwZSk7XG4gfTskaOKAjV9vbmNlLmRlZmVuZFByb3RvdHlwZShkZWZlbmRQcm90b3R5cGUpO1xuaGFyZGVuKGRlZmVuZFByb3RvdHlwZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtSZWNvcmQ8RmFjZXROYW1lLCBLaXRDb250ZXh0UHJvdmlkZXI+fSBjb250ZXh0UHJvdmlkZXJLaXRcbiAqIEBwYXJhbSB7UmVjb3JkPEZhY2V0TmFtZSwgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBiZWhhdmlvck1ldGhvZHNLaXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBJbnRlcmZhY2VHdWFyZD59IFtpbnRlcmZhY2VHdWFyZEtpdF1cbiAqL1xuY29uc3QgICAgICAgIGRlZmVuZFByb3RvdHlwZUtpdD0oXG50YWcsXG5jb250ZXh0UHJvdmlkZXJLaXQsXG5iZWhhdmlvck1ldGhvZHNLaXQsXG50aGlzZnVsTWV0aG9kcz1mYWxzZSxcbmludGVyZmFjZUd1YXJkS2l0PXVuZGVmaW5lZCk9Plxue1xuY29uc3QgZmFjZXROYW1lcz1vd25LZXlzKGJlaGF2aW9yTWV0aG9kc0tpdCkuc29ydCgpO1xuZmFjZXROYW1lcy5sZW5ndGg+MXx8RmFpbCBgQSBtdWx0aS1mYWNldCBvYmplY3QgbXVzdCBoYXZlIG11bHRpcGxlIGZhY2V0c2A7XG5pZihpbnRlcmZhY2VHdWFyZEtpdCl7XG5jb25zdCBpbnRlcmZhY2VOYW1lcz1vd25LZXlzKGludGVyZmFjZUd1YXJkS2l0KTtcbmNvbnN0IGV4dHJhSW50ZXJmYWNlTmFtZXM9bGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcyxpbnRlcmZhY2VOYW1lcyk7XG5leHRyYUludGVyZmFjZU5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgSW50ZXJmYWNlcyAke3EoZXh0cmFJbnRlcmZhY2VOYW1lcyl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuY29uc3QgZXh0cmFGYWNldE5hbWVzPWxpc3REaWZmZXJlbmNlKGludGVyZmFjZU5hbWVzLGZhY2V0TmFtZXMpO1xuZXh0cmFGYWNldE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbm90IGd1YXJkZWQgYnkgaW50ZXJmYWNlc2A7XG4gfVxuY29uc3QgY29udGV4dE1hcE5hbWVzPW93bktleXMoY29udGV4dFByb3ZpZGVyS2l0KTtcbmNvbnN0IGV4dHJhQ29udGV4dE5hbWVzPWxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsY29udGV4dE1hcE5hbWVzKTtcbmV4dHJhQ29udGV4dE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgQ29udGV4dHMgJHtxKGV4dHJhQ29udGV4dE5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoY29udGV4dE1hcE5hbWVzLGZhY2V0TmFtZXMpO1xuZXh0cmFGYWNldE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbWlzc2luZyBjb250ZXh0c2A7XG5yZXR1cm4gb2JqZWN0TWFwKGJlaGF2aW9yTWV0aG9kc0tpdCwoYmVoYXZpb3JNZXRob2RzLGZhY2V0TmFtZSk9PlxuZGVmZW5kUHJvdG90eXBlKFxuIGAke3RhZ30gJHtmYWNldE5hbWV9YCxcbmNvbnRleHRQcm92aWRlcktpdFtmYWNldE5hbWVdLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHMsXG5pbnRlcmZhY2VHdWFyZEtpdCYmaW50ZXJmYWNlR3VhcmRLaXRbZmFjZXROYW1lXSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuZGVmZW5kUHJvdG90eXBlS2l0KGRlZmVuZFByb3RvdHlwZUtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSJdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEEMM5RAAgAAQAIAAB4AAABAZW5kby9mYXItdjAuMi4xOC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIixudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBlbmRvL2V2ZW50dWFsLXNlbmQiOltbIkUiLCJFIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJGYXIiLCJGYXIiXSxbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXSxbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKWPOvdKBwAASgcAAB0AAABAZW5kby9tYXJzaGFsLXYwLjguNS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiY29tcGFyZVJhbmsiLCJjb21wYXJlUmFuayIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsInBhcnNlIiwicGFyc2UiLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3JhbmtPcmRlci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjpbWyJkZWVwbHlGdWxmaWxsZWQiLCJkZWVwbHlGdWxmaWxsZWQiXV0sIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6W1siUUNMQVNTIiwiUUNMQVNTIl1dLCIuL3NyYy9tYXJzaGFsLmpzIjpbWyJtYWtlTWFyc2hhbCIsIm1ha2VNYXJzaGFsIl1dLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6W1sic3RyaW5naWZ5Iiwic3RyaW5naWZ5Il0sWyJwYXJzZSIsInBhcnNlIl1dLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6W1siZGVjb2RlVG9KdXN0aW4iLCJkZWNvZGVUb0p1c3RpbiJdXSwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOltbIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSJdLFsibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIl0sWyJpc0VuY29kZWRSZW1vdGFibGUiLCJpc0VuY29kZWRSZW1vdGFibGUiXSxbInplcm9QYWQiLCJ6ZXJvUGFkIl0sWyJyZWNvcmROYW1lcyIsInJlY29yZE5hbWVzIl0sWyJyZWNvcmRWYWx1ZXMiLCJyZWNvcmRWYWx1ZXMiXV0sIi4vc3JjL3JhbmtPcmRlci5qcyI6W1siYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiXSxbImNvbXBhcmVSYW5rIiwiY29tcGFyZVJhbmsiXSxbImlzUmFua1NvcnRlZCIsImlzUmFua1NvcnRlZCJdLFsic29ydEJ5UmFuayIsInNvcnRCeVJhbmsiXSxbImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVBbnRpUmFuayJdLFsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdLFsiZ2V0UGFzc1N0eWxlQ292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciJdLFsiaW50ZXJzZWN0UmFua0NvdmVycyIsImludGVyc2VjdFJhbmtDb3ZlcnMiXSxbInVuaW9uUmFua0NvdmVycyIsInVuaW9uUmFua0NvdmVycyJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADQgme5QNAACUDQAAKwAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9kZWVwbHlGdWxmaWxsZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLGlzUHJvbWlzZSxnZXRUYWcsaXNPYmplY3QsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWYgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtmcm9tRW50cmllc309T2JqZWN0O1xuXG4vKipcbiAqIEdpdmVuIGEgUGFzc2FibGUgYHZhbGAgd2hvc2UgcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBtYXkgY29udGFpbiBsZWFmXG4gKiBwcm9taXNlcywgcmV0dXJuIGEgcHJvbWlzZSBmb3IgYSByZXBsYWNlbWVudCBQYXNzYWJsZSxcbiAqIHdoZXJlIHRoYXQgcmVwbGFjZW1lbnQgaXMgKmRlZXBseSBmdWxmaWxsZWQqLCBpLmUuLCBpdHNcbiAqIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiBhbnkgcHJvbWlzZXMuXG4gKlxuICogVGhpcyBpcyBhIGRlZXAgZm9ybSBvZiBgUHJvbWlzZS5hbGxgIHNwZWNpYWxpemVkIGZvciBQYXNzYWJsZXMuIEZvciBlYWNoXG4gKiBlbmNvdW50ZXJlZCBwcm9taXNlLCByZXBsYWNlIGl0IHdpdGggdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybSBvZlxuICogaXRzIGZ1bGZpbGxtZW50LlxuICogSWYgYW55IG9mIHRoZSBwcm9taXNlcyByZWplY3QsIHRoZW4gdGhlIHByb21pc2UgZm9yIHRoZSByZXBsYWNlbWVudFxuICogcmVqZWN0cy4gSWYgYW55IG9mIHRoZSBwcm9taXNlcyBuZXZlciBzZXR0bGUsIHRoZW4gdGhlIHByb21pc2UgZm9yXG4gKiB0aGUgcmVwbGFjZW1lbnQgbmV2ZXIgc2V0dGxlcy5cbiAqXG4gKiBJZiB0aGUgcmVwbGFjZW1lbnQgd291bGQgbm90IGJlIFBhc3NhYmxlLCBpLmUuLCBpZiBgdmFsYCBpcyBub3RcbiAqIFBhc3NhYmxlLCBvciBpZiBhbnkgb2YgdGhlIHRyYW5zaXRpdmUgcHJvbWlzZXMgZnVsZmlsbCB0byBzb21ldGhpbmdcbiAqIHRoYXQgaXMgbm90IFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIHJlamVjdHMuXG4gKlxuICogSWYgYHZhbGAgb3IgaXRzIHBhcnRzIGFyZSBub24ta2V5IFBhc3NhYmxlcyBvbmx5ICpiZWNhdXNlKiB0aGV5IGNvbnRhaW5zXG4gKiBwcm9taXNlcywgdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybXMgb2YgdmFsIG9yIGl0cyBwYXJ0cyBtYXkgYmUga2V5cy4gVGhpc1xuICogaXMgZm9yIHRoZSBoaWdoZXIgXCJzdG9yZVwiIGxldmVsIG9mIGFic3RyYWN0aW9uIHRvIGRldGVybWluZSwgYmVjYXVzZSBpdFxuICogZGVmaW5lcyB0aGUgXCJrZXlcIiBub3Rpb24gaW4gcXVlc3Rpb24uXG4gKlxuICogLy8gVE9ETzogVGhhdCBoaWdoZXIgbGV2ZWwgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgbWlncmF0ZWQgZnJvbVxuICogLy8gYEBhZ29yaWMvc3RvcmVgIHRvIGBAZW5kby9wYXR0ZXJuc2AuIE9uY2UgdGhhdCBpcyBmYXIgZW5vdWdoIGFsb25nLFxuICogLy8gcmV2aXNlIHRoZSBhYm92ZSBjb21tZW50IHRvIG1hdGNoLlxuICogLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE0NTFcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBhc3NhYmxlPn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZD1hc3luYyh2YWwpPT57XG5pZighaXNPYmplY3QodmFsKSl7XG5yZXR1cm4gdmFsO1xuIH1cbmlmKGlzUHJvbWlzZSh2YWwpKXtcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzp7XG5jb25zdCBuYW1lcz1vd25LZXlzKHZhbCk7XG5jb25zdCB2YWxQcz1uYW1lcy5tYXAoKG5hbWUpPT5kZWVwbHlGdWxmaWxsZWQodmFsW25hbWVdKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PlxuaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLGkpPT5bbmFtZXNbaV0sY10pKSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbmNvbnN0IHZhbFBzPXZhbC5tYXAoKHApPT5kZWVwbHlGdWxmaWxsZWQocCkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5oYXJkZW4odmFscykpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5yZXR1cm4gRS53aGVuKGRlZXBseUZ1bGZpbGxlZCh2YWwucGF5bG9hZCksKHBheWxvYWQpPT5cbm1ha2VUYWdnZWQodGFnLHBheWxvYWQpKTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UnZXJyb3InOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07JGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWQoZGVlcGx5RnVsZmlsbGVkKTtcbmhhcmRlbihkZWVwbHlGdWxmaWxsZWQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAO3LPgOQ/AADkPwAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9lbmNvZGVQYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwicGFzc1N0eWxlUHJlZml4ZXMiLCJyZWNvcmROYW1lcyIsInJlY29yZFZhbHVlcyIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLGlzRXJyb3JMaWtlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SYW5rQ292ZXJ9IFJhbmtDb3ZlciAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e2Zyb21FbnRyaWVzLGlzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkLCB3ZSBoYXZlIG9ubHlcbiAqIHN0cmluZy1uYW1lZCBvd24gcHJvcGVydGllcy4gYHJlY29yZE5hbWVzYCByZXR1cm5zIHRob3NlIG5hbWUgKnJldmVyc2UqXG4gKiBzb3J0ZWQsIGJlY2F1c2UgdGhhdCdzIGhvdyByZWNvcmRzIGFyZSBjb21wYXJlZCwgZW5jb2RlZCwgYW5kIHNvcnRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZE5hbWVzPShyZWNvcmQpPT5cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNjAjZGlzY3Vzc2lvbl9yMTAwMzY1NzI0NCovXG4vKiBjb21wYXJlcyB0d28gd2F5cyBvZiByZXZlcnNlIHNvcnRpbmcsIGFuZCBzaG93cyB0aGF0IGAuc29ydCgpLnJldmVyc2UoKWAqL1xuLyogaXMgY3VycmVudGx5IGZhc3RlciBvbiBNb2RkYWJsZSBYUywgd2hpbGUgdGhlIG90aGVyIHdheSwqL1xuLyogYC5zb3J0KHJldmVyc2VDb21wYXJhdG9yKWAsIGlzIGZhc3RlciBvbiB2OC4gV2UgY3VycmVudGx5IGNhcmUgbW9yZSBhYm91dCovXG4vKiBYUyBwZXJmb3JtYW5jZSwgc28gd2UgcmV2ZXJzZSBzb3J0IHVzaW5nIGAuc29ydCgpLnJldmVyc2UoKWAuKi9cbmhhcmRlbigvKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmVjb3JkKS5zb3J0KCkucmV2ZXJzZSgpKTskaOKAjV9vbmNlLnJlY29yZE5hbWVzKHJlY29yZE5hbWVzKTtcbmhhcmRlbihyZWNvcmROYW1lcyk7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQgYW5kIGBuYW1lc2AgaXMgYHJlY29yZE5hbWVzKHJlY29yZClgLFxuICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkVmFsdWVzPShyZWNvcmQsbmFtZXMpPT5cbmhhcmRlbihuYW1lcy5tYXAoKG5hbWUpPT5yZWNvcmRbbmFtZV0pKTskaOKAjV9vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBuXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIHplcm9QYWQ9KG4sc2l6ZSk9PntcbmNvbnN0IG5TdHI9IGAke259YDtcbmFzc2VydChuU3RyLmxlbmd0aDw9c2l6ZSk7XG5jb25zdCBzdHI9IGAwMDAwMDAwMDAwMDAwMDAwMDAwMCR7blN0cn1gO1xuY29uc3QgcmVzdWx0PXN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aC1zaXplKTtcbmFzc2VydChyZXN1bHQubGVuZ3RoPT09c2l6ZSk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vKiBUaGlzIGlzIHRoZSBKYXZhU2NyaXB0IGFuYWxvZyB0byBhIEMgdW5pb246IGEgd2F5IHRvIG1hcCBiZXR3ZWVuIGEgZmxvYXQgYXMgYSovXG4vKiBudW1iZXIgYW5kIHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBmbG9hdCBhcyBhIGJ1ZmZlciBmdWxsIG9mIGJ5dGVzLiAgTm90ZSovXG4vKiB0aGF0IHRoZSBtdXRhdGlvbiBvZiBzdGF0aWMgc3RhdGUgaGVyZSBtYWtlcyB0aGlzIGludmFsaWQgSmVzc2llIGNvZGUsIGJ1dCovXG4vKiBkb2luZyBpdCB0aGlzIHdheSBzYXZlcyB0aGUgbnVnYXRvcnkgYW5kIGdyYXR1aXRvdXMgYWxsb2NhdGlvbnMgdGhhdCB3b3VsZCovXG4vKiBoYXBwZW4gZXZlcnkgdGltZSB5b3UgZG8gYSBjb252ZXJzaW9uIC0tIGFuZCBpbiBwcmFjdGljYWwgdGVybXMgaXQncyBzYWZlKi9cbi8qIGJlY2F1c2Ugd2UgcHV0IHRoZSB2YWx1ZSBpbiBvbmUgc2lkZSBhbmQgdGhlbiBpbW1lZGlhdGVseSB0YWtlIGl0IG91dCB0aGUqL1xuLyogb3RoZXI7IHRoZXJlIGlzIG5vIGFjdHVhbCBzdGF0ZSByZXRhaW5lZCBpbiB0aGUgY2xhc3NpYyBzZW5zZSBhbmQgdGh1cyBubyovXG4vKiByZS1lbnRyYW5jeSBpc3N1ZS4qL1xuY29uc3QgYXNOdW1iZXI9bmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cz1uZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLyogSmF2YVNjcmlwdCBudW1iZXJzIGFyZSBlbmNvZGVkIGJ5IG91dHB1dHRpbmcgdGhlIGJhc2UtMTYqL1xuLyogcmVwcmVzZW50YXRpb24gb2YgdGhlIGJpbmFyeSB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBJRUVFIGZsb2F0aW5nIHBvaW50Ki9cbi8qIHJlcHJlc2VudGF0aW9uLiAgRm9yIG5lZ2F0aXZlIHZhbHVlcywgYWxsIGJpdHMgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBhcmUqL1xuLyogY29tcGxlbWVudGVkIHByaW9yIHRvIHRoZSBiYXNlLTE2IGNvbnZlcnNpb24sIHdoaWxlIGZvciBwb3NpdGl2ZSB2YWx1ZXMsIHRoZSovXG4vKiBzaWduIGJpdCBpcyBjb21wbGVtZW50ZWQuICBUaGlzIGVuc3VyZXMgYm90aCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGJlZm9yZSovXG4vKiBwb3NpdGl2ZSB2YWx1ZXMgYW5kIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYWNjb3JkaW5nIHRvIHRoZWlyIG5lZ2F0aXZlKi9cbi8qIG1hZ25pdHVkZSByYXRoZXIgdGhhbiB0aGVpciBwb3NpdGl2ZSBtYWduaXR1ZGUuICBUaGlzIHJlc3VsdHMgaW4gYW4gQVNDSUkqL1xuLyogZW5jb2Rpbmcgd2hvc2UgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1lcmljIHNvcnQgb3JkZXIqL1xuLyogb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycy4qL1xuXG4vKiBUT0RPIENob29zZSB0aGUgc2FtZSBjYW5vbmljYWwgTmFOIGVuY29kaW5nIHRoYXQgY29zbVdhc20gYW5kIGV3YXNtIGNob3NlLiovXG5jb25zdCBDYW5vbmljYWxOYU5CaXRzPSdmZmY4MDAwMDAwMDAwMDAwJztcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmluYXJ5NjQ9KG4pPT57XG4vKiBOb3JtYWxpemUgLTAgdG8gMCBhbmQgTmFOIHRvIGEgY2Fub25pY2FsIGVuY29kaW5nKi9cbmlmKGlzKG4sLTApKXtcbm49MDtcbiB9ZWxzZSBpZihpcyhuLE5hTikpe1xucmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gfVxuYXNOdW1iZXJbMF09bjtcbmxldCBiaXRzPWFzQml0c1swXTtcbmlmKG48MCl7XG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5yZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksMTYpfWA7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlQmluYXJ5NjQ9KGVuY29kZWQpPT57XG5lbmNvZGVkLnN0YXJ0c1dpdGgoJ2YnKXx8RmFpbCBgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IGJpdHM9QmlnSW50KCBgMHgke2VuY29kZWQuc3Vic3RyaW5nKDEpfWApO1xuaWYoZW5jb2RlZFsxXTwnOCcpe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxuYXNCaXRzWzBdPWJpdHM7XG5jb25zdCByZXN1bHQ9YXNOdW1iZXJbMF07XG4haXMocmVzdWx0LC0wKXx8RmFpbCBgVW5leHBlY3RlZCBuZWdhdGl2ZSB6ZXJvOiAke2VuY29kZWR9YDtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBFbmNvZGUgYSBKYXZhU2NyaXB0IGJpZ2ludCB1c2luZyBhIHZhcmlhbnQgb2YgRWxpYXMgZGVsdGEgY29kaW5nLCB3aXRoIGFuXG4gKiBpbml0aWFsIGNvbXBvbmVudCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXQgY291bnQgYXMgYSB1bmFyeSBzdHJpbmcsIGFcbiAqIHNlY29uZCBjb21wb25lbnQgZm9yIHRoZSBkZWNpbWFsIGRpZ2l0IGNvdW50LCBhbmQgYSB0aGlyZCBjb21wb25lbnQgZm9yIHRoZVxuICogZGVjaW1hbCBkaWdpdHMgcHJlY2VkZWQgYnkgYSBncmF0dWl0b3VzIHNlcGFyYXRpbmcgY29sb24uXG4gKiBUbyBlbnN1cmUgdGhhdCB0aGUgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIG9mIGVuY29kZWQgdmFsdWVzIG1hdGNoZXMgdGhlXG4gKiBudW1lcmljIHNvcnQgb3JkZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycywgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVuYXJ5XG4gKiBwcmVmaXggYXJlIGRpZmZlcmVudCBmb3IgbmVnYXRpdmUgdmFsdWVzICh0eXBlIFwiblwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2ZcbiAqIFwiI1wicyBbd2hpY2ggc29ydCBiZWZvcmUgZGVjaW1hbCBkaWdpdHNdKSB2cy4gcG9zaXRpdmUgYW5kIHplcm8gdmFsdWVzICh0eXBlXG4gKiBcInBcIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIFwiflwicyBbd2hpY2ggc29ydCBhZnRlciBkZWNpbWFsIGRpZ2l0c10pIGFuZFxuICogZWFjaCBkZWNpbWFsIGRpZ2l0IG9mIHRoZSBlbmNvZGluZyBmb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIGl0c1xuICogdGVuJ3MgY29tcGxlbWVudCAoc28gdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgb2YgdGhlIHNhbWUgc2NhbGUgc29ydCBieVxuICogKmRlc2NlbmRpbmcqIGFic29sdXRlIHZhbHVlKS5cbiAqXG4gKiBAcGFyYW0ge2JpZ2ludH0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmlnSW50PShuKT0+e1xuY29uc3QgYWJzPW48MG4/LW46bjtcbmNvbnN0IG5EaWdpdHM9YWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuY29uc3QgbERpZ2l0cz1uRGlnaXRzLnRvU3RyaW5nKCkubGVuZ3RoO1xuaWYobjwwbil7XG5yZXR1cm4gYG4ke1xuLyogQSBcIiNcIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbicjJy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xuKDEwKipsRGlnaXRzLW5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywnMCcpXG4gfToke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGRpZ2l0cy4qL1xuKDEwbioqQmlnSW50KG5EaWdpdHMpK24pLnRvU3RyaW5nKCkucGFkU3RhcnQobkRpZ2l0cywnMCcpXG4gfWA7XG4gfWVsc2V7XG5yZXR1cm4gYHAke1xuLyogQSBcIn5cIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbid+Jy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xubkRpZ2l0c1xuIH06JHtcbi8qIFRoZSBkaWdpdHMuKi9cbm5cbiB9YDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuY29uc3QgZGVjb2RlQmlnSW50PShlbmNvZGVkKT0+e1xuY29uc3QgdHlwZVByZWZpeD1lbmNvZGVkLmNoYXJBdCgwKTsvKiBmYXN0ZXIgdGhhbiBlbmNvZGVkWzBdKi9cbmxldCByZW09ZW5jb2RlZC5zbGljZSgxKTtcbnR5cGVQcmVmaXg9PT0ncCd8fFxudHlwZVByZWZpeD09PSduJ3x8XG5GYWlsIGBFbmNvZGVkIGJpZ2ludCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbmNvbnN0IGxEaWdpdHM9cmVtLnNlYXJjaCgvWzAtOV0vKSsxO1xubERpZ2l0cz49MXx8RmFpbCBgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xucmVtPXJlbS5zbGljZShsRGlnaXRzLTEpO1xuXG5yZW0ubGVuZ3RoPj1sRGlnaXRzfHxGYWlsIGBDb21wbGV0ZSBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5jb25zdCBzbkRpZ2l0cz1yZW0uc2xpY2UoMCxsRGlnaXRzKTtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cyk7XG4vXlswLTldKyQvLnRlc3Qoc25EaWdpdHMpfHxGYWlsIGBEZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuRGlnaXRzPXBhcnNlSW50KHNuRGlnaXRzLDEwKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuLyogbGlrZSBcIm4wOlwiIGFuZCBcIm4wMDrigKZcIiBhbmQgXCJuOTE64oCmXCIgdGhyb3VnaCBcIm45OTrigKZcIj8qL1xubkRpZ2l0cz0xMCoqbERpZ2l0cy1uRGlnaXRzO1xuIH1cblxucmVtLnN0YXJ0c1dpdGgoJzonKXx8RmFpbCBgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbnJlbT1yZW0uc2xpY2UoMSk7XG5yZW0ubGVuZ3RoPT09bkRpZ2l0c3x8XG5GYWlsIGBGaXhlZC1sZW5ndGggZGlnaXQgc2VxdWVuY2UgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IG49QmlnSW50KHJlbSk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuOTowXCIgYW5kIFwibjg6MDBcIiBhbmQgXCJuODo5MVwiIHRocm91Z2ggXCJuODo5OVwiPyovXG5uPS0oMTBuKipCaWdJbnQobkRpZ2l0cyktbik7XG4gfVxuXG5yZXR1cm4gbjtcbiB9O1xuXG4vKiBgJ1xcdTAwMDAnYCBpcyB0aGUgdGVybWluYXRvciBhZnRlciBlbGVtZW50cy4qL1xuLyogYCdcXHUwMDAxJ2AgaXMgdGhlIGJhY2tzbGFzaC1saWtlIGVzY2FwZSBjaGFyYWN0ZXIsIGZvciovXG4vKiBlc2NhcGluZyBib3RoIG9mIHRoZXNlIGNoYXJhY3RlcnMuKi9cblxuY29uc3QgZW5jb2RlQXJyYXk9KGFycmF5LGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgY2hhcnM9WydbJ107XG5mb3IoY29uc3QgZWxlbWVudCBvZiBhcnJheSl7XG5jb25zdCBlbmM9ZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG5mb3IoY29uc3QgYyBvZiBlbmMpe1xuaWYoYz09PSdcXHUwMDAwJ3x8Yz09PSdcXHUwMDAxJyl7XG5jaGFycy5wdXNoKCdcXHUwMDAxJyk7XG4gfVxuY2hhcnMucHVzaChjKTtcbiB9XG5jaGFycy5wdXNoKCdcXHUwMDAwJyk7XG4gfVxucmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9IGRlY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmNvbnN0IGRlY29kZUFycmF5PShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdbJyl8fEZhaWwgYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuY29uc3QgZWxlbWVudHM9W107XG5jb25zdCBlbGVtQ2hhcnM9W107XG5mb3IobGV0IGk9MTtpPGVuY29kZWQubGVuZ3RoO2krPTEpe1xuY29uc3QgYz1lbmNvZGVkW2ldO1xuaWYoYz09PSdcXHUwMDAwJyl7XG5jb25zdCBlbmNvZGVkRWxlbWVudD1lbGVtQ2hhcnMuam9pbignJyk7XG5lbGVtQ2hhcnMubGVuZ3RoPTA7XG5jb25zdCBlbGVtZW50PWRlY29kZVBhc3NhYmxlKGVuY29kZWRFbGVtZW50KTtcbmVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gfWVsc2UgaWYoYz09PSdcXHUwMDAxJyl7XG5pKz0xO1xuaTxlbmNvZGVkLmxlbmd0aHx8RmFpbCBgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtlbmNvZGVkfWA7XG5jb25zdCBjMj1lbmNvZGVkW2ldO1xuYzI9PT0nXFx1MDAwMCd8fFxuYzI9PT0nXFx1MDAwMSd8fFxuRmFpbCBgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2MyfWA7XG5lbGVtQ2hhcnMucHVzaChjMik7XG4gfWVsc2V7XG5lbGVtQ2hhcnMucHVzaChjKTtcbiB9XG4gfVxuZWxlbUNoYXJzLmxlbmd0aD09PTB8fEZhaWwgYGVuY29kaW5nIHRlcm1pbmF0ZWQgZWFybHk6ICR7ZW5jb2RlZH1gO1xucmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVjb3JkPShyZWNvcmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBuYW1lcz1yZWNvcmROYW1lcyhyZWNvcmQpO1xuY29uc3QgdmFsdWVzPXJlY29yZFZhbHVlcyhyZWNvcmQsbmFtZXMpO1xucmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLHZhbHVlc10pLGVuY29kZVBhc3NhYmxlKX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZVJlY29yZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJygnKSk7XG5jb25zdCBrZXlzdmFscz1kZWNvZGVBcnJheShlbmNvZGVkLnN1YnN0cmluZygxKSxkZWNvZGVQYXNzYWJsZSk7XG5rZXlzdmFscy5sZW5ndGg9PT0yfHxGYWlsIGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2VuY29kZWR9YDtcbmNvbnN0W2tleXMsdmFsc109a2V5c3ZhbHM7XG5cbnBhc3NTdHlsZU9mKGtleXMpPT09J2NvcHlBcnJheScmJlxucGFzc1N0eWxlT2YodmFscyk9PT0nY29weUFycmF5JyYmXG5rZXlzLmxlbmd0aD09PXZhbHMubGVuZ3RoJiZcbmtleXMuZXZlcnkoKGtleSk9PnR5cGVvZiBrZXk9PT0nc3RyaW5nJyl8fFxuRmFpbCBgbm90IGEgdmFsaWQgcmVjb3JkIGVuY29kaW5nOiAke2VuY29kZWR9YDtcbmNvbnN0IG1hcEVudHJpZXM9a2V5cy5tYXAoKGtleSxpKT0+W2tleSx2YWxzW2ldXSk7XG5jb25zdCByZWNvcmQ9aGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbmFzc2VydFJlY29yZChyZWNvcmQsJ2RlY29kZWQgcmVjb3JkJyk7XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0IGVuY29kZVRhZ2dlZD0odGFnZ2VkLGVuY29kZVBhc3NhYmxlKT0+XG4gYDoke2VuY29kZUFycmF5KGhhcmRlbihbZ2V0VGFnKHRhZ2dlZCksdGFnZ2VkLnBheWxvYWRdKSxlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkPShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnOicpKTtcbmNvbnN0IHRhZ3BheWxvYWQ9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xudGFncGF5bG9hZC5sZW5ndGg9PT0yfHxGYWlsIGBleHBlY3RlZCB0YWcscGF5bG9hZCBwYWlyOiAke2VuY29kZWR9YDtcbmNvbnN0W3RhZyxwYXlsb2FkXT10YWdwYXlsb2FkO1xucGFzc1N0eWxlT2YodGFnKT09PSdzdHJpbmcnfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtlbmNvZGVkfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcscGF5bG9hZCk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlRXJyb3JdXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVQYXNzYWJsZT0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlPShyZW0sXyk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gLFxuZW5jb2RlUHJvbWlzZT0ocHJvbSxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YCxcbmVuY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWB9PVxuZW5jb2RlT3B0aW9ucztcblxuY29uc3QgZW5jb2RlUGFzc2FibGU9KHBhc3NhYmxlKT0+e1xuaWYoaXNFcnJvckxpa2UocGFzc2FibGUpKXtcbnJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzp7XG5yZXR1cm4ndic7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybid6JztcbiB9XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kZUJpbmFyeTY0KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xucmV0dXJuIGBzJHtwYXNzYWJsZX1gO1xuIH1cbmNhc2UnYm9vbGVhbic6e1xucmV0dXJuIGBiJHtwYXNzYWJsZX1gO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm4gZW5jb2RlQmlnSW50KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgncicpfHxcbkZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlRXJyb3IocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJyEnKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCc/Jyl8fFxuRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiP1wiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGB5JHtuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpfWA7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBlbmNvZGVBcnJheShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5yZXR1cm4gZW5jb2RlUmVjb3JkKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJuIGVuY29kZVRhZ2dlZChwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBhICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgdXNlZCBhcyBhIGNvbGxlY3Rpb24gcGFzc2FibGVgO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVQYXNzYWJsZShtYWtlRW5jb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVQYXNzYWJsZT0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlPShyZW0sXyk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gLFxuZGVjb2RlUHJvbWlzZT0ocHJvbSxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YCxcbmRlY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWB9PVxuZGVjb2RlT3B0aW9ucztcblxuY29uc3QgZGVjb2RlUGFzc2FibGU9KGVuY29kZWQpPT57XG5zd2l0Y2goZW5jb2RlZC5jaGFyQXQoMCkpe1xuY2FzZSd2Jzp7XG5yZXR1cm4gbnVsbDtcbiB9XG5jYXNlJ3onOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdmJzp7XG5yZXR1cm4gZGVjb2RlQmluYXJ5NjQoZW5jb2RlZCk7XG4gfVxuY2FzZSdzJzp7XG5yZXR1cm4gZW5jb2RlZC5zdWJzdHJpbmcoMSk7XG4gfVxuY2FzZSdiJzp7XG5yZXR1cm4gZW5jb2RlZC5zdWJzdHJpbmcoMSkhPT0nZmFsc2UnO1xuIH1cbmNhc2Unbic6XG5jYXNlJ3AnOntcbnJldHVybiBkZWNvZGVCaWdJbnQoZW5jb2RlZCk7XG4gfVxuY2FzZSdyJzp7XG5yZXR1cm4gZGVjb2RlUmVtb3RhYmxlKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnPyc6e1xucmV0dXJuIGRlY29kZVByb21pc2UoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSchJzp7XG5yZXR1cm4gZGVjb2RlRXJyb3IoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSd5Jzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kZWQuc3Vic3RyaW5nKDEpKTtcbiB9XG5jYXNlJ1snOntcbnJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJygnOntcbnJldHVybiBkZWNvZGVSZWNvcmQoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSc6Jzp7XG5yZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7ZW5jb2RlZH1gO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVQYXNzYWJsZShtYWtlRGVjb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5cbmNvbnN0ICAgICAgICBpc0VuY29kZWRSZW1vdGFibGU9KGVuY29kZWQpPT5lbmNvZGVkLmNoYXJBdCgwKT09PSdyJzskaOKAjV9vbmNlLmlzRW5jb2RlZFJlbW90YWJsZShpc0VuY29kZWRSZW1vdGFibGUpO1xuaGFyZGVuKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZSB7UmVjb3JkPFBhc3NTdHlsZSwgc3RyaW5nPn1cbiAqIFRoZSBzaW5nbGUgcHJlZml4IGNoYXJhY3RlcnMgdG8gYmUgdXNlZCBmb3IgZWFjaCBQYXNzU3R5bGUgY2F0ZWdvcnkuXG4gKiBgYmlnaW50YCBpcyBhIHR3byBjaGFyYWN0ZXIgc3RyaW5nIGJlY2F1c2UgZWFjaCBvZiB0aG9zZSBjaGFyYWN0ZXJzXG4gKiBpbmRpdmlkdWFsbHkgaXMgYSB2YWxpZCBiaWdpbnQgcHJlZml4LiBgbmAgZm9yIFwibmVnYXRpdmVcIiBhbmQgYHBgIGZvclxuICogXCJwb3NpdGl2ZVwiLiBUaGUgb3JkZXJpbmcgb2YgdGhlc2UgcHJlZml4ZXMgaXMgdGhlIHNhbWUgYXMgdGhlXG4gKiByYW5rT3JkZXJpbmcgb2YgdGhlaXIgcmVzcGVjdGl2ZSBQYXNzU3R5bGVzLiBUaGlzIHRhYmxlIGlzIGltcG9ydGVkIGJ5XG4gKiByYW5rT3JkZXIuanMgZm9yIHRoaXMgcHVycG9zZS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgYHxgIGlzIHRoZSByZW1vdGFibGUtPm9yZGluYWwgbWFwcGluZyBwcmVmaXg6XG4gKiBUaGlzIGlzIG5vdCB1c2VkIGluIGNvdmVycyBidXQgaXQgaXNcbiAqIHJlc2VydmVkIGZyb20gdGhlIHNhbWUgc2V0IG9mIHN0cmluZ3MuIE5vdGUgdGhhdCB0aGUgcHJlZml4IGlzID4gYW55XG4gKiBwcmVmaXggdXNlZCBieSBhbnkgY292ZXIgc28gdGhhdCBvcmRpbmFsIG1hcHBpbmcga2V5cyBhcmUgYWx3YXlzIG91dHNpZGVcbiAqIHRoZSByYW5nZSBvZiB2YWxpZCBjb2xsZWN0aW9uIGVudHJ5IGtleXMuXG4gKi9cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVQcmVmaXhlcz17XG5lcnJvcjonIScsXG5jb3B5UmVjb3JkOicoJyxcbnRhZ2dlZDonOicsXG5wcm9taXNlOic/JyxcbmNvcHlBcnJheTonWycsXG5ib29sZWFuOidiJyxcbm51bWJlcjonZicsXG5iaWdpbnQ6J25wJyxcbnJlbW90YWJsZToncicsXG5zdHJpbmc6J3MnLFxubnVsbDondicsXG5zeW1ib2w6J3knLFxudW5kZWZpbmVkOid6J307JGjigI1fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVQcmVmaXhlcyxudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVQcmVmaXhlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVjb3JkTmFtZXMiOlsicmVjb3JkTmFtZXMiXSwicmVjb3JkVmFsdWVzIjpbInJlY29yZFZhbHVlcyJdLCJ6ZXJvUGFkIjpbInplcm9QYWQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXSwicGFzc1N0eWxlUHJlZml4ZXMiOlsicGFzc1N0eWxlUHJlZml4ZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxFOn8Pw/AAD8PwAAKwAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9lbmNvZGVUb0NhcERhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxpc09iamVjdCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nVW5pb259IEVuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxuZGVmaW5lUHJvcGVydGllcyxcbmlzLFxuZW50cmllcyxcbmZyb21FbnRyaWVzLFxuZnJlZXplfT1cbk9iamVjdDtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBTcGVjaWFsIHByb3BlcnR5IG5hbWUgdGhhdCBpbmRpY2F0ZXMgYW4gZW5jb2RpbmcgdGhhdCBuZWVkcyBzcGVjaWFsXG4gKiBkZWNvZGluZy5cbiAqL1xuY29uc3QgUUNMQVNTPSdAcWNsYXNzJzskaOKAjV9vbmNlLlFDTEFTUyhRQ0xBU1MpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2VuY29kZWQgaXMgRW5jb2RpbmdVbmlvbn1cbiAqL1xuY29uc3QgaGFzUUNsYXNzPShlbmNvZGVkKT0+aGFzT3duUHJvcGVydHlPZihlbmNvZGVkLFFDTEFTUyk7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHBhcmFtIHtzdHJpbmd9IHFjbGFzc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHFjbGFzc01hdGNoZXM9KGVuY29kZWQscWNsYXNzKT0+XG5pc09iamVjdChlbmNvZGVkKSYmXG4haXNBcnJheShlbmNvZGVkKSYmXG5oYXNRQ2xhc3MoZW5jb2RlZCkmJlxuZW5jb2RlZFtRQ0xBU1NdPT09cWNsYXNzO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvQ2FwRGF0YU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPShyZW0pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycik9PkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9DYXBEYXRhT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9DYXBEYXRhPShlbmNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9ZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGE9ZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YT1kb250RW5jb2RlRXJyb3JUb0NhcERhdGF9PVxuZW5jb2RlT3B0aW9ucztcblxuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb0NhcERhdGFgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9DYXBEYXRhYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgYXMgW1FDTEFTU10gY29tcG9zaXRlcy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ3N0cmluZyc6e1xuLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm57W1FDTEFTU106J3VuZGVmaW5lZCd9O1xuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybntbUUNMQVNTXTonTmFOJ307XG4gfWVsc2UgaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106J0luZmluaXR5J307XG4gfWVsc2UgaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOictSW5maW5pdHknfTtcbiB9XG4vKiBQYXNzIHRocm91Z2ggZXZlcnl0aGluZyBlbHNlLCByZXBsYWNpbmcgLTAgd2l0aCAwLiovXG5yZXR1cm4gaXMocGFzc2FibGUsLTApPzA6cGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybntcbltRQ0xBU1NdOidiaWdpbnQnLFxuZGlnaXRzOlN0cmluZyhwYXNzYWJsZSl9O1xuXG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybntcbltRQ0xBU1NdOidzeW1ib2wnLFxubmFtZX07XG5cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGhhc093blByb3BlcnR5T2YocGFzc2FibGUsUUNMQVNTKSl7XG4vKiBIaWxiZXJ0IGhvdGVsKi9cbmNvbnN0e1tRQ0xBU1NdOnFjbGFzc1ZhbHVlLC4uLnJlc3R9PXBhc3NhYmxlO1xuLyoqIEB0eXBlIHtFbmNvZGluZ30gKi9cbmNvbnN0IHJlc3VsdD17XG5bUUNMQVNTXTonaGlsYmVydCcsXG5vcmlnaW5hbDplbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSl9O1xuXG5pZihvd25LZXlzKHJlc3QpLmxlbmd0aD49MSl7XG4vKiBXZSBoYXJkZW4gdGhlIGVudGlyZSBjYXBEYXRhIGVuY29kaW5nIGJlZm9yZSB3ZSByZXR1cm4gaXQuKi9cbi8qIGBlbmNvZGVUb0NhcERhdGFgIHJlcXVpcmVzIHRoYXQgaXRzIGlucHV0IGJlIFBhc3NhYmxlLCBhbmQqL1xuLyogdGhlcmVmb3JlIGhhcmRlbmVkLiovXG4vKiBUaGUgYGZyZWV6ZWAgaGVyZSBpcyBuZWVkZWQgYW55d2F5LCBiZWNhdXNlIHRoZSBgcmVzdGAgaXMqL1xuLyogZnJlc2hseSBjb25zdHJ1Y3RlZCBieSB0aGUgYC4uLmAgYWJvdmUsIGFuZCB3ZSdyZSB1c2luZyBpdCovXG4vKiBhcyBpbXB1dCBpbiBhbm90aGVyIGNhbGwgdG8gYGVuY29kZVRvQ2FwRGF0YWAuKi9cbnJlc3VsdC5yZXN0PWVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbltRQ0xBU1NdOid0YWdnZWQnLFxudGFnOmdldFRhZyhwYXNzYWJsZSksXG5wYXlsb2FkOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YShcbnBhc3NhYmxlLFxuZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuXG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTKVxuIH0gJHtxKCdzbG90Jyl9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidzbG90JylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnZXJyb3InKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nZXJyb3InKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xucmV0dXJuIGhhcmRlbihlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cikpO1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9DYXBEYXRhKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlKX0gW2RlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlKX0gW2RlY29kZVByb21pc2VGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbUNhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShzbG90RW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT0oZXJyb3JFbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJvckVuY29kaW5nfWA7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaFxuICogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uXG4gKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZVxuICogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS5cbiAqXG4gKiBUaGlzIHNlZW1zIGxpa2UgdGhlIGJlc3Qgc3RhcnRpbmcgcG9pbnQgdG8gaW5jcmVtZW50YWxseSBldm9sdmUgdG8gYW5cbiAqIEFQSSB3aGVyZSB0aGVzZSBjYW4gcmVsaWFibHkgZGlmZmVyLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNFxuICpcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IEVuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tQ2FwRGF0YT0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGE9ZG9udERlY29kZUVycm9yRnJvbUNhcERhdGF9PVxuZGVjb2RlT3B0aW9ucztcblxuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9PT1kZWNvZGVQcm9taXNlRnJvbUNhcERhdGF8fFxuRmFpbCBgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKVxuIH0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuLyoqXG4gKiBgZGVjb2RlRnJvbUNhcERhdGFgIG1heSByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGpzb25FbmNvZGVkYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9DYXBEYXRhYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tQ2FwRGF0YWAgY2Fubm90IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBqc29uRW5jb2RlZCBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21DYXBEYXRhPShqc29uRW5jb2RlZCk9PntcbmlmKCFpc09iamVjdChqc29uRW5jb2RlZCkpe1xuLyogcHJpbWl0aXZlcyBwYXNzIHRocm91Z2gqL1xucmV0dXJuIGpzb25FbmNvZGVkO1xuIH1cbmlmKGlzQXJyYXkoanNvbkVuY29kZWQpKXtcbnJldHVybiBqc29uRW5jb2RlZC5tYXAoKGVuY29kZWRWYWwpPT5kZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gfWVsc2UgaWYoaGFzUUNsYXNzKGpzb25FbmNvZGVkKSl7XG5jb25zdCBxY2xhc3M9anNvbkVuY29kZWRbUUNMQVNTXTtcbnR5cGVvZiBxY2xhc3M9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG5zd2l0Y2gocWNsYXNzKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZSctSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e2RpZ2l0c309anNvbkVuY29kZWQ7XG50eXBlb2YgZGlnaXRzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xucmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBEZXByZWNhdGVkIHFjbGFzcy4gVE9ETyBtYWtlIGNvbmRpdGlvbmFsKi9cbi8qIG9uIGVudmlyb25tZW50IHZhcmlhYmxlLiBFdmVudHVhbGx5IHJlbW92ZSwgYnV0IGFmdGVyIGNvbmZpZGVudCovXG4vKiB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHN1cHBvcnRlZCBzZW5kZXJzLiovXG4vKiovXG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xucmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7bmFtZX09anNvbkVuY29kZWQ7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7dGFnLHBheWxvYWR9PWpzb25FbmNvZGVkO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLGRlY29kZUZyb21DYXBEYXRhKHBheWxvYWQpKTtcbiB9XG5jYXNlJ3Nsb3QnOntcbi8qIFNlZSBub3RlIGFib3ZlIGFib3V0IGhvdyB0aGUgY3VycmVudCBlbmNvZGluZyBjYW5ub3QgcmVsaWFibHkqL1xuLyogZGlzdGluZ3Vpc2ggd2hpY2ggd2Ugc2hvdWxkIGNhbGwsIHNvIGluIHRoZSBub24tZGVmYXVsdCBjYXNlKi9cbi8qIGJvdGggbXVzdCBiZSB0aGUgc2FtZSBhbmQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggd2UgY2FsbC4qL1xuY29uc3QgZGVjb2RlZD1kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG4vKiBCRVdBUkU6IGNhcGRhdGEgZG9lcyBub3QgY2hlY2sgdGhhdCBgZGVjb2RlZGAgaXMqL1xuLyogYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLCBzaW5jZSB0aGF0IHdvdWxkIGJyZWFrIHNvbWUqL1xuLyogY2FwZGF0YSBjbGllbnRzLiBXZSBhcmUgZGVwcmVjYXRpbmcgY2FwZGF0YSwgYW5kIHRoZXNlIGNsaWVudHMqL1xuLyogd2lsbCBuZWVkIHRvIHVwZGF0ZSBiZWZvcmUgc3dpdGNoaW5nIHRvIHNtYWxsY2Fwcy4qL1xucmV0dXJuIGRlY29kZWQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZGVjb2RlZD1kZWNvZGVFcnJvckZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbmlmKHBhc3NTdHlsZU9mKGRlY29kZWQpPT09J2Vycm9yJyl7XG5yZXR1cm4gZGVjb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7ZGVjb2RlZH1gO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e29yaWdpbmFsLHJlc3R9PWpzb25FbmNvZGVkO1xuaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwnb3JpZ2luYWwnKXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuLyogRG9uJ3QgaGFyZGVuIHNpbmNlIHdlJ3JlIG5vdCBkb25lIG11dGF0aW5nIGl0Ki9cbmNvbnN0IHJlc3VsdD17W1FDTEFTU106ZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpfTtcbmlmKGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ3Jlc3QnKSl7XG5jb25zdCBpc05vbkVtcHR5T2JqZWN0PVxudHlwZW9mIHJlc3Q9PT0nb2JqZWN0JyYmXG5yZXN0IT09bnVsbCYmXG5vd25LZXlzKHJlc3QpLmxlbmd0aD49MTtcbmlmKCFpc05vbkVtcHR5T2JqZWN0KXtcbnRocm93IEZhaWwgYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gO1xuIH1cbmNvbnN0IHJlc3RPYmo9ZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4vKiBUT0RPIHJlYWxseSBzaG91bGQgYXNzZXJ0IHRoYXQgYHBhc3NTdHlsZU9mKHJlc3QpYCBpcyovXG4vKiBgJ2NvcHlSZWNvcmQnYCBidXQgd2UnZCBoYXZlIHRvIGhhcmRlbiBpdCBhbmQgaXQgaXMgdG9vKi9cbi8qIGVhcmx5IHRvIGRvIHRoYXQuKi9cbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RPYmosUUNMQVNTKXx8XG5GYWlsIGBSZXN0IG11c3Qgbm90IGNvbnRhaW4gaXRzIG93biBkZWZpbml0aW9uIG9mICR7cShRQ0xBU1MpfWA7XG5kZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHJlc3RPYmopKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhpcyBpcyB0aGUgZXJyb3IgY2FzZSB3ZSdyZSB0ZXN0aW5nIGZvciovXG5jYXNlJ2liaWQnOntcbnRocm93IEZhaWwgYFRoZSBjYXBEYXRhIHByb3RvY29sIG5vIGxvbmdlciBzdXBwb3J0cyAke3EoUUNMQVNTKX0gJHtxKFxucWNsYXNzKVxuIH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNle1xuYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZD09PSdvYmplY3QnJiZqc29uRW5jb2RlZCE9PW51bGwpO1xuY29uc3QgZGVjb2RlRW50cnk9KFtuYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGpzb25FbmNvZGVkKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbUNhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJRQ0xBU1MiOlsiUUNMQVNTIl0sIm1ha2VFbmNvZGVUb0NhcERhdGEiOlsibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiOlsibWFrZURlY29kZUZyb21DYXBEYXRhIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALNe92vFOwAAxTsAAC0AAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIiwibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG4vKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nfSBTbWFsbGNhcHNFbmNvZGluZyAqWC8qL1xuLyogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ1VuaW9ufSBTbWFsbGNhcHNFbmNvZGluZ1VuaW9uICpYLyovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e2lzLGVudHJpZXMsZnJvbUVudHJpZXN9PU9iamVjdDtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3QgQkFORz0nIScuY2hhckNvZGVBdCgwKTtcbmNvbnN0IERBU0g9Jy0nLmNoYXJDb2RlQXQoMCk7XG5cbi8qKlxuICogQW4gYGVuY29kZVRvU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhIHBhc3NhYmxlIGFuZCByZXR1cm5zIGFcbiAqIEpTT04tcmVwcmVzZW50YWJsZSBvYmplY3QgKGkuZS4sIHJvdW5kLXRyaXBwaW5nIGl0IHRocm91Z2hcbiAqIGBKU09OLnN0cmluZ2lmeWAgYW5kIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlcGxhY2VycyBvciByZXZpdmVyc1xuICogcmV0dXJucyBhbiBlcXVpdmFsZW50IHN0cnVjdHVyZSBleGNlcHQgZm9yIG9iamVjdCBpZGVudGl0eSkuXG4gKiBXZSBjYWxsIHRoaXMgcmVwcmVzZW50YXRpb24gYSBTbWFsbGNhcHMgRW5jb2RpbmcuXG4gKlxuICogQSBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYXMgYXJndW1lbnQgd2hhdCBpdFxuICogKmFzc3VtZXMqIGlzIHRoZSByZXN1bHQgb2YgYSBwbGFpbiBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXNvbHZlci4gSXQgdGhlblxuICogbXVzdCB2YWxpZGF0ZSB0aGF0IGl0IGlzIGEgdmFsaWQgU21hbGxjYXBzIEVuY29kaW5nLCBhbmQgaWYgaXQgaXMsXG4gKiByZXR1cm4gYSBjb3JyZXNwb25kaW5nIHBhc3NhYmxlLlxuICpcbiAqIFNtYWxsY2FwcyBjb25zaWRlcnMgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiBgIWAgKGFzY2lpIGNvZGUgMzMsIEJBTkcpXG4gKiBhbmQgYC1gIChhc2NpaSBjb2RlIDQ1LCBEQVNIKSB0byBiZSBzcGVjaWFsIHByZWZpeGVzIGFsbG93aW5nXG4gKiByZXByZXNlbnRhdGlvbiBvZiBKU09OLWluY29tcGF0aWJsZSBkYXRhIHVzaW5nIHN0cmluZ3MuXG4gKiBUaGVzZSBjaGFyYWN0ZXJzLCBpbiBvcmRlciwgYXJlIGAhXCIjJCUmJygpKissLWBcbiAqIE9mIHRoZXNlLCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgKiBgIWAgLSBlc2NhcGVkIHN0cmluZ1xuICogICogYCtgIC0gbm9uLW5lZ2F0aXZlIGJpZ2ludFxuICogICogYC1gIC0gbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgI2AgLSBtYW5pZmVzdCBjb25zdGFudFxuICogICogYCVgIC0gc3ltYm9sXG4gKiAgKiBgJGAgLSByZW1vdGFibGVcbiAqICAqIGAmYCAtIHByb21pc2VcbiAqXG4gKiBBbGwgb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzIChgXCInKCkqLGApIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS5cbiAqXG4gKiBUaGUgbWFuaWZlc3QgY29uc3RhbnRzIHRoYXQgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIGZvciB2YWx1ZXM6XG4gKiAgKiBgI3VuZGVmaW5lZGBcbiAqICAqIGAjTmFOYFxuICogICogYCNJbmZpbml0eWBcbiAqICAqIGAjLUluZmluaXR5YFxuICpcbiAqIGFuZCBmb3IgcHJvcGVydHkgbmFtZXMgYW5hbG9nb3VzIHRvIGNhcGRhdGEgQHFjbGFzczpcbiAqICAqIGAjdGFnYFxuICogICogYCNlcnJvcmBcbiAqXG4gKiBBbGwgb3RoZXIgZW5jb2RlZCBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGAjYCBhcmUgcmVzZXJ2ZWQgZm9yXG4gKiBmdXR1cmUgdXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkU3RyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc3RhcnRzU3BlY2lhbD0oZW5jb2RlZFN0cik9PntcbmlmKGVuY29kZWRTdHI9PT0nJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuLyogY2hhckNvZGVBdCgwKSBhbmQgbnVtYmVyIGNvbXBhcmUgaXMgYSBiaXQgZmFzdGVyLiovXG5jb25zdCBjb2RlPWVuY29kZWRTdHIuY2hhckNvZGVBdCgwKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB5b2RhKi9cbnJldHVybiBCQU5HPD1jb2RlJiZjb2RlPD1EQVNIO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZUVycm9yVG9TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW0pPT5cbkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9tKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHM9KGVycik9PlxuRmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7cShlcnIpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogZW5jb2RlT3B0aW9ucyBpcyBhY3R1YWxseSBvcHRpb25hbCwgYnV0IG5vdCBtYXJrZWQgYXMgc3VjaCB0byB3b3JrIGFyb3VuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDI4NlxuICpcbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVUb1NtYWxsY2Fwcz0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzPWRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzfT1cbmVuY29kZU9wdGlvbnM7XG5cbmNvbnN0IGFzc2VydEVuY29kZWRFcnJvcj0oZW5jb2RpbmcpPT57XG50eXBlb2YgZW5jb2Rpbmc9PT0nb2JqZWN0JyYmaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG5lbmNvZGluZylcbiB9YDtcbi8qIEFzc2VydCB0aGF0IHRoZSAjZXJyb3IgcHJvcGVydHkgZGVjb2RlcyB0byBhIHN0cmluZy4qL1xuY29uc3QgbWVzc2FnZT1lbmNvZGluZ1snI2Vycm9yJ107XG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnJiYoXG4hc3RhcnRzU3BlY2lhbChtZXNzYWdlKXx8bWVzc2FnZS5zdGFydHNXaXRoKCchJykpfHxcbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gO1xuIH07XG5cbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRlbHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge1NtYWxsY2Fwc0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9TbWFsbGNhcHNgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9TbWFsbGNhcHNgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGludG8gc21hbGxjYXBzIHN0cmluZ3MuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoc3RhcnRzU3BlY2lhbChwYXNzYWJsZSkpe1xuLyogU3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYSBzcGVjaWFsIGNoYXIgYXJlIHF1b3RlZCB3aXRoIGAhYC4qL1xuLyogU2luY2UgYCFgIGlzIGl0c2VsZiBhIHNwZWNpYWwgY2hhcmFjdGVyLCB0aGlzIHRyaXZpYWxseSBkb2VzKi9cbi8qIHRoZSBIaWxiZXJ0IGhvdGVsLiBBbHNvLCBzaW5jZSB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSovXG4vKiBhIGNvbnRpbnVvdXMgc3VicmFuZ2Ugb2YgYXNjaWksIHRoaXMgcXVvdGluZyBpcyBzb3J0LW9yZGVyKi9cbi8qIHByZXNlcnZpbmcuKi9cbnJldHVybiBgISR7cGFzc2FibGV9YDtcbiB9XG4vKiBBbGwgb3RoZXIgc3RyaW5ncyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybicjdW5kZWZpbmVkJztcbiB9XG5jYXNlJ251bWJlcic6e1xuLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm4nI05hTic7XG4gfWVsc2UgaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm4nI0luZmluaXR5JztcbiB9ZWxzZSBpZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm4nIy1JbmZpbml0eSc7XG4gfVxuLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xucmV0dXJuIGlzKHBhc3NhYmxlLC0wKT8wOnBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdCBzdHI9U3RyaW5nKHBhc3NhYmxlKTtcbnJldHVybiAoLyoqIEB0eXBlIHtiaWdpbnR9ICovcGFzc2FibGU8MG4/c3RyOmArJHtzdHJ9YCk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybiBgJSR7bmFtZX1gO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W1xuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuJyN0YWcnOmVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG5wYXlsb2FkOmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyQnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJFwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyYnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbmFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuY29uc3QgcmVzdWx0PWhhcmRlbihcbmVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cikpO1xuXG5hc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9TbWFsbGNhcHMobWFrZUVuY29kZVRvU21hbGxjYXBzKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcz0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfT1cbmRlY29kZU9wdGlvbnM7XG5cbi8qKlxuICogYGRlY29kZUZyb21TbWFsbGNhcHNgIG1heSByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGVuY29kaW5nYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9TbWFsbGNhcHNgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21TbWFsbGNhcHNgIGNhbm5vdCByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge1NtYWxsY2Fwc0VuY29kaW5nfSBlbmNvZGluZyBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+e1xuc3dpdGNoKHR5cGVvZiBlbmNvZGluZyl7XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGluZztcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5jb25zdCBjPWVuY29kaW5nLmNoYXJBdCgwKTtcbnN3aXRjaChjKXtcbmNhc2UnISc6e1xuLyogdW4taGlsYmVydC1pZnkgdGhlIHN0cmluZyovXG5yZXR1cm4gZW5jb2Rpbmcuc2xpY2UoMSk7XG4gfVxuY2FzZSclJzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kaW5nLnNsaWNlKDEpKTtcbiB9XG5jYXNlJyMnOntcbnN3aXRjaChlbmNvZGluZyl7XG5jYXNlJyN1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZScjTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnI0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZScjLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfVxuY2FzZScrJzpcbmNhc2UnLSc6e1xucmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gfVxuY2FzZSckJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbmlmKHBhc3NTdHlsZU9mKHJlc3VsdCkhPT0ncmVtb3RhYmxlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSByZW1vdGFibGU6ICR7cmVzdWx0fWA7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJyYnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbmlmKHBhc3NTdHlsZU9mKHJlc3VsdCkhPT0ncHJvbWlzZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFNwZWNpYWwgY2hhciAke3EoXG5jKVxuIH0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6ICR7ZW5jb2Rpbmd9YDtcbiB9fVxuXG4gfVxuY2FzZSdvYmplY3QnOntcbmlmKGVuY29kaW5nPT09bnVsbCl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuXG5pZihpc0FycmF5KGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2RpbmcubWFwKCh2YWwpPT5kZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI3RhZycpKXtcbmNvbnN0eycjdGFnJzp0YWcscGF5bG9hZCwuLi5yZXN0fT1lbmNvZGluZztcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBWYWx1ZSBvZiBcIiN0YWdcIiwgdGhlIHRhZywgbXVzdCBiZSBhIHN0cmluZzogJHtlbmNvZGluZ31gO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZChcbmRlY29kZUZyb21TbWFsbGNhcHModGFnKSxcbmRlY29kZUZyb21TbWFsbGNhcHMocGF5bG9hZCkpO1xuXG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjZXJyb3InKSl7XG5jb25zdCByZXN1bHQ9ZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxucGFzc1N0eWxlT2YocmVzdWx0KT09PSdlcnJvcid8fFxuRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuY29uc3QgZGVjb2RlRW50cnk9KFtlbmNvZGVkTmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBlbmNvZGVkTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5IG5hbWUgJHtxKFxuZW5jb2RlZE5hbWUpXG4gfSBvZiAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiFlbmNvZGVkTmFtZS5zdGFydHNXaXRoKCcjJyl8fFxuRmFpbCBgVW5yZWNvZ25pemVkIHJlY29yZCB0eXBlICR7cShlbmNvZGVkTmFtZSl9OiAke2VuY29kaW5nfWA7XG5jb25zdCBuYW1lPWRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZE5hbWUpO1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBEZWNvZGVkIHByb3BlcnR5IG5hbWUgJHtuYW1lfSBmcm9tICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkVmFsKV07XG4gfTtcbmNvbnN0IGRlY29kZWRFbnRyaWVzPWVudHJpZXMoZW5jb2RpbmcpLm1hcChkZWNvZGVFbnRyeSk7XG5yZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogdW5yZWNvZ25pemVkIEpTT04gdHlwZW9mICR7cShcbnR5cGVvZiBlbmNvZGluZylcbiB9OiAke2VuY29kaW5nfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVuY29kZVRvU21hbGxjYXBzIjpbIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAIQpL9rCoAAKwqAAAqAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL21hcnNoYWwtanVzdGluLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImRlY29kZVRvSnVzdGluIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxnZXRFcnJvckNvbnN0cnVjdG9yLGlzT2JqZWN0LHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxRQ0xBU1M7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DYXBEYXRhPFQ+fSBDYXBEYXRhICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3N0cmluZ2lmeTpxdW90ZX09SlNPTjtcbmNvbnN0e3F1b3RlOnEsZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbmRlbnRlclxuICogQHByb3BlcnR5IHsob3BlbkJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBvcGVuXG4gKiBAcHJvcGVydHkgeygpID0+IG51bWJlcn0gbGluZVxuICogQHByb3BlcnR5IHsodG9rZW46IHN0cmluZykgPT4gbnVtYmVyfSBuZXh0XG4gKiBAcHJvcGVydHkgeyhjbG9zZUJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBjbG9zZVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGRvbmVcbiAqL1xuXG4vKipcbiAqIEdlbmVyb3VzIHdoaXRlc3BhY2UgZm9yIHJlYWRhYmlsaXR5XG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlWWVzSW5kZW50ZXI9KCk9PntcbmNvbnN0IHN0cmluZ3M9W107XG5sZXQgbGV2ZWw9MDtcbmxldCBuZWVkU3BhY2U9ZmFsc2U7XG5jb25zdCBsaW5lPSgpPT57XG5uZWVkU3BhY2U9ZmFsc2U7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKCdcXG4nLCcgICcucmVwZWF0KGxldmVsKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT57XG5sZXZlbCs9MTtcbmlmKG5lZWRTcGFjZSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG5uZWVkU3BhY2U9ZmFsc2U7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KTtcbiB9LFxubGluZSxcbm5leHQ6KHRva2VuKT0+e1xuaWYobmVlZFNwYWNlJiZ0b2tlbiE9PScsJyl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG5uZWVkU3BhY2U9dHJ1ZTtcbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuYXNzZXJ0KGxldmVsPj0xKTtcbmxldmVsLT0xO1xubGluZSgpO1xucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT57XG5hc3NlcnQuZXF1YWwobGV2ZWwsMCk7XG5yZXR1cm4gc3RyaW5ncy5qb2luKCcnKTtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIElmIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBvbmUgdG9rZW4gdG9nZXRoZXIgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyXG4gKiBvZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoaXMgcGF0dGVybiwgdGhlbiB0aGUgdHdvIHRva2VucyBtdXN0IGJlXG4gKiBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSB0byBwcmVzZXJ2ZSB0aGVpciBtZWFuaW5nLiBPdGhlcndpc2UgdGhlXG4gKiB3aGl0ZXNwYWNlIGluIHVubmVjZXNzYXJ5LlxuICpcbiAqIFRoZSBgPCFgIGFuZCBgLT5gIGNhc2VzIHByZXZlbnQgdGhlIGFjY2lkZW50YWwgZm9ybWF0aW9uIG9mIGFuXG4gKiBodG1sLWxpa2UgY29tbWVudC4gSSBkb24ndCB0aGluayB0aGUgZG91YmxlIGFuZ2xlIGJyYWNrZXRzIGFyZSBhY3R1YWxseVxuICogbmVlZGVkIGJ1dCBJIGhhdmVuJ3QgdGhvdWdodCBhYm91dCBpdCBlbm91Z2ggdG8gcmVtb3ZlIHRoZW0uXG4gKi9cbmNvbnN0IGJhZFBhaXJQYXR0ZXJuPS9eKD86XFx3XFx3fDw8fD4+fFxcK1xcK3wtLXw8IXwtPikkLztcblxuLyoqXG4gKiBNaW5pbXVtIHdoaXRlc3BhY2UgbmVlZGVkIHRvIHByZXNldmUgbWVhbmluZy5cbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyPSgpPT57XG4vKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuY29uc3Qgc3RyaW5ncz1bXTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT5zdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpLFxubGluZTooKT0+c3RyaW5ncy5sZW5ndGgsXG5uZXh0Oih0b2tlbik9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xKXtcbmNvbnN0IGxhc3Q9c3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXTtcbmlmKGxhc3QubGVuZ3RoPj0xJiZ0b2tlbi5sZW5ndGg+PTEpe1xuY29uc3QgcGFpcj0gYCR7bGFzdFtsYXN0Lmxlbmd0aC0xXX0ke3Rva2VuWzBdfWA7XG5pZihiYWRQYWlyUGF0dGVybi50ZXN0KHBhaXIpKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbiB9XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSYmc3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXT09PScsJyl7XG5zdHJpbmdzLnBvcCgpO1xuIH1cbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+c3RyaW5ncy5qb2luKCcnKX0pO1xuXG4gfTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuPS9eW2EtekEtWl1cXHcqJC87XG5oYXJkZW4oaWRlbnRQYXR0ZXJuKTtcbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuPS9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGRJbmRlbnRcbiAqIEBwYXJhbSB7YW55W119IFtzbG90c11cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZVRvSnVzdGluPShlbmNvZGluZyxzaG91bGRJbmRlbnQ9ZmFsc2Usc2xvdHM9W10pPT57XG4vKipcbiAqIFRoZSBmaXJzdCBwYXNzIGRvZXMgc29tZSBpbnB1dCB2YWxpZGF0aW9uLlxuICogSXRzIGNvbnRyb2wgZmxvdyBzaG91bGQgbWlycm9yIGByZWN1cmAgYXMgY2xvc2VseSBhcyBwb3NzaWJsZVxuICogYW5kIHRoZSB0d28gc2hvdWxkIGJlIG1haW50YWluZWQgdG9nZXRoZXIuIFRoZXkgbXVzdCB2aXNpdCBldmVyeXRoaW5nXG4gKiBpbiB0aGUgc2FtZSBvcmRlci5cbiAqXG4gKiBUT0RPIG5vdyB0aGF0IGliaWRzIGFyZSBnb25lLCB3ZSBzaG91bGQgZm9sZCB0aGlzIGJhY2sgdG9nZXRoZXIgaW50b1xuICogb25lIHZhbGlkYXRpbmcgcGFzcy5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgcHJlcGFyZT0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG5yZXR1cm47XG4gfVxuLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG5hc3NlcnQudHlwZW9mKHJhd1RyZWUsJ29iamVjdCcpO1xuYXNzZXJ0KHJhd1RyZWUhPT1udWxsKTtcbmlmKFFDTEFTUyBpbiByYXdUcmVlKXtcbmNvbnN0IHFjbGFzcz1yYXdUcmVlW1FDTEFTU107XG50eXBlb2YgcWNsYXNzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBxY2xhc3MgdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdOYU4nOlxuY2FzZSdJbmZpbml0eSc6XG5jYXNlJy1JbmZpbml0eSc6e1xucmV0dXJuO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG50eXBlb2YgZGlnaXRzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xucmV0dXJuO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG5yZXR1cm47XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbnJldHVybjtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKHRhZywnc3RyaW5nJyk7XG5wcmVwYXJlKHBheWxvYWQpO1xucmV0dXJuO1xuIH1cbmNhc2Unc2xvdCc6e1xuY29uc3R7aW5kZXgsaWZhY2V9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKGluZGV4LCdudW1iZXInKTtcbk5hdChpbmRleCk7XG5pZihpZmFjZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKGlmYWNlLCdzdHJpbmcnKTtcbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1yYXdUcmVlO1xuJ29yaWdpbmFsJ2luIHJhd1RyZWV8fFxuRmFpbCBgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7cmF3VHJlZX1gO1xucHJlcGFyZShvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmlmKHR5cGVvZiByZXN0IT09J29iamVjdCcpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0YDtcbiB9XG5pZihyZXN0PT09bnVsbCl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbGA7XG4gfVxuaWYoaXNBcnJheShyZXN0KSl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgYW4gYXJyYXlgO1xuIH1cbmlmKFFDTEFTUyBpbiByZXN0KXtcbnRocm93IEZhaWwgYFJlc3QgZW5jb2RpbmcgJHtyZXN0fSBtdXN0IG5vdCBjb250YWluICR7cShRQ0xBU1MpfWA7XG4gfVxuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG5wcmVwYXJlKHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgbmFtZSl9YDtcbmdldEVycm9yQ29uc3RydWN0b3IobmFtZSkhPT11bmRlZmluZWR8fFxuRmFpbCBgTXVzdCBiZSB0aGUgbmFtZSBvZiBhbiBFcnJvciBjb25zdHJ1Y3RvciAke25hbWV9YDtcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWA7XG5yZXR1cm47XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xucHJlcGFyZShyYXdUcmVlW2ldKTtcbiB9XG4gfWVsc2V7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJhd1RyZWUpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiB9XG5wcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuIH1cbiB9XG4gfTtcblxuY29uc3QgbWFrZUluZGVudGVyPXNob3VsZEluZGVudD9tYWtlWWVzSW5kZW50ZXI6bWFrZU5vSW5kZW50ZXI7XG5sZXQgb3V0PW1ha2VJbmRlbnRlcigpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIHJlY3Vyc2lvbiBhZnRlciB0aGUgZmlyc3QgcGFzcyBgcHJlcGFyZWAuXG4gKiBUaGUgZmlyc3QgcGFzcyBkaWQgc29tZSBpbnB1dCB2YWxpZGF0aW9uIHNvXG4gKiBoZXJlIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGV2ZXJ5dGhpbmcgdGhvc2UgdGhpbmdzIGFyZSB2YWxpZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlPShyYXdUcmVlKT0+e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiByZWN1cihyYXdUcmVlKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVQcm9wZXJ0eT0obmFtZSx2YWx1ZSk9Pntcbm91dC5saW5lKCk7XG5pZihuYW1lPT09J19fcHJvdG9fXycpe1xuLyogSmF2YVNjcmlwdCBpbnRlcnByZXRzIGB7X19wcm90b19fOiB4LCAuLi59YCovXG4vKiBhcyBtYWtpbmcgYW4gb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgeGAsIHdoZXJlYXMqL1xuLyogaW4gSlNPTiBpdCBpcyBzaW1wbHkgYSBwcm9wZXJ0eSBuYW1lLiBQcmVzZXJ2ZSB0aGUqL1xuLyogSlNPTiBtZWFuaW5nLiovXG5vdXQubmV4dCggYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiB9ZWxzZSBpZihpZGVudFBhdHRlcm4udGVzdChuYW1lKSl7XG5vdXQubmV4dCggYCR7bmFtZX06YCk7XG4gfWVsc2V7XG5vdXQubmV4dCggYCR7cXVvdGUobmFtZSl9OmApO1xuIH1cbmRlY29kZSh2YWx1ZSk7XG5vdXQubmV4dCgnLCcpO1xuIH07XG5cbi8qKlxuICogTW9kZWxlZCBhZnRlciBgZnVsbFJldml2ZWAgaW4gbWFyc2hhbC5qc1xuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJlY3VyPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbi8qIHByaW1pdGl2ZXMgZ2V0IHF1b3RlZCovXG5yZXR1cm4gb3V0Lm5leHQocXVvdGUocmF3VHJlZSkpO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihxY2xhc3MsJ3N0cmluZycpO1xuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbi8qIFN3aXRjaGluZyBvbiBgZW5jb2RlZFtRQ0xBU1NdYCAob3IgYW55dGhpbmcgbGVzcyBkaXJlY3QsIGxpa2UqL1xuLyogYHFjbGFzc2ApIGRvZXMgbm90IGRpc2NyaW1pbmF0ZSByYXdUcmVlIGluIHR5cGVzY3JpcHRANC4yLjMgYW5kKi9cbi8qIGVhcmxpZXIuKi9cbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbi8qIFRoZWlyIHFjbGFzcyBpcyB0aGVpciBleHByZXNzaW9uIHNvdXJjZS4qL1xucmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoZGlnaXRzLCdzdHJpbmcnKTtcbnJldHVybiBvdXQubmV4dCggYCR7QmlnSW50KGRpZ2l0cyl9bmApO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBUT0RPIGRlcHJlY2F0ZWQuIEV2ZW50dWFsbHkgcmVtb3ZlLiovXG5yZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbmNvbnN0IHJlZ2lzdGVyZWROYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKHJlZ2lzdGVyZWROYW1lPT09dW5kZWZpbmVkKXtcbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5hc3NlcnQobWF0Y2ghPT1udWxsKTtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmFzc2VydChTeW1ib2xbc3VmZml4XT09PXN5bSk7XG5hc3NlcnQoaWRlbnRQYXR0ZXJuLnRlc3Qoc3VmZml4KSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gfVxucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLmZvcigke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xub3V0Lm5leHQoIGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX0sYCk7XG5kZWNvZGUocGF5bG9hZCk7XG5yZXR1cm4gb3V0Lm5leHQoJyknKTtcbiB9XG5cbmNhc2Unc2xvdCc6e1xubGV0e2lmYWNlfT1yYXdUcmVlO1xuY29uc3QgaW5kZXg9TnVtYmVyKE5hdChyYXdUcmVlLmluZGV4KSk7XG5jb25zdCBuZXN0ZWRSZW5kZXI9KGFyZyk9PntcbmNvbnN0IG9sZE91dD1vdXQ7XG50cnl7XG5vdXQ9bWFrZU5vSW5kZW50ZXIoKTtcbmRlY29kZShhcmcpO1xucmV0dXJuIG91dC5kb25lKCk7XG4gfWZpbmFsbHl7XG5vdXQ9b2xkT3V0O1xuIH1cbiB9O1xuaWYoaW5kZXg8c2xvdHMubGVuZ3RoKXtcbmNvbnN0IHNsb3Q9bmVzdGVkUmVuZGVyKHNsb3RzW2luZGV4XSk7XG5pZihpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90VG9WYWwoJHtzbG90fSlgKTtcbiB9XG5pZmFjZT1uZXN0ZWRSZW5kZXIoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdFRvVmFsKCR7c2xvdH0sJHtpZmFjZX0pYCk7XG4gfWVsc2UgaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSlgKTtcbiB9XG5pZmFjZT1uZXN0ZWRSZW5kZXIoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSwke2lmYWNlfSlgKTtcbiB9XG5cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbm91dC5vcGVuKCd7Jyk7XG5kZWNvZGVQcm9wZXJ0eShRQ0xBU1Msb3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5hc3NlcnQudHlwZW9mKHJlc3QsJ29iamVjdCcpO1xuYXNzZXJ0KHJlc3QhPT1udWxsKTtcbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYFByb3BlcnR5IG5hbWUgJHtxKFxubmFtZSlcbiB9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gfVxuZGVjb2RlUHJvcGVydHkobmFtZSxyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cblxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xucmV0dXJuIG91dC5uZXh0KCBgJHtuYW1lfSgke3F1b3RlKG1lc3NhZ2UpfSlgKTtcbiB9XG5cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuaWYobGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gfWVsc2V7XG5vdXQub3BlbignWycpO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5vdXQubGluZSgpO1xuZGVjb2RlKHJhd1RyZWVbaV0pO1xub3V0Lm5leHQoJywnKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gfVxuIH1lbHNle1xuLyogcmF3VHJlZSBpcyBhbiBgRW5jb2RpbmdSZWNvcmRgIHdoaWNoIG9ubHkgaGFzIHN0cmluZyBrZXlzLCovXG4vKiBidXQgc2luY2Ugb3duS2V5cyBpcyBub3QgZ2VuZXJpYywgaXQgY2FuJ3QgcHJvcGFnYXRlIHRoYXQqL1xuY29uc3QgbmFtZXM9LyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJhd1RyZWUpO1xuaWYobmFtZXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ3t9Jyk7XG4gfWVsc2V7XG5vdXQub3BlbigneycpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuZGVjb2RlUHJvcGVydHkobmFtZSxyYXdUcmVlW25hbWVdKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuIH1cbiB9O1xucHJlcGFyZShlbmNvZGluZyk7XG5kZWNvZGUoZW5jb2RpbmcpO1xucmV0dXJuIG91dC5kb25lKCk7XG4gfTskaOKAjV9vbmNlLmRlY29kZVRvSnVzdGluKGRlY29kZVRvSnVzdGluKTtcbmhhcmRlbihkZWNvZGVUb0p1c3Rpbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAE9PVG9wGAADcBgAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc3siaW1wb3J0cyI6WyIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJwYXJzZSIsInN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlTWFyc2hhbDskaOKAjV9pbXBvcnRzKFtbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9hID0+IChtYWtlTWFyc2hhbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90PSh2YWwpPT5cbkZhaWwgYE1hcnNoYWwncyBzdHJpbmdpZnkgcmVqZWN0cyBwcmVzZW5jZXMgYW5kIHByb21pc2VzICR7dmFsfWA7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFNsb3RUb1ZhbD0oc2xvdCxfaWZhY2UpPT5cbkZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXI9aGFyZGVuKHtcbmdldDooX3RhcmdldCxuYW1lLF9yZWNlaXZlcik9PntcbmlmKG5hbWU9PT0nbGVuZ3RoJyl7XG5yZXR1cm4gMDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90IHBvc2l0aW9ucyAke25hbWV9YDtcbiB9fSk7XG5cblxuY29uc3QgYmFkQXJyYXk9aGFyZGVuKG5ldyBQcm94eShoYXJkZW4oW10pLGJhZEFycmF5SGFuZGxlcikpO1xuXG5jb25zdHtzZXJpYWxpemUsdW5zZXJpYWxpemV9PW1ha2VNYXJzaGFsKFxuZG9Ob3RDb252ZXJ0VmFsVG9TbG90LFxuZG9Ob3RDb252ZXJ0U2xvdFRvVmFsLFxue1xuZXJyb3JUYWdnaW5nOidvZmYnLFxuLyogVE9ETyBmaXggdGVzdHMgdG8gd29ya3Mgd2l0aCBzbWFsbGNhcHMuKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J2NhcGRhdGEnfSk7XG5cblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc3RyaW5naWZ5PSh2YWwpPT5zZXJpYWxpemUodmFsKS5ib2R5OyRo4oCNX29uY2Uuc3RyaW5naWZ5KHN0cmluZ2lmeSk7XG5oYXJkZW4oc3RyaW5naWZ5KTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IHBhcnNlPShzdHIpPT5cbnVuc2VyaWFsaXplKFxuaGFyZGVuKHtcbmJvZHk6c3RyLFxuc2xvdHM6YmFkQXJyYXl9KSk7JGjigI1fb25jZS5wYXJzZShwYXJzZSk7XG5cblxuaGFyZGVuKHBhcnNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdpZnkiOlsic3RyaW5naWZ5Il0sInBhcnNlIjpbInBhcnNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAL6eaUrsMgAA7DIAACMAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvbWFyc2hhbC5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vZW5jb2RlVG9TbWFsbGNhcHMuanMiLCJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LGFzc2VydFBhc3NhYmxlLGdldEludGVyZmFjZU9mLGdldEVycm9yQ29uc3RydWN0b3IsaGFzT3duUHJvcGVydHlPZixRQ0xBU1MsbWFrZUVuY29kZVRvQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbUNhcERhdGEsbWFrZURlY29kZUZyb21TbWFsbGNhcHMsbWFrZUVuY29kZVRvU21hbGxjYXBzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjigI1fYSldXSxbXCJtYWtlRGVjb2RlRnJvbUNhcERhdGFcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLk1ha2VNYXJzaGFsT3B0aW9uc30gTWFrZU1hcnNoYWxPcHRpb25zICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPFNsb3Q+fSBDb252ZXJ0U2xvdFRvVmFsICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBDb252ZXJ0VmFsVG9TbG90ICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Ub0NhcERhdGE8U2xvdD59IFRvQ2FwRGF0YSAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRnJvbUNhcERhdGE8U2xvdD59IEZyb21DYXBEYXRhICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cblxuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGUge0NvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbj0oeCk9Png7XG4vKiogQHR5cGUge0NvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbj0oeCxfKT0+eDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgU2xvdFxuICogQHBhcmFtIHtDb252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBbY29udmVydFZhbFRvU2xvdF1cbiAqIEBwYXJhbSB7Q29udmVydFNsb3RUb1ZhbDxTbG90Pn0gW2NvbnZlcnRTbG90VG9WYWxdXG4gKiBAcGFyYW0ge01ha2VNYXJzaGFsT3B0aW9uc30gb3B0aW9uc1xuICovXG5jb25zdCAgICAgICAgbWFrZU1hcnNoYWw9KFxuY29udmVydFZhbFRvU2xvdD1kZWZhdWx0VmFsVG9TbG90Rm4sXG5jb252ZXJ0U2xvdFRvVmFsPWRlZmF1bHRTbG90VG9WYWxGbixcbntcbmVycm9yVGFnZ2luZz0nb24nLFxubWFyc2hhbE5hbWU9J2Fub24tbWFyc2hhbCcsXG4vKiBUT0RPIFRlbXBvcmFyeSBoYWNrLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yNzgwKi9cbmVycm9ySWROdW09MTAwMDAsXG4vKiBXZSBwcmVmZXIgdGhhdCB0aGUgY2FsbGVyIGluc3RlYWQgbG9nIHRvIHNvbWV3aGVyZSBoaWRkZW4qL1xuLyogdG8gYmUgcmV2ZWFsZWQgd2hlbiBjb3JyZWxhdGluZyB3aXRoIHRoZSByZWNlaXZlZCBlcnJvci4qL1xubWFyc2hhbFNhdmVFcnJvcj0oZXJyKT0+XG5jb25zb2xlLmxvZygnVGVtcG9yYXJ5IGxvZ2dpbmcgb2Ygc2VudCBlcnJvcicsZXJyKSxcbi8qIERlZmF1bHQgdG8gJ2NhcGRhdGEnIGJlY2F1c2UgaXQgd2FzIGltcGxlbWVudGVkIGZpcnN0LiovXG4vKiBTb21ldGltZXMsIG9udG9nZW55IGRvZXMgcmVjYXBpdHVsYXRlIHBoeWxvZ2VueSA7KSovXG5zZXJpYWxpemVCb2R5Rm9ybWF0PSdjYXBkYXRhJ309XG57fSk9Plxue1xuYXNzZXJ0LnR5cGVvZihtYXJzaGFsTmFtZSwnc3RyaW5nJyk7XG5lcnJvclRhZ2dpbmc9PT0nb24nfHxcbmVycm9yVGFnZ2luZz09PSdvZmYnfHxcbkZhaWwgYFRoZSBlcnJvclRhZ2dpbmcgb3B0aW9uIGNhbiBvbmx5IGJlIFwib25cIiBvciBcIm9mZlwiICR7ZXJyb3JUYWdnaW5nfWA7XG5jb25zdCBuZXh0RXJyb3JJZD0oKT0+e1xuZXJyb3JJZE51bSs9MTtcbnJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7VG9DYXBEYXRhPFNsb3Q+fVxuICovXG5jb25zdCB0b0NhcERhdGE9KHJvb3QpPT57XG5jb25zdCBzbG90cz1bXTtcbi8qIG1hcHMgdmFsIChwcm9taXNlIG9yIHJlbW90YWJsZSkgdG8gaW5kZXggb2Ygc2xvdHNbXSovXG5jb25zdCBzbG90TWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZSB8IFByb21pc2V9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7e2luZGV4OiBudW1iZXIsIHJlcGVhdDogYm9vbGVhbn19XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RDb21tb249KHBhc3NhYmxlKT0+e1xubGV0IGluZGV4PXNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbmlmKGluZGV4IT09dW5kZWZpbmVkKXtcbi8qIFRPRE8gYXNzZXJ0IHRoYXQgaXQncyB0aGUgc2FtZSBpZmFjZSBhcyBiZWZvcmUqL1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6dHJ1ZX0pO1xuIH1cblxuaW5kZXg9c2xvdHMubGVuZ3RoO1xuY29uc3Qgc2xvdD1jb252ZXJ0VmFsVG9TbG90KHBhc3NhYmxlKTtcbnNsb3RzLnB1c2goc2xvdCk7XG5zbG90TWFwLnNldChwYXNzYWJsZSxpbmRleCk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6ZmFsc2V9KTtcbiB9O1xuXG4vKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIGlzRXJyb3JMaWtlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHVua25vd259IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX1cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JDb21tb249KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IG1lc3NhZ2U9ZW5jb2RlUmVjdXIoIGAke2Vyci5tZXNzYWdlfWApO1xuYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCdzdHJpbmcnKTtcbmNvbnN0IG5hbWU9ZW5jb2RlUmVjdXIoIGAke2Vyci5uYW1lfWApO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbi8qIE11c3QgZW5jb2RlIGBjYXVzZWAsIGBlcnJvcnNgLiovXG4vKiBuZXN0ZWQgbm9uLXBhc3NhYmxlIGVycm9ycyBtdXN0IGJlIG9rIGZyb20gaGVyZS4qL1xuaWYoZXJyb3JUYWdnaW5nPT09J29uJyl7XG4vKiBXZSBkZWxpYmVyYXRlbHkgZG8gbm90IHNoYXJlIHRoZSBzdGFjaywgYnV0IGl0IHdvdWxkKi9cbi8qIGJlIHVzZWZ1bCB0byBsb2cgdGhlIHN0YWNrIGxvY2FsbHkgc28gc29tZW9uZSB3aG8gaGFzKi9cbi8qIHByaXZpbGVnZWQgYWNjZXNzIHRvIHRoZSB0aHJvd2luZyBWYXQgY2FuIGNvcnJlbGF0ZSovXG4vKiB0aGUgcHJvYmxlbSB3aXRoIHRoZSByZW1vdGUgVmF0IHRoYXQgZ2V0cyB0aGlzKi9cbi8qIHN1bW1hcnkuIElmIHdlIGRvIHRoYXQsIHdlIGNvdWxkIGFsbG9jYXRlIHNvbWUgcmFuZG9tKi9cbi8qIGlkZW50aWZpZXIgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIG1lc3NhZ2UsIHRvIGhlbHAqL1xuLyogd2l0aCB0aGUgY29ycmVsYXRpb24uKi9cbmNvbnN0IGVycm9ySWQ9ZW5jb2RlUmVjdXIobmV4dEVycm9ySWQoKSk7XG5hc3NlcnQudHlwZW9mKGVycm9ySWQsJ3N0cmluZycpO1xuYXNzZXJ0Lm5vdGUoZXJyLFggYFNlbnQgYXMgJHtlcnJvcklkfWApO1xubWFyc2hhbFNhdmVFcnJvcihlcnIpO1xucmV0dXJuIGhhcmRlbih7ZXJyb3JJZCxtZXNzYWdlLG5hbWV9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe21lc3NhZ2UsbmFtZX0pO1xuIH1cbiB9O1xuXG5pZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J2NhcGRhdGEnKXtcbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9DYXBEYXRhPShwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaW5kZXh9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidzbG90JyxpZmFjZSxpbmRleH0pO1xuIH1cbiB9O1xuXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHZhbCxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEodmFsLGdldEludGVyZmFjZU9mKHZhbCkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YShwcm9taXNlKTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ30gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidlcnJvcicsLi4uZXJyRGF0YX0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT1tYWtlRW5jb2RlVG9DYXBEYXRhKHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9DYXBEYXRhKHJvb3QpO1xuY29uc3QgYm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuYm9keSxcbnNsb3RzfSk7XG5cbiB9ZWxzZSBpZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J3NtYWxsY2Fwcycpe1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9TbWFsbGNhcHM9KHByZWZpeCxwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4vKiBUT0RPIGV4cGxvcmUgcmVtb3ZpbmcgdGhpcyBzcGVjaWFsIGNhc2UqL1xuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gfVxucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbW90YWJsZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcscmVtb3RhYmxlLGdldEludGVyZmFjZU9mKHJlbW90YWJsZSkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyYnLHByb21pc2UpO1xuXG5jb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5jb25zdHttZXNzYWdlLC4uLnJlc3R9PWVyckRhdGE7XG5yZXR1cm4gaGFyZGVuKHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3R9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz1tYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbi8qIFZhbGlkIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYSB2YWxpZCBzaWduYWwqL1xuLyogaW5kaWNhdGluZyBzbWFsbGNhcHMgZm9ybWF0LiovXG5ib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuc2xvdHN9KTtcblxuIH1lbHNle1xuLyogVGhlIGB0aHJvd2AgaXMgYSBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEFkZGVkIGZvciBjb25mdXNlZCBsaW50ZXJzLiovXG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VGdWxsUmV2aXZlPShzbG90cyk9Pntcbi8qKiBAdHlwZSB7TWFwPG51bWJlciwgUGFzc2FibGU+fSAqL1xuY29uc3QgdmFsTWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge3tpZmFjZT86IHN0cmluZywgaW5kZXg6IG51bWJlcn19IHNsb3REYXRhXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlIHwgUHJvbWlzZX1cbiAqL1xuY29uc3QgZGVjb2RlU2xvdENvbW1vbj0oc2xvdERhdGEpPT57XG5jb25zdHtpZmFjZT11bmRlZmluZWQsaW5kZXgsLi4ucmVzdH09c2xvdERhdGE7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIHNsb3QgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbmlmKHZhbE1hcC5oYXMoaW5kZXgpKXtcbnJldHVybiB2YWxNYXAuZ2V0KGluZGV4KTtcbiB9XG4vKiBUT0RPIFNFQ1VSSVRZIEhBWkFSRDogbXVzdCBlbmZvY2UgdGhhdCByZW1vdGFibGUgdnMgcHJvbWlzZSovXG4vKiBpcyBhY2NvcmRpbmcgdG8gdGhlIGVuY29kZWQgc3RyaW5nLiovXG5jb25zdCBzbG90PXNsb3RzW051bWJlcihOYXQoaW5kZXgpKV07XG5jb25zdCB2YWw9Y29udmVydFNsb3RUb1ZhbChzbG90LGlmYWNlKTtcbnZhbE1hcC5zZXQoaW5kZXgsdmFsKTtcbnJldHVybiB2YWw7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319IGVyckRhdGFcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBkZWNvZGVSZWN1clxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5jb25zdCBkZWNvZGVFcnJvckNvbW1vbj0oZXJyRGF0YSxkZWNvZGVSZWN1cik9PntcbmNvbnN0e2Vycm9ySWQ9dW5kZWZpbmVkLG1lc3NhZ2UsbmFtZSwuLi5yZXN0fT1lcnJEYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuLyogVE9ETyBNdXN0IGRlY29kZSBgY2F1c2VgIGFuZCBgZXJyb3JzYCBwcm9wZXJ0aWVzKi9cbi8qIGNhcERhdGEgZG9lcyBub3QgdHJhbnNmb3JtIHN0cmluZ3MuIFRoZSBjYWxscyB0byBgZGVjb2RlUmVjdXJgKi9cbi8qIGFyZSBmb3IgcmV1c2UgYnkgb3RoZXIgZW5jb2RpbmdzIHRoYXQgZG8sIHN1Y2ggYXMgc21hbGxjYXBzLiovXG5jb25zdCBkTmFtZT1kZWNvZGVSZWN1cihuYW1lKTtcbmNvbnN0IGRNZXNzYWdlPWRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuY29uc3QgZEVycm9ySWQ9ZXJyb3JJZCYmZGVjb2RlUmVjdXIoZXJyb3JJZCk7XG50eXBlb2YgZE5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG50eXBlb2YgZE1lc3NhZ2U9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgZE1lc3NhZ2UpfWA7XG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKGROYW1lKXx8RXJyb3I7XG4vKiBlcnJvcklkIGlzIGEgbGF0ZSBhZGRpdGlvbiBzbyBiZSB0b2xlcmFudCBvZiBpdHMgYWJzZW5jZS4qL1xuY29uc3QgZXJyb3JOYW1lPVxuZEVycm9ySWQ9PT11bmRlZmluZWQ/XG4gYFJlbW90ZSR7RUMubmFtZX1gOlxuIGBSZW1vdGUke0VDLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG5jb25zdCBlcnJvcj1hc3NlcnQuZXJyb3IoZE1lc3NhZ2UsRUMse2Vycm9yTmFtZX0pO1xucmV0dXJuIGhhcmRlbihlcnJvcik7XG4gfTtcblxuLyogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaCovXG4vKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb24qL1xuLyogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUqL1xuLyogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNCovXG5jb25zdCBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0ocmF3VHJlZSxfZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLnNsb3REYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oc2xvdERhdGEpO1xuIH07XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbUNhcERhdGE9KHJhd1RyZWUsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLmVyckRhdGF9PXJhd1RyZWU7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oZXJyRGF0YSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbUNhcERhdGE9bWFrZURlY29kZUZyb21DYXBEYXRhKHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2Fwcz0ocHJlZml4KT0+e1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nRW5jb2RpbmdcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBfZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtSZW1vdGFibGUgfCBQcm9taXNlfVxuICovXG5yZXR1cm4oc3RyaW5nRW5jb2RpbmcsX2RlY29kZVJlY3VyKT0+e1xuYXNzZXJ0KHN0cmluZ0VuY29kaW5nLnN0YXJ0c1dpdGgocHJlZml4KSk7XG4vKiBzbG90czogJHNsb3RJbmRleC5pZmFjZSBvciAkc2xvdEluZGV4Ki9cbmNvbnN0IGk9c3RyaW5nRW5jb2RpbmcuaW5kZXhPZignLicpO1xuY29uc3QgaW5kZXg9TnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsaTwwP3VuZGVmaW5lZDppKSk7XG4vKiBpIDwgMCBtZWFucyB0aGVyZSB3YXMgbm8gaWZhY2UgaW5jbHVkZWQuKi9cbmNvbnN0IGlmYWNlPWk8MD91bmRlZmluZWQ6c3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSsxKTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHtpZmFjZSxpbmRleH0pO1xuIH07XG4gfTtcbmNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG5jb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyxkZWNvZGVSZWN1cik9PntcbmNvbnN0eycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdEVyckRhdGF9PWVuY29kaW5nO1xuIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsJ21lc3NhZ2UnKXx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX0sZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZUZyb21TbWFsbGNhcHMoe1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc30pO1xuIH07XG5cbi8qKlxuICogQHR5cGUge0Zyb21DYXBEYXRhPFNsb3Q+fVxuICovXG5jb25zdCBmcm9tQ2FwRGF0YT0oZGF0YSk9PntcbmNvbnN0e2JvZHksc2xvdHN9PWRhdGE7XG50eXBlb2YgYm9keT09PSdzdHJpbmcnfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5ib2R5IGlzICR7Ym9keX0sIG5vdCBzdHJpbmcpYDtcbmlzQXJyYXkoZGF0YS5zbG90cyl8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbmNvbnN0e3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9PW1ha2VGdWxsUmV2aXZlKHNsb3RzKTtcbmxldCByZXN1bHQ7XG4vKiBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGFuIHVuYW1iaWd1b3VzIHNpZ25hbC4qL1xuaWYoYm9keS5zdGFydHNXaXRoKCcjJykpe1xuY29uc3Qgc21hbGxjYXBzQm9keT1ib2R5LnNsaWNlKDEpO1xuY29uc3QgZW5jb2Rpbmc9aGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tU21hbGxjYXBzKGVuY29kaW5nKSk7XG4gfWVsc2V7XG5jb25zdCByYXdUcmVlPWhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbUNhcERhdGEocmF3VHJlZSkpO1xuIH1cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzcqL1xuLyogd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZml4ZWQgb25jZSB3ZSd2ZSBjb21wbGV0ZWQgdGhlIHN3aXRjaCovXG4vKiB0byBzbWFsbGNhcHMuKi9cbmFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbnJldHVybiBoYXJkZW4oe1xudG9DYXBEYXRhLFxuZnJvbUNhcERhdGEsXG5cbi8qIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSovXG4vKiogQGRlcHJlY2F0ZWQgdXNlIHRvQ2FwRGF0YSAqL1xuc2VyaWFsaXplOnRvQ2FwRGF0YSxcbi8qKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUNhcERhdGEgKi9cbnVuc2VyaWFsaXplOmZyb21DYXBEYXRhfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZU1hcnNoYWwobWFrZU1hcnNoYWwpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFdEZAp+QAAAfkAAACUAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlUGFzc2FibGUuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdldFRhZyxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc1N0eWxlUHJlZml4ZXMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmFua0NvdmVyfSBSYW5rQ292ZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb21wYXJpc29ufSBSYW5rQ29tcGFyaXNvbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzLHNldFByb3RvdHlwZU9mLGlzfT1PYmplY3Q7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmFua0NvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGdWxsQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbbnVtYmVyLCBudW1iZXJdfSBJbmRleENvdmVyXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uIHVzZWQgYnkgSmF2YVNjcmlwdCdzIE1hcCBhbmQgU2V0XG4gKiBhYnN0cmFjdGlvbnMsIHdoZXJlIE5hTiBpcyB0aGUgc2FtZSBhcyBOYU4gYW5kIC0wIGlzIHRoZSBzYW1lIGFzXG4gKiAwLiBNYXJzaGFsIHNlcmlhbGl6ZXMgLTAgYXMgemVybywgc28gdGhlIHNlbWFudGljcyBvZiBvdXIgZGlzdHJpYnV0ZWRcbiAqIG9iamVjdCBzeXN0ZW0gZG9lcyBub3QgZGlzdGluZ3Vpc2ggMCBmcm9tIC0wLlxuICpcbiAqIGBzYW1lVmFsdWVaZXJvYCBpcyB0aGUgRWNtYVNjcmlwdCBzcGVjIG5hbWUgZm9yIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbixcbiAqIGJ1dCBUT0RPIHdlIG5lZWQgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIEFQSS5cbiAqXG4gKiBAcGFyYW0ge2FueX0geFxuICogQHBhcmFtIHthbnl9IHlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvPSh4LHkpPT54PT09eXx8aXMoeCx5KTtcblxuY29uc3QgdHJpdmlhbENvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSwgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG5sZWZ0PHJpZ2h0Py0xOmxlZnQ9PT1yaWdodD8wOjE7XG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxQYXNzU3R5bGUsIHsgaW5kZXg6IG51bWJlciwgY292ZXI6IFJhbmtDb3ZlciB9Pn0gUGFzc1N0eWxlUmFua3NSZWNvcmRcbiAqL1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcz0vKiogQHR5cGUge1Bhc3NTdHlsZVJhbmtzUmVjb3JkfSAqL1xuZnJvbUVudHJpZXMoXG5lbnRyaWVzKHBhc3NTdHlsZVByZWZpeGVzKVxuLyogU29ydCBlbnRyaWVzIGJ5IGFzY2VuZGluZyBwcmVmaXguKi8uXG5zb3J0KChbX2xlZnRTdHlsZSxsZWZ0UHJlZml4ZXNdLFtfcmlnaHRTdHlsZSxyaWdodFByZWZpeGVzXSk9PntcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0UHJlZml4ZXMscmlnaHRQcmVmaXhlcyk7XG4gfSkuXG5tYXAoKFtwYXNzU3R5bGUscHJlZml4ZXNdLGluZGV4KT0+e1xuLyogQ292ZXIgYWxsIHN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGFueSBjaGFyYWN0ZXIgaW4gYHByZWZpeGVzYCwqL1xuLyogdmVyaWZ5aW5nIHRoYXQgaXQgaXMgc29ydGVkIHNvIHRoYXQgaXMqL1xuLyogYWxsIHMgc3VjaCB0aGF0IHByZWZpeGVzLmF0KDApIOKJpCBzIDwgc3VjY2Vzc29yKHByZWZpeGVzLmF0KC0xKSkuKi9cbnByZWZpeGVzPT09Wy4uLnByZWZpeGVzXS5zb3J0KCkuam9pbignJyl8fFxuRmFpbCBgdW5zb3J0ZWQgcHJlZml4ZXMgZm9yIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7cShwcmVmaXhlcyl9YDtcbmNvbnN0IGNvdmVyPVtcbnByZWZpeGVzLmNoYXJBdCgwKSxcblN0cmluZy5mcm9tQ2hhckNvZGUocHJlZml4ZXMuY2hhckNvZGVBdChwcmVmaXhlcy5sZW5ndGgtMSkrMSldO1xuXG5yZXR1cm5bcGFzc1N0eWxlLHtpbmRleCxjb3Zlcn1dO1xuIH0pKTtcblxuXG5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVSYW5rcyxudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qKlxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKlxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldFBhc3NTdHlsZUNvdmVyPShwYXNzU3R5bGUpPT5wYXNzU3R5bGVSYW5rc1twYXNzU3R5bGVdLmNvdmVyOyRo4oCNX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxXZWFrU2V0PFBhc3NhYmxlW10+Pn1cbiAqL1xuY29uc3QgbWVtb09mU29ydGVkPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsUmFua0NvbXBhcmU+fVxuICovXG5jb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZT19IGNvbXBhcmVSZW1vdGFibGVzXG4gKiBBbiBvcHRpb24gdG8gY3JlYXRlIGEgY29tcGFyYXRvciBpbiB3aGljaCBhbiBpbnRlcm5hbCBvcmRlciBpc1xuICogYXNzaWduZWQgdG8gcmVtb3RhYmxlcy4gVGhpcyBkZWZhdWx0cyB0byBhIGNvbXBhcmF0b3IgdGhhdFxuICogYWx3YXlzIHJldHVybnMgYDBgLCBtZWFuaW5nIHRoYXQgYWxsIHJlbW90YWJsZXMgYXJlIHRpZWRcbiAqIGZvciB0aGUgc2FtZSByYW5rLlxuICogQHJldHVybnMge1JhbmtDb21wYXJhdG9yS2l0fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvbXBhcmF0b3JLaXQ9KGNvbXBhcmVSZW1vdGFibGVzPShfeCxfeSk9PjApPT57XG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgY29tcGFyYXRvcj0obGVmdCxyaWdodCk9PntcbmlmKHNhbWVWYWx1ZVplcm8obGVmdCxyaWdodCkpe1xucmV0dXJuIDA7XG4gfVxuY29uc3QgbGVmdFN0eWxlPXBhc3NTdHlsZU9mKGxlZnQpO1xuY29uc3QgcmlnaHRTdHlsZT1wYXNzU3R5bGVPZihyaWdodCk7XG5pZihsZWZ0U3R5bGUhPT1yaWdodFN0eWxlKXtcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihcbnBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG5wYXNzU3R5bGVSYW5rc1tyaWdodFN0eWxlXS5pbmRleCk7XG5cbiB9XG4vKiBlc2xpbnQtZGlzYWJsZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzIC0tXG4gKiBXZSBrbm93IGBsZWZ0YCBhbmQgYHJpZ2h0YCBhcmUgY29tcGFyYWJsZS5cbiAqL1xuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xuLyogRm9yIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgYWxsIG1lbWJlcnMgb2YgdGhhdCBwYXNzU3R5bGUgYXJlIHRpZWQqL1xuLyogZm9yIHRoZSBzYW1lIHJhbmsuKi9cbnJldHVybiAwO1xuIH1cbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6e1xuLyogV2l0aGluIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgdGhlIHJhbmsgb3JkZXJpbmcgYWdyZWVzIHdpdGgqL1xuLyogSmF2YVNjcmlwdCdzIHJlbGF0aW9uYWwgb3BlcmF0b3JzIGA8YCBhbmQgYD5gLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gY29tcGFyYXRvcihcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCkpO1xuXG4gfVxuY2FzZSdudW1iZXInOntcbi8qIGBOYU5gJ3MgcmFuayBpcyBhZnRlciBhbGwgb3RoZXIgbnVtYmVycy4qL1xuaWYoTnVtYmVyLmlzTmFOKGxlZnQpKXtcbmFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbnJldHVybi0xO1xuIH1cbi8qIFRoZSByYW5rIG9yZGVyaW5nIG9mIG5vbi1OYU4gbnVtYmVycyBhZ3JlZXMgd2l0aCBKYXZhU2NyaXB0J3MqL1xuLyogcmVsYXRpb25hbCBvcGVyYXRvcnMgJzwnIGFuZCAnPicuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGludmVyc2Ugc29ydGVkIG9yZGVyIG9mIHByb3BlcnR5IG5hbWVzLCB0aGVuKi9cbi8qIGxleGljb2dyYXBoaWMgYnkgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhhdCBzYW1lIGludmVyc2UqL1xuLyogb3JkZXIgb2YgdGhlaXIgcHJvcGVydHkgbmFtZXMuIENvbXBhcmluZyBuYW1lcyBieSB0aGVtc2VsdmVzIGZpcnN0LCovXG4vKiBhbGwgcmVjb3JkcyB3aXRoIHRoZSBleGFjdCBzYW1lIHNldCBvZiBwcm9wZXJ0eSBuYW1lcyBzb3J0IG5leHQgdG8qL1xuLyogZWFjaCBvdGhlciBpbiBhIHJhbmstc29ydCBvZiBjb3B5UmVjb3Jkcy4qL1xuXG4vKiBUaGUgY29weVJlY29yZCBpbnZhcmlhbnRzIGVuZm9yY2VkIGJ5IHBhc3NTdHlsZU9mIGVuc3VyZSB0aGF0Ki9cbi8qIGFsbCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIHN0cmluZ3MuIFdlIG5lZWQgdGhlIHJldmVyc2Ugc29ydGVkIG9yZGVyKi9cbi8qIG9mIHRoZXNlIG5hbWVzLCB3aGljaCB3ZSB0aGVuIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgZW5zdXJlcyovXG4vKiB0aGF0IGlmIHRoZSBuYW1lcyBvZiByZWNvcmQgWCBhcmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHJlY29yZCBZLCovXG4vKiB0aGVuIHJlY29yZCBYIHdpbGwgaGF2ZSBhbiBlYXJsaWVyIHJhbmsgYW5kIHNvcnQgdG8gdGhlIGxlZnQgb2YgWS4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnROYW1lcyxyaWdodE5hbWVzKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihcbnJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyksXG5yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcykpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMqL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgd2VyZSB0aWVkLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBJZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBoYXMgYW4gZWFybGllciByYW5rIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBgW1N5bWJvbC50b1N0cmluZ1RhZ11gIHRoZW4gYC5wYXlsb2FkYC4qL1xuY29uc3QgbGFiZWxDb21wPWNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLGdldFRhZyhyaWdodCkpO1xuaWYobGFiZWxDb21wIT09MCl7XG5yZXR1cm4gbGFiZWxDb21wO1xuIH1cbnJldHVybiBjb21wYXJhdG9yKGxlZnQucGF5bG9hZCxyaWdodC5wYXlsb2FkKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gfX1cblxuLyogZXNsaW50LWVuYWJsZSAqL1xuIH07XG5cbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBhbnRpQ29tcGFyYXRvcj0oeCx5KT0+Y29tcGFyYXRvcih5LHgpO1xuXG5tZW1vT2ZTb3J0ZWQuc2V0KGNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5tZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoY29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcik7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvcixjb21wYXJhdG9yKTtcblxucmV0dXJuIGhhcmRlbih7Y29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcn0pO1xuIH07XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyZT19XG4gKi8kaOKAjV9vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbmNvbnN0ICAgICAgICBjb21wYXJhdG9yTWlycm9ySW1hZ2U9KGNvbXBhcmF0b3IpPT5cbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuY29tcGFyYXRvck1pcnJvckltYWdlKGNvbXBhcmF0b3JNaXJyb3JJbWFnZSk7XG5jb25zdCAgICAgICAgaXNSYW5rU29ydGVkPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5pZihzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpe1xucmV0dXJuIHRydWU7XG4gfVxuYXNzZXJ0KHBhc3NTdHlsZU9mKHBhc3NhYmxlcyk9PT0nY29weUFycmF5Jyk7XG5mb3IobGV0IGk9MTtpPHBhc3NhYmxlcy5sZW5ndGg7aSs9MSl7XG5pZihjb21wYXJlKHBhc3NhYmxlc1tpLTFdLHBhc3NhYmxlc1tpXSk+PTEpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UmFua1NvcnRlZD0oc29ydGVkLGNvbXBhcmUpPT5cbmlzUmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSl8fFxuLyogVE9ETyBhc3NlcnQgb24gYnVnIGNvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLiBGaXguKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5GYWlsIGBNdXN0IGJlIHJhbmsgc29ydGVkOiAke3NvcnRlZH0gdnMgJHtzb3J0QnlSYW5rKHNvcnRlZCxjb21wYXJlKX1gOyRo4oCNX29uY2UuYXNzZXJ0UmFua1NvcnRlZChhc3NlcnRSYW5rU29ydGVkKTtcbmhhcmRlbihhc3NlcnRSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBUT0RPIFNFQ1VSSVRZIEJVRzogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MjYwXG4gKiBzb3J0QnlSYW5rIGN1cnJlbnRseSB1c2VzIGBBcnJheS5wcm90b3R5cGUuc29ydGAgZGlyZWN0bHksIGFuZFxuICogc28gb25seSB3b3JrcyBjb3JyZWN0bHkgd2hlbiBnaXZlbiBhIGBjb21wYXJlYCBmdW5jdGlvbiB0aGF0IGNvbnNpZGVyc1xuICogYHVuZGVmaW5lZGAgc3RyaWN0bHkgYmlnZ2VyIChgPmApIHRoYW4gZXZlcnl0aGluZyBlbHNlLiBUaGlzIGlzXG4gKiBiZWNhdXNlIGBBcnJheS5wcm90b3R5cGUuc29ydGAgYml6YXJyZWx5IG1vdmVzIGFsbCBgdW5kZWZpbmVkYHMgdG9cbiAqIHRoZSBlbmQgb2YgdGhlIGFycmF5IHJlZ2FyZGxlc3MsIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgYGNvbXBhcmVgXG4gKiBmdW5jdGlvbi4gVGhpcyBpcyBhIGdlbnVpbmUgYnVnIGZvciB1cyBOT1cgYmVjYXVzZSBzb21ldGltZXMgd2Ugc29ydFxuICogaW4gcmV2ZXJzZSBvcmRlciBieSBwYXNzaW5nIGEgcmV2ZXJzZWQgcmFuayBjb21wYXJpc29uIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SXRlcmFibGU8UGFzc2FibGU+fSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtQYXNzYWJsZVtdfVxuICovXG5jb25zdCAgICAgICAgc29ydEJ5UmFuaz0ocGFzc2FibGVzLGNvbXBhcmUpPT57XG5pZihBcnJheS5pc0FycmF5KHBhc3NhYmxlcykpe1xuaGFyZGVuKHBhc3NhYmxlcyk7XG4vKiBDYWxsaW5nIGlzUmFua1NvcnRlZCBnaXZlcyBpdCBhIGNoYW5jZSB0byBnZXQgbWVtb2l6ZWQgZm9yKi9cbi8qIHRoaXMgYGNvbXBhcmVgIGZ1bmN0aW9uIGV2ZW4gaWYgaXQgd2FzIGFscmVhZHkgbWVtb2l6ZWQgZm9yIGEgZGlmZmVyZW50Ki9cbi8qIGBjb21wYXJlYCBmdW5jdGlvbi4qL1xuaWYoaXNSYW5rU29ydGVkKHBhc3NhYmxlcyxjb21wYXJlKSl7XG5yZXR1cm4gcGFzc2FibGVzO1xuIH1cbiB9XG5jb25zdCB1bnNvcnRlZD1bLi4ucGFzc2FibGVzXTtcbnVuc29ydGVkLmZvckVhY2goaGFyZGVuKTtcbmNvbnN0IHNvcnRlZD1oYXJkZW4odW5zb3J0ZWQuc29ydChjb21wYXJlKSk7XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuc3ViTWVtb09mU29ydGVkLmFkZChzb3J0ZWQpO1xucmV0dXJuIHNvcnRlZDtcbiB9OyRo4oCNX29uY2Uuc29ydEJ5UmFuayhzb3J0QnlSYW5rKTtcbmhhcmRlbihzb3J0QnlSYW5rKTtcblxuLyoqXG4gKiBTZWVcbiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpbmFyeV9zZWFyY2hfYWxnb3JpdGhtI1Byb2NlZHVyZV9mb3JfZmluZGluZ190aGVfbGVmdG1vc3RfZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBrZXlcbiAqIEBwYXJhbSB7KFwibGVmdE1vc3RcIiB8IFwicmlnaHRNb3N0XCIpPX0gYmlhc1xuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgcmFua1NlYXJjaD0oc29ydGVkLGNvbXBhcmUsa2V5LGJpYXM9J2xlZnRNb3N0Jyk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xubGV0IGxlZnQ9MDtcbmxldCByaWdodD1zb3J0ZWQubGVuZ3RoO1xud2hpbGUobGVmdDxyaWdodCl7XG5jb25zdCBtPU1hdGguZmxvb3IoKGxlZnQrcmlnaHQpLzIpO1xuY29uc3QgY29tcD1jb21wYXJlKHNvcnRlZFttXSxrZXkpO1xuaWYoY29tcDw9LTF8fGNvbXA9PT0wJiZiaWFzPT09J3JpZ2h0TW9zdCcpe1xubGVmdD1tKzE7XG4gfWVsc2V7XG5hc3NlcnQoY29tcD49MXx8Y29tcD09PTAmJmJpYXM9PT0nbGVmdE1vc3QnKTtcbnJpZ2h0PW07XG4gfVxuIH1cbnJldHVybiBiaWFzPT09J2xlZnRNb3N0Jz9sZWZ0OnJpZ2h0LTE7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IHJhbmtDb3ZlclxuICogQHJldHVybnMge0luZGV4Q292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRJbmRleENvdmVyPShzb3J0ZWQsY29tcGFyZSxbbGVmdEtleSxyaWdodEtleV0pPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmNvbnN0IGxlZnRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLGxlZnRLZXksJ2xlZnRNb3N0Jyk7XG5jb25zdCByaWdodEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUscmlnaHRLZXksJ3JpZ2h0TW9zdCcpO1xucmV0dXJuW2xlZnRJbmRleCxyaWdodEluZGV4XTtcbiB9OyRo4oCNX29uY2UuZ2V0SW5kZXhDb3ZlcihnZXRJbmRleENvdmVyKTtcbmhhcmRlbihnZXRJbmRleENvdmVyKTtcblxuLyoqIEB0eXBlIHtSYW5rQ292ZXJ9ICovXG5jb25zdCAgICAgICAgRnVsbFJhbmtDb3Zlcj1oYXJkZW4oWycnLCd7J10pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge0luZGV4Q292ZXJ9IGluZGV4Q292ZXJcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fVxuICovJGjigI1fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuY29uc3QgICAgICAgIGNvdmVyZWRFbnRyaWVzPShzb3J0ZWQsW2xlZnRJbmRleCxyaWdodEluZGV4XSk9Pntcbi8qKiBAdHlwZSB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn0gKi9cbmNvbnN0IGl0ZXJhYmxlPWhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xubGV0IGk9bGVmdEluZGV4O1xucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG5pZihpPD1yaWdodEluZGV4KXtcbmNvbnN0IGVsZW1lbnQ9c29ydGVkW2ldO1xuaSs9MTtcbnJldHVybiBoYXJkZW4oe3ZhbHVlOltpLGVsZW1lbnRdLGRvbmU6ZmFsc2V9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe3ZhbHVlOnVuZGVmaW5lZCxkb25lOnRydWV9KTtcbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLmNvdmVyZWRFbnRyaWVzKGNvdmVyZWRFbnRyaWVzKTtcbmhhcmRlbihjb3ZlcmVkRW50cmllcyk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBtYXhSYW5rPShjb21wYXJlLGEsYik9PmNvbXBhcmUoYSxiKT49MD9hOmI7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBtaW5SYW5rPShjb21wYXJlLGEsYik9PmNvbXBhcmUoYSxiKTw9MD9hOmI7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgdW5pb25SYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCB1bmlvblJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWluUmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1heFJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKHVuaW9uUmFua0NvdmVyUGFpcixbJ3snLCcnXSk7XG4gfTskaOKAjV9vbmNlLnVuaW9uUmFua0NvdmVycyh1bmlvblJhbmtDb3ZlcnMpO1xuaGFyZGVuKHVuaW9uUmFua0NvdmVycyk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgaW50ZXJzZWN0UmFua0NvdmVycz0oY29tcGFyZSxjb3ZlcnMpPT57XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgaW50ZXJzZWN0UmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5tYXhSYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWluUmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UoaW50ZXJzZWN0UmFua0NvdmVyUGFpcixbJycsJ3snXSk7XG4gfTskaOKAjV9vbmNlLmludGVyc2VjdFJhbmtDb3ZlcnMoaW50ZXJzZWN0UmFua0NvdmVycyk7XG5cbmNvbnN0ICAgICAgIHtjb21wYXJhdG9yOmNvbXBhcmVSYW5rLGFudGlDb21wYXJhdG9yOmNvbXBhcmVBbnRpUmFua309XG5tYWtlQ29tcGFyYXRvcktpdCgpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNvbXBhcmF0b3Iga2l0IGluIHdoaWNoIHJlbW90YWJsZXMgYXJlIGZ1bGx5IG9yZGVyZWRcbiAqIGJ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBmaXJzdCBzZWVuIGJ5ICp0aGlzKiBjb21wYXJhdG9yIGtpdC5cbiAqIEJFV0FSRTogVGhpcyBpcyBvYnNlcnZhYmxlIG11dGFibGUgc3RhdGUsIHNvIHN1Y2ggYSBjb21wYXJhdG9yIGtpdFxuICogc2hvdWxkIG5ldmVyIGJlIHNoYXJlZCBhbW9uZyBzdWJzeXN0ZW1zIHRoYXQgc2hvdWxkIG5vdCBiZSBhYmxlXG4gKiB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBvcmRlciBkb2VzIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgZm9yIHN0b3JlXG4gKiBvcmRlcmluZywgc2luY2UgaXQgaGFzIG5vIG1lbW9yeSBvZiBkZWxldGVkIGtleXMuXG4gKlxuICogVGhlc2UgZnVsbCBvcmRlciBjb21wYXJhdG9yIGtpdCBpcyBzdHJpY3RseSBtb3JlIHByZWNpc2UgdGhhdCB0aGVcbiAqIHJhbmsgb3JkZXIgY29tcGFyYXRvciBraXRzIGFib3ZlLiBBcyBhIHJlc3VsdCwgYW55IGFycmF5IHdoaWNoIGlzXG4gKiBzb3J0ZWQgYnkgc3VjaCBhIGZ1bGwgb3JkZXIgd2lsbCBwYXNzIHRoZSBpc1JhbmtTb3J0ZWQgdGVzdCB3aXRoXG4gKiBhIGNvcnJlc3BvbmRpbmcgcmFuayBvcmRlci5cbiAqXG4gKiBBbiBhcnJheSB3aGljaCBpcyBzb3J0ZWQgYnkgYSAqZnJlc2gqIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgaS5lLixcbiAqIG9uZSB0aGF0IGhhcyBub3QgeWV0IHNlZW4gYW55IHJlbW90YWJsZXMsIHdpbGwgb2YgY291cnNlIHJlbWFpblxuICogc29ydGVkIGJ5IGFjY29yZGluZyB0byAqdGhhdCogZnVsbCBvcmRlciBjb21wYXJhdG9yLiBBbiBhcnJheSAqb2ZcbiAqIHNjYWxhcnMqIHNvcnRlZCBieSBhIGZyZXNoIGZ1bGwgb3JkZXIgd2lsbCByZW1haW4gc29ydGVkIGV2ZW5cbiAqIGFjY29yZGluZyB0byBhIG5ldyBmcmVzaCBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIHNpbmNlIGl0IHdpbGwgc2VlXG4gKiB0aGUgcmVtb3RhYmxlcyBpbiB0aGUgc2FtZSBvcmRlciBhZ2Fpbi4gVW5mb3J0dW5hdGVseSwgdGhpcyBpc1xuICogbm90IHRydWUgb2YgYXJyYXlzIG9mIHBhc3NhYmxlcyBpbiBnZW5lcmFsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxvbmdMaXZlZFxuICogQHJldHVybnMge0Z1bGxDb21wYXJhdG9yS2l0fVxuICovJGjigI1fb25jZS5jb21wYXJlUmFuayhjb21wYXJlUmFuayk7JGjigI1fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0ICAgICAgICBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdD0obG9uZ0xpdmVkPWZhbHNlKT0+e1xubGV0IG51bVNlZW49MDtcbi8qIFdoZW4gZHluYW1pY2FsbHkgY3JlYXRlZCB3aXRoIHNob3J0IGxpZmV0aW1lcyAodGhlIGRlZmF1bHQpIGEgV2Vha01hcCovXG4vKiB3b3VsZCBwZXJmb3JtIHBvb3JseSwgYW5kIHRoZSBsZWFrIGNyZWF0ZWQgYnkgYSBNYXAgb25seSBsYXN0cyBhcyBsb25nKi9cbi8qIGFzIHRoZSBNYXAuKi9cbmNvbnN0IE1hcENvbnN0cnVjdG9yPWxvbmdMaXZlZD9XZWFrTWFwOk1hcDtcbmNvbnN0IHNlZW49bmV3IE1hcENvbnN0cnVjdG9yKCk7XG5jb25zdCB0YWc9KHIpPT57XG5pZihzZWVuLmhhcyhyKSl7XG5yZXR1cm4gc2Vlbi5nZXQocik7XG4gfVxubnVtU2Vlbis9MTtcbnNlZW4uc2V0KHIsbnVtU2Vlbik7XG5yZXR1cm4gbnVtU2VlbjtcbiB9O1xuY29uc3QgY29tcGFyZVJlbW90YWJsZXM9KHgseSk9PmNvbXBhcmVSYW5rKHRhZyh4KSx0YWcoeSkpO1xucmV0dXJuIG1ha2VDb21wYXJhdG9yS2l0KGNvbXBhcmVSZW1vdGFibGVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xuaGFyZGVuKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRQYXNzU3R5bGVDb3ZlciI6WyJnZXRQYXNzU3R5bGVDb3ZlciJdLCJtYWtlQ29tcGFyYXRvcktpdCI6WyJtYWtlQ29tcGFyYXRvcktpdCJdLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiOlsiY29tcGFyYXRvck1pcnJvckltYWdlIl0sImlzUmFua1NvcnRlZCI6WyJpc1JhbmtTb3J0ZWQiXSwiYXNzZXJ0UmFua1NvcnRlZCI6WyJhc3NlcnRSYW5rU29ydGVkIl0sInNvcnRCeVJhbmsiOlsic29ydEJ5UmFuayJdLCJnZXRJbmRleENvdmVyIjpbImdldEluZGV4Q292ZXIiXSwiRnVsbFJhbmtDb3ZlciI6WyJGdWxsUmFua0NvdmVyIl0sImNvdmVyZWRFbnRyaWVzIjpbImNvdmVyZWRFbnRyaWVzIl0sInVuaW9uUmFua0NvdmVycyI6WyJ1bmlvblJhbmtDb3ZlcnMiXSwiaW50ZXJzZWN0UmFua0NvdmVycyI6WyJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sImNvbXBhcmVSYW5rIjpbImNvbXBhcmVSYW5rIl0sImNvbXBhcmVBbnRpUmFuayI6WyJjb21wYXJlQW50aVJhbmsiXSwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiOlsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAIQAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAlHpu9zwsAAM8LAAAeAAAAQGVuZG8vbmF0LXY0LjEuMjcvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwgJ25hbWUnLCB7dmFsdWU6IFwiaXNOYXRcIn0pOyRo4oCNX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsICduYW1lJywge3ZhbHVlOiBcIk5hdFwifSk7JGjigI1fb25jZS5OYXQoTmF0KTsgICAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbnJldHVybiBhbGxlZ2VkTnVtPj0wO1xuIH1cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtIT09J251bWJlcicpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxucmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pJiZhbGxlZ2VkTnVtPj0wO1xuIH1cblxuLyoqXG4gKiBJZiBgYWxsZWdlZE51bWJlcmAgcGFzc2VzIHRoZSBgaXNOYXRgIHRlc3QsIHRoZW4gcmV0dXJuIGl0IGFzIGEgYmlnaW50LlxuICogT3RoZXJ3aXNlIHRocm93IGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICpcbiAqIElmIGBhbGxlZ2VkTnVtYCBpcyBuZWl0aGVyIGEgYmlnaW50IG5vciBhIG51bWJlciwgYE5hdGAgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGlmIGl0IGlzIG5vdCBhIFtzYWZlbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBgTmF0YCB0aHJvd3MgYSBgUmFuZ2VFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGl0IGlzIGNvbnZlcnRlZCB0byBhIGJpZ2ludCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIGFsbGVnZWROdW07XG4gfVxuXG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdudW1iZXInKXtcbmlmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG4gfVxuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gfVxuXG50aHJvdyBuZXcgVHlwZUVycm9yKFxuIGAke2FsbGVnZWROdW19IGlzIGEgJHt0eXBlb2YgYWxsZWdlZE51bX0gYnV0IG11c3QgYmUgYSBiaWdpbnQgb3IgYSBudW1iZXJgKTtcblxuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGXyjBp8CAAAfAgAACAAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lcnJvci5qcyIsIi4vc3JjL2l0ZXItaGVscGVycy5qcyIsIi4vc3JjL21ha2UtZmFyLmpzIiwiLi9zcmMvbWFrZVRhZ2dlZC5qcyIsIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9yZW1vdGFibGUuanMiLCIuL3NyYy9zeW1ib2wuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImlzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvaXRlci1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvZXJyb3IuanNcIiwgW11dLFtcIi4vc3JjL3JlbW90YWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvc3ltYm9sLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2l0ZXItaGVscGVycy5qcyI6W1sibWFwSXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLFsiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSJdXSwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOltbIlBBU1NfU1RZTEUiLCJQQVNTX1NUWUxFIl0sWyJpc09iamVjdCIsImlzT2JqZWN0Il0sWyJhc3NlcnRDaGVja2VyIiwiYXNzZXJ0Q2hlY2tlciJdLFsiZ2V0VGFnIiwiZ2V0VGFnIl0sWyJoYXNPd25Qcm9wZXJ0eU9mIiwiaGFzT3duUHJvcGVydHlPZiJdXSwiLi9zcmMvZXJyb3IuanMiOltbImdldEVycm9yQ29uc3RydWN0b3IiLCJnZXRFcnJvckNvbnN0cnVjdG9yIl0sWyJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSxbImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiXV0sIi4vc3JjL3JlbW90YWJsZS5qcyI6W1siZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdXSwiLi9zcmMvc3ltYm9sLmpzIjpbWyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sWyJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCJdLFsibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sWyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXV0sIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjpbWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl0sWyJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIl1dLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIjpbWyJtYWtlVGFnZ2VkIiwibWFrZVRhZ2dlZCJdXSwiLi9zcmMvbWFrZS1mYXIuanMiOltbIlJlbW90YWJsZSIsIlJlbW90YWJsZSJdLFsiRmFyIiwiRmFyIl0sWyJUb0ZhckZ1bmN0aW9uIiwiVG9GYXJGdW5jdGlvbiJdXSwiLi9zcmMvdHlwZUd1YXJkcy5qcyI6W1siYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVjb3JkIl0sWyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiXSxbImFzc2VydFJlbW90YWJsZSIsImFzc2VydFJlbW90YWJsZSJdLFsiaXNSZW1vdGFibGUiLCJpc1JlbW90YWJsZSJdLFsiaXNSZWNvcmQiLCJpc1JlY29yZCJdLFsiaXNDb3B5QXJyYXkiLCJpc0NvcHlBcnJheSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3ka2qpMHAACTBwAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXkscHJvdG90eXBlOmFycmF5UHJvdG90eXBlfT1BcnJheTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNhbkJlVmFsaWQ9KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmlzQXJyYXkoY2FuZGlkYXRlKXx8XG4hIWNoZWNrJiZjaGVjayhmYWxzZSxYIGBBcnJheSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCk7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weUFycmF5SGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlBcnJheScsXG5cbmNhbkJlVmFsaWQsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKT09PWFycmF5UHJvdG90eXBlfHxcbmFzc2VydC5mYWlsKFggYE1hbGZvcm1lZCBhcnJheTogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogU2luY2Ugd2UncmUgYWxyZWFkeSBlbnN1cmVkIGNhbmRpZGF0ZSBpcyBhbiBhcnJheSwgaXQgc2hvdWxkIG5vdCBiZSovXG4vKiBwb3NzaWJsZSBmb3IgdGhlIGZvbGxvd2luZyB0ZXN0IHRvIGZhaWwqL1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ2xlbmd0aCcsZmFsc2UsYXNzZXJ0Q2hlY2tlcik7XG5jb25zdCBsZW49LyoqIEB0eXBlIHt1bmtub3duW119ICovY2FuZGlkYXRlLmxlbmd0aDtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsaSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qICsxIGZvciB0aGUgJ2xlbmd0aCcgcHJvcGVydHkgaXRzZWxmLiovXG5vd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoPT09bGVuKzF8fFxuYXNzZXJ0LmZhaWwoWCBgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmNhbmRpZGF0ZS5ldmVyeSgodik9PiEhcGFzc1N0eWxlT2ZSZWN1cih2KSk7XG4gfX0pOyRo4oCNX29uY2UuQ29weUFycmF5SGVscGVyKENvcHlBcnJheUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACD9dsszwcAAM8HAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlSZWNvcmRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRQcm90b3R5cGVPZix2YWx1ZXMscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlSZWNvcmRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weVJlY29yZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSE9PW9iamVjdFByb3RvdHlwZSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxuXG5yZXR1cm4gb3duS2V5cyhjYW5kaWRhdGUpLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4odHlwZW9mIGtleT09PSdzdHJpbmcnfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcblggYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbiFjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuLyogVE9ETzogVXBkYXRlIG1lc3NhZ2Ugbm93IHRoYXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBcImltcGxpY2l0IFJlbW90YWJsZVwiLiovXG5YIGBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKSk7XG5cblxuIH0pO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbkNvcHlSZWNvcmRIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsbmFtZSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmZvcihjb25zdCB2YWwgb2YgdmFsdWVzKGNhbmRpZGF0ZSkpe1xucGFzc1N0eWxlT2ZSZWN1cih2YWwpO1xuIH1cbiB9fSk7JGjigI1fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADToDhxnREAAJ0RAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2Vycm9yLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJFcnJvckhlbHBlciIsImdldEVycm9yQ29uc3RydWN0b3IiLCJpc0Vycm9yTGlrZSIsInRvUGFzc2FibGVFcnJvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiBUT0RPOiBNYWludGVuYW5jZSBoYXphcmQ6IENvb3JkaW5hdGUgd2l0aCB0aGUgbGlzdCBvZiBlcnJvcnMgaW4gdGhlIFNFUyovXG4vKiB3aGlsZWxpc3QuIEN1cnJlbnRseSwgYm90aCBvbWl0IEFnZ3JlZ2F0ZUVycm9yLCB3aGljaCBpcyBub3cgc3RhbmRhcmQuIEJvdGgqL1xuLyogbXVzdCBldmVudHVhbGx5IGluY2x1ZGUgaXQuKi9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzPW5ldyBNYXAoW1xuWydFcnJvcicsRXJyb3JdLFxuWydFdmFsRXJyb3InLEV2YWxFcnJvcl0sXG5bJ1JhbmdlRXJyb3InLFJhbmdlRXJyb3JdLFxuWydSZWZlcmVuY2VFcnJvcicsUmVmZXJlbmNlRXJyb3JdLFxuWydTeW50YXhFcnJvcicsU3ludGF4RXJyb3JdLFxuWydUeXBlRXJyb3InLFR5cGVFcnJvcl0sXG5bJ1VSSUVycm9yJyxVUklFcnJvcl1dKTtcblxuXG5jb25zdCAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3Rvcj0obmFtZSk9PmVycm9yQ29uc3RydWN0b3JzLmdldChuYW1lKTskaOKAjV9vbmNlLmdldEVycm9yQ29uc3RydWN0b3IoZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5oYXJkZW4oZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrRXJyb3JMaWtlPShjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbi8qIFRPRE86IE5lZWQgYSBiZXR0ZXIgdGVzdCB0aGFuIGluc3RhbmNlb2YqL1xucmV0dXJuKFxuY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3J8fFxucmVqZWN0JiZyZWplY3QoWCBgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH07XG5oYXJkZW4oY2hlY2tFcnJvckxpa2UpO1xuXG4vKipcbiAqIFZhbGlkYXRpbmcgZXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUgcmFpc2VzIGEgdGVuc2lvbiBiZXR3ZWVuIHNlY3VyaXR5XG4gKiB2cyBwcmVzZXJ2aW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIEZvciBlcnJvcnMsIHdlIG5lZWQgdG8gcmVtZW1iZXJcbiAqIHRoZSBlcnJvciBpdHNlbGYgZXhpc3RzIHRvIGhlbHAgdXMgZGlhZ25vc2UgYSBidWcgdGhhdCdzIGxpa2VseSBtb3JlXG4gKiBwcmVzc2luZyB0aGFuIGEgdmFsaWRpdHkgYnVnIGluIHRoZSBlcnJvciBpdHNlbGYuIFRodXMsIHdoZW5ldmVyIGl0IGlzIHNhZmVcbiAqIHRvIGRvIHNvLCB3ZSBwcmVmZXIgdG8gbGV0IHRoZSBlcnJvci1saWtlIHRlc3Qgc3VjY2VlZCBhbmQgdG8gY291Y2ggdGhlc2VcbiAqIGNvbXBsYWludHMgYXMgbm90ZXMgb24gdGhlIGVycm9yLlxuICpcbiAqIFRvIHJlc29sdmUgdGhpcywgc3VjaCBhIG1hbGZvcm1lZCBlcnJvciBvYmplY3Qgd2lsbCBzdGlsbCBwYXNzXG4gKiBgaXNFcnJvckxpa2VgIHNvIG1hcnNoYWwgY2FuIHVzZSB0aGlzIGZvciB0b3AgbGV2ZWwgZXJyb3IgdG8gcmVwb3J0IGZyb20sXG4gKiBldmVuIGlmIGl0IHdvdWxkIG5vdCBhY3R1YWxseSB2YWxpZGF0ZS5cbiAqIEluc3RlYWQsIHRoZSBkaWFnbm9zdGljcyB0aGF0IGBhc3NlcnRFcnJvcmAgd291bGQgaGF2ZSByZXBvcnRlZCBhcmVcbiAqIGF0dGFjaGVkIGFzIG5vdGVzIHRvIHRoZSBtYWxmb3JtZWQgZXJyb3IuIFRodXMsIGEgbWFsZm9ybWVkXG4gKiBlcnJvciBpcyBwYXNzYWJsZSBieSBpdHNlbGYsIGJ1dCBub3QgYXMgcGFydCBvZiBhIHBhc3NhYmxlIHN0cnVjdHVyZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc0Vycm9yTGlrZT0oY2FuZGlkYXRlKT0+Y2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlKTskaOKAjV9vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIEVycm9ySGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2Vycm9yJyxcblxuY2FuQmVWYWxpZDpjaGVja0Vycm9yTGlrZSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PntcbkVycm9ySGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbmNvbnN0e25hbWV9PXByb3RvO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbkVDJiZFQy5wcm90b3R5cGU9PT1wcm90b3x8XG5GYWlsIGBFcnJvcnMgbXVzdCBpbmhlcml0IGZyb20gYW4gZXJyb3IgY2xhc3MgLnByb3RvdHlwZSAke2NhbmRpZGF0ZX1gO1xuXG5jb25zdHtcbi8qIE11c3QgYWxsb3cgYGNhdXNlYCwgYGVycm9yc2AqL1xubWVzc2FnZTptRGVzYyxcbi8qIEFsbG93IGJ1dCBpZ25vcmUgb25seSBleHRyYW5lb3VzIG93biBgc3RhY2tgIHByb3BlcnR5LiovXG5zdGFjazpfb3B0U3RhY2tEZXNjLFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg8MXx8XG5GYWlsIGBQYXNzZWQgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnRpZXMgJHtyZXN0RGVzY3N9YDtcbmlmKG1EZXNjKXtcbnR5cGVvZiBtRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBcIm1lc3NhZ2VcIiAke21EZXNjfSBtdXN0IGJlIGEgc3RyaW5nLXZhbHVlZCBkYXRhIHByb3BlcnR5LmA7XG4hbURlc2MuZW51bWVyYWJsZXx8XG5GYWlsIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBub3QgYmUgZW51bWVyYWJsZWA7XG4gfVxucmV0dXJuIHRydWU7XG4gfX0pO1xuXG5cbi8qKlxuICogUmV0dXJuIGEgbmV3IHBhc3NhYmxlIGVycm9yIHRoYXQgcHJvcGFnYXRlcyB0aGUgZGlhZ25vc3RpYyBpbmZvIG9mIHRoZVxuICogb3JpZ2luYWwsIGFuZCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIGFzIGEgbm90ZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqLyRo4oCNX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xuY29uc3QgICAgICAgIHRvUGFzc2FibGVFcnJvcj0oZXJyKT0+e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1lcnI7XG5cbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoIGAke25hbWV9YCl8fEVycm9yO1xuY29uc3QgbmV3RXJyb3I9aGFyZGVuKG5ldyBFQyggYCR7bWVzc2FnZX1gKSk7XG4vKiBFdmVuIHRoZSBjbGVhbmVkIHVwIGVycm9yIGNvcHksIGlmIHNlbnQgdG8gdGhlIGNvbnNvbGUsIHNob3VsZCovXG4vKiBjYXVzZSBoaWRkZW4gZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBvZiB0aGUgb3JpZ2luYWwgZXJyb3IqL1xuLyogdG8gYmUgbG9nZ2VkLiovXG5hc3NlcnQubm90ZShuZXdFcnJvcixYIGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbnJldHVybiBuZXdFcnJvcjtcbiB9OyRo4oCNX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABKO2aDVQgAAFUIAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2l0ZXItaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiLi9tYWtlLWZhci5qc1wiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCBhbmRcbiAqIGhhdmUgdGhlIHNhbWUgdGVybWluYXRpb24gLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZSBvciBmYWlsdXJlXG4gKiByZWFzb24uIEJ1dCB0aGUgbm9uLWZpbmFsIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgbm9uLWZpbmFsXG4gKiB2YWx1ZXMgZnJvbSBgYmFzZUl0ZXJhdG9yYCBhcyB0cmFuc2Zvcm1lZCBieSBgZnVuY2AuXG4gKlxuICogQHRlbXBsYXRlIFQsVVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gVX0gZnVuY1xuICogQHJldHVybnMge0l0ZXJhYmxlPFU+fVxuICovXG5jb25zdCAgICAgICAgbWFwSXRlcmFibGU9KGJhc2VJdGVyYWJsZSxmdW5jKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdtYXBwZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3R7dmFsdWU6YmFzZVZhbHVlLGRvbmV9PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdCB2YWx1ZT1kb25lP2Jhc2VWYWx1ZTpmdW5jKGJhc2VWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSxkb25lfSk7XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UubWFwSXRlcmFibGUobWFwSXRlcmFibGUpO1xuXG5oYXJkZW4obWFwSXRlcmFibGUpO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGEgc3Vic2V0IG9mIHRoZSBub24tZmluYWwgdmFsdWVzIGZyb20gdGhlXG4gKiBgYmFzZUl0ZXJhdG9yYCAtLS0gdGhvc2UgZm9yIHdoaWNoIGBwcmVkKHZhbHVlKWAgd2FzIHRydXRoeS4gVGhlIHJlc3VsdFxuICogaGFzIHRoZSBzYW1lIHRlcm1pbmF0aW9uIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlXG4gKiBvciBmYWlsdXJlIHJlYXNvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gYm9vbGVhbn0gcHJlZFxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgZmlsdGVySXRlcmFibGU9KGJhc2VJdGVyYWJsZSxwcmVkKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignZmlsdGVyZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmZvcig7Oyl7XG5jb25zdCByZXN1bHQ9YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0e3ZhbHVlLGRvbmV9PXJlc3VsdDtcbmlmKGRvbmV8fHByZWQodmFsdWUpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5cbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYk1nA04aAABOGgAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJSZW1vdGFibGUiLCJUb0ZhckZ1bmN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxhc3NlcnRJZmFjZSxnZXRJbnRlcmZhY2VPZixSZW1vdGFibGVIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydElmYWNlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbnNldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcblxuLyoqXG4gKiBOb3cgdGhhdCB0aGUgcmVtb3RhYmxlUHJvdG8gZG9lcyBub3QgcHJvdmlkZSBpdHMgb3duIGB0b1N0cmluZ2AgbWV0aG9kLFxuICogZW5zdXJlIGl0IGFsd2F5cyBpbmhlcml0cyBmcm9tIHNvbWV0aGluZy4gVGhlIG9yaWdpbmFsIHByb3RvdHlwZSBvZlxuICogYHJlbW90YWJsZWAgaWYgdGhlcmUgd2FzIG9uZSwgb3IgYE9iamVjdC5wcm90b3R5cGVgIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG89KHJlbW90YWJsZSxpZmFjZSk9PntcbmxldCBvbGRQcm90bz1nZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuaWYodHlwZW9mIHJlbW90YWJsZT09PSdvYmplY3QnKXtcbmlmKG9sZFByb3RvPT09bnVsbCl7XG5vbGRQcm90bz1vYmplY3RQcm90b3R5cGU7XG4gfVxub2xkUHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuRmFpbCBgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2UgaWYodHlwZW9mIHJlbW90YWJsZT09PSdmdW5jdGlvbicpe1xub2xkUHJvdG8hPT1udWxsfHxcbkZhaWwgYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xub2xkUHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5nZXRQcm90b3R5cGVPZihvbGRQcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG5GYWlsIGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNle1xuRmFpbCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuIH1cbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2xkUHJvdG8se1xuW1BBU1NfU1RZTEVdOnt2YWx1ZToncmVtb3RhYmxlJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6aWZhY2V9fSkpO1xuXG5cbiB9O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZT0oY2FuZGlkYXRlKT0+XG5SZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIFJlbW90YWJsZS4gIEFmdGVyIHRoaXMsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSlcbiAqIHJldHVybnMgaWZhY2UuXG4gKlxuICogLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy84MDRcbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZT0nUmVtb3RhYmxlJ10gVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvclxuICogdGhlIHJlbW90YWJsZS4gRm9yIG5vdywgYSBzdHJpbmcgaWZhY2UgbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGhcbiAqIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiLCB0byBzZXJ2ZSBhcyB0aGUgYWxsZWdlZCBuYW1lLiBNb3JlXG4gKiBnZW5lcmFsIGlmYWNlcyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZC4gVGhpcyBpcyB0ZW1wb3JhcnkuIFdlIGluY2x1ZGUgdGhlXG4gKiBcIkFsbGVnZWRcIiBvciBcIkRlYnVnTmFtZVwiIGFzIGEgcmVtaW5kZXIgdGhhdCB3ZSBkbyBub3QgeWV0IGhhdmUgU3dpbmdTZXRcbiAqIG9yIENvbW1zIFZhdFxuICogc3VwcG9ydCBmb3IgZW5zdXJpbmcgdGhpcyBpcyBhY2NvcmRpbmcgdG8gdGhlIHZhdCBob3N0aW5nIHRoZSBvYmplY3QuXG4gKiBDdXJyZW50bHksIEFsaWNlIGNhbiB0ZWxsIEJvYiBhYm91dCBDYXJvbCwgd2hlcmUgVmF0QSAob24gQWxpY2UncyBiZWhhbGYpXG4gKiBtaXNyZXByZXNlbnRzIENhcm9sJ3MgYGlmYWNlYC4gVmF0QiBhbmQgdGhlcmVmb3JlIEJvYiB3aWxsIHRoZW4gc2VlXG4gKiBDYXJvbCdzIGBpZmFjZWAgYXMgbWlzcmVwcmVzZW50ZWQgYnkgVmF0QS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSBbcHJvcHM9dW5kZWZpbmVkXSBDdXJyZW50bHkgbWF5IG9ubHkgYmUgdW5kZWZpbmVkLlxuICogVGhhdCBwbGFuIGlzIHRoYXQgb3duLXByb3BlcnRpZXMgYXJlIGNvcGllZCB0byB0aGUgcmVtb3RhYmxlXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGU9e31dIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gcmVtb3RhYmxlLCBtb2RpZmllZCBmb3IgZGVidWdnYWJpbGl0eVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlPShcbmlmYWNlPSdSZW1vdGFibGUnLFxucHJvcHM9dW5kZWZpbmVkLFxucmVtb3RhYmxlPS8qKiBAdHlwZSB7VH0gKi97fSk9Plxue1xuYXNzZXJ0SWZhY2UoaWZhY2UpO1xuYXNzZXJ0KGlmYWNlKTtcbi8qIFRPRE86IFdoZW4gaWZhY2UgaXMgcmljaGVyIHRoYW4ganVzdCBzdHJpbmcsIHdlIG5lZWQgdG8gZ2V0IHRoZSBhbGxlZ2VkTmFtZSovXG4vKiBpbiBhIGRpZmZlcmVudCB3YXkuKi9cbnByb3BzPT09dW5kZWZpbmVkfHxGYWlsIGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWA7XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgdGhhdCB0aGUgdW5tb2RpZmllZCBvYmplY3QgaXMgYWJsZSB0byBiZWNvbWUgYSBSZW1vdGFibGUuKi9cbmFzc2VydENhbkJlUmVtb3RhYmxlKHJlbW90YWJsZSk7XG5cbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBtYXJrZWQuKi9cbiEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBtYXJrZWQgYXMgYSAke3EoXG5yZW1vdGFibGVbUEFTU19TVFlMRV0pXG4gfWA7XG4vKiBgaXNGcm96ZW5gIGFsd2F5cyByZXR1cm5zIHRydWUgd2l0aCBhIGZha2UgYGhhcmRlbmAsIGJ1dCB3ZSB3YW50IHRoYXQgY2FzZSovXG4vKiB0byBzdWNjZWVkIGFueXdheS4gRmFraW5nIGBoYXJkZW5gIGlzIG9ubHkgY29ycmVjdG5lc3MgcHJlc2VydmluZyovXG4vKiBpZiB0aGUgY29kZSBpbiBxdWVzdGlvbiBjb250YWlucyBubyBidWdzIHRoYXQgdGhlIHJlYWwgYGhhcmRlbmAgd291bGQqL1xuLyogaGF2ZSBjYXVnaHQuKi9cbi8qIEB0cy1pZ25vcmUgYGlzRmFrZWAgcHVycG9zZWx5IG5vdCBpbiB0aGUgdHlwZSovXG5oYXJkZW4uaXNGYWtlfHxcbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBmcm96ZW4uKi9cbiFpc0Zyb3plbihyZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuY29uc3QgcmVtb3RhYmxlUHJvdG89bWFrZVJlbW90YWJsZVByb3RvKHJlbW90YWJsZSxpZmFjZSk7XG5cbi8qIFRha2UgYSBzdGF0aWMgY29weSBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBhcyBkYXRhIHByb3BlcnRpZXMuKi9cbi8qIGNvbnN0IHByb3BEZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoeyAuLi5wcm9wcyB9KTsqL1xuY29uc3QgbXV0YXRlSGFyZGVuQW5kQ2hlY2s9KHRhcmdldCk9Pntcbi8qIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wRGVzY3MpOyovXG5zZXRQcm90b3R5cGVPZih0YXJnZXQscmVtb3RhYmxlUHJvdG8pO1xuaGFyZGVuKHRhcmdldCk7XG5hc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuIH07XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgYSBmcmVzaCByZW1vdGFibGUgdG8gc2VlIGlmIG91ciBydWxlcyBmaXQuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuLyogQWN0dWFsbHkgZmluaXNoIHRoZSBuZXcgcmVtb3RhYmxlLiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4vKiBDT01NSVRURUQhKi9cbi8qIFdlJ3JlIGNvbW1pdHRlZCwgc28ga2VlcCB0aGUgaW50ZXJmYWNlIGZvciBmdXR1cmUgcmVmZXJlbmNlLiovXG5hc3NlcnQoaWZhY2UhPT11bmRlZmluZWQpOy8qIFRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweSovXG5yZXR1cm4gKC8qKiBAdHlwZSB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gKi9yZW1vdGFibGUpO1xuIH07JGjigI1fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKipcbiAqIEEgY29uY2lzZSBjb252ZW5pZW5jZSBmb3IgdGhlIG1vc3QgY29tbW9uIGBSZW1vdGFibGVgIHVzZS5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSBUaGlzIG5hbWUgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCBgQWxsZWdlZDogYFxuICogZm9yIG5vdyB0byBmb3JtIHRoZSBgUmVtb3RhYmxlYCBgaWZhY2VgIGFyZ3VtZW50LlxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlPXt9XSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICovXG5jb25zdCAgICAgICAgRmFyPShmYXJOYW1lLHJlbW90YWJsZT11bmRlZmluZWQpPT57XG5jb25zdCByPXJlbW90YWJsZT09PXVuZGVmaW5lZD8vKiogQHR5cGUge1R9ICove306cmVtb3RhYmxlO1xucmV0dXJuIFJlbW90YWJsZSggYEFsbGVnZWQ6ICR7ZmFyTmFtZX1gLHVuZGVmaW5lZCxyKTtcbiB9OyRo4oCNX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLyoqXG4gKiBDb2VyY2UgYGZ1bmNgIHRvIGEgZmFyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIGl0cyBjYWxsIGJlaGF2aW9yLlxuICogSWYgaXQgaXMgYWxyZWFkeSBhIGZhciBmdW5jdGlvbiwgcmV0dXJuIGl0LiBPdGhlcndpc2UgbWFrZSBhbmQgcmV0dXJuIGFcbiAqIG5ldyBmYXIgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGZvcndhcmRzIGNhbGxzIHRvIGl0LiBUaGlzXG4gKiB3b3JrcyBldmVuIGlmIGBmdW5jYCBpcyBhbHJlYWR5IGZyb3plbi4gYFRvRmFyRnVuY3Rpb25gIGlzIHRvIGJlIHVzZWRcbiAqIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20gZWxzZXdoZXJlIHVuZGVyIGxlc3MgY29udHJvbC4gRm9yIGZ1bmN0aW9uc1xuICogeW91IGF1dGhvciBpbiBwbGFjZSwgYmV0dGVyIHRvIHVzZSBgRmFyYCBvbiB0aGVpciBmdW5jdGlvbiBsaXRlcmFsIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIHRvIGJlIHVzZWQgb25seSBpZiBgZnVuY2AgaXMgbm90IGFscmVhZHkgYVxuICogZmFyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gZnVuY1xuICovXG5jb25zdCAgICAgICAgVG9GYXJGdW5jdGlvbj0oZmFyTmFtZSxmdW5jKT0+e1xuaWYoZ2V0SW50ZXJmYWNlT2YoZnVuYykhPT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmM7XG4gfVxucmV0dXJuIEZhcihmYXJOYW1lLCguLi5hcmdzKT0+ZnVuYyguLi5hcmdzKSk7XG4gfTskaOKAjV9vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUmVtb3RhYmxlIjpbIlJlbW90YWJsZSJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAACkXvlHQQAAB0EAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7Y3JlYXRlLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuY29uc3QgICAgICAgIG1ha2VUYWdnZWQ9KHRhZyxwYXlsb2FkKT0+e1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG5hc3NlcnRQYXNzYWJsZShoYXJkZW4ocGF5bG9hZCkpO1xucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvYmplY3RQcm90b3R5cGUse1xuW1BBU1NfU1RZTEVdOnt2YWx1ZTondGFnZ2VkJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6dGFnfSxcbnBheWxvYWQ6e3ZhbHVlOnBheWxvYWQsZW51bWVyYWJsZTp0cnVlfX0pKTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABlAKMb1GQAA9RkAADAAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2FuQmVNZXRob2QiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tOb3JtYWxQcm9wZXJ0eSIsImNoZWNrUGFzc1N0eWxlIiwiY2hlY2tUYWdSZWNvcmQiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG5nZXRQcm90b3R5cGVPZixcbmhhc093blByb3BlcnR5Om9iamVjdEhhc093blByb3BlcnR5LFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuY29uc3R7dG9TdHJpbmdUYWc6dG9TdHJpbmdUYWdTeW1ib2x9PVN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZT1nZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbnR5cGVkQXJyYXlQcm90b3R5cGUsXG50b1N0cmluZ1RhZ1N5bWJvbCk7XG5cbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz10eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPT09J2Z1bmN0aW9uJyk7XG5cbmNvbnN0ICAgICAgICBoYXNPd25Qcm9wZXJ0eU9mPShvYmoscHJvcCk9PlxuYXBwbHkob2JqZWN0SGFzT3duUHJvcGVydHksb2JqLFtwcm9wXSk7JGjigI1fb25jZS5oYXNPd25Qcm9wZXJ0eU9mKGhhc093blByb3BlcnR5T2YpO1xuaGFyZGVuKGhhc093blByb3BlcnR5T2YpO1xuXG5jb25zdCAgICAgICAgaXNPYmplY3Q9KHZhbCk9Pk9iamVjdCh2YWwpPT09dmFsOyRo4oCNX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLyoqXG4gKiBEdXBsaWNhdGVzIHBhY2thZ2VzL3Nlcy9zcmMvbWFrZS1oYXJkZW5lci5qcyB0byBhdm9pZCBhIGRlcGVuZGVuY3kuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmplY3RcbiAqL1xuY29uc3QgICAgICAgIGlzVHlwZWRBcnJheT0ob2JqZWN0KT0+e1xuLyogVGhlIG9iamVjdCBtdXN0IHBhc3MgYSBicmFuZCBjaGVjayBvciB0b1N0cmluZ1RhZyB3aWxsIHJldHVybiB1bmRlZmluZWQuKi9cbmNvbnN0IHRhZz1hcHBseShnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcsb2JqZWN0LFtdKTtcbnJldHVybiB0YWchPT11bmRlZmluZWQ7XG4gfTskaOKAjV9vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbmNvbnN0ICAgICAgICBQQVNTX1NUWUxFPVN5bWJvbC5mb3IoJ3Bhc3NTdHlsZScpO1xuXG4vKipcbiAqIEZvciBhIGZ1bmN0aW9uIHRvIGJlIGEgdmFsaWQgbWV0aG9kLCBpdCBtdXN0IG5vdCBiZSBwYXNzYWJsZS5cbiAqIE90aGVyd2lzZSwgd2UgcmlzayBjb25mdXNpbmcgcGFzcy1ieS1jb3B5IGRhdGEgY2FycnlpbmdcbiAqIGZhciBmdW5jdGlvbnMgd2l0aCBhdHRlbXB0cyBhdCBmYXIgb2JqZWN0cyB3aXRoIG1ldGhvZHMuXG4gKlxuICogVE9ETyBIQVpBUkQgQmVjYXVzZSB3ZSBjaGVjayB0aGlzIG9uIHRoZSB3YXkgdG8gaGFyZGVuaW5nIGEgcmVtb3RhYmxlLFxuICogd2UgY2Fubm90IHlldCBjaGVjayB0aGF0IGBmdW5jYCBpcyBoYXJkZW5lZC4gSG93ZXZlciwgd2l0aG91dFxuICogZG9pbmcgc28sIGl0J3MgaW5oZXJpdGFuY2UgbWlnaHQgY2hhbmdlIGFmdGVyIHRoZSBgUEFTU19TVFlMRWBcbiAqIGNoZWNrIGJlbG93LlxuICpcbiAqIEBwYXJhbSB7YW55fSBmdW5jXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuUEFTU19TVFlMRShQQVNTX1NUWUxFKTtcbmNvbnN0ICAgICAgICBjYW5CZU1ldGhvZD0oZnVuYyk9PlxudHlwZW9mIGZ1bmM9PT0nZnVuY3Rpb24nJiYhKFBBU1NfU1RZTEUgaW4gZnVuYyk7JGjigI1fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKipcbiAqIEJlbG93IHdlIGhhdmUgYSBzZXJpZXMgb2YgcHJlZGljYXRlIGZ1bmN0aW9ucyBhbmQgdGhlaXIgKGN1cnJpZWQpIGFzc2VydGlvblxuICogZnVuY3Rpb25zLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBhc3NlcnRpb24gZnVuY3Rpb24gaXMganVzdCB0byBhc3NlcnQgdGhhdFxuICogdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGljYXRlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgcmV0dXJuZWQgdHJ1ZS4gQnV0IGl0XG4gKiByZXByb2R1Y2VzIHRoZSBpbnRlcm5hbCB0ZXN0cyBzbyBmYWlsdXJlcyBjYW4gZ2l2ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q2hlY2tlcj0oY29uZCxkZXRhaWxzKT0+e1xuYXNzZXJ0KGNvbmQsZGV0YWlscyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBhbmQgZW51bWVyYWJpbGl0eSBvZiBhbiBvd24gZGF0YSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8c3ltYm9sfSBwcm9wZXJ0eU5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkQmVFbnVtZXJhYmxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tOb3JtYWxQcm9wZXJ0eT0oXG5jYW5kaWRhdGUsXG5wcm9wZXJ0eU5hbWUsXG5zaG91bGRCZUVudW1lcmFibGUsXG5jaGVjayk9Plxue1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGRlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNhbmRpZGF0ZSxwcm9wZXJ0eU5hbWUpO1xuaWYoZGVzYz09PXVuZGVmaW5lZCl7XG5yZXR1cm4oXG5yZWplY3QmJnJlamVjdChYIGAke3EocHJvcGVydHlOYW1lKX0gcHJvcGVydHkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cbnJldHVybihcbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2MsJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IG5vdCBiZSBhbiBhY2Nlc3NvciBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnNob3VsZEJlRW51bWVyYWJsZT9cbmRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCk6XG5cbiFkZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShcbnByb3BlcnR5TmFtZSlcbiB9IG11c3Qgbm90IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSk7XG5cblxuIH07JGjigI1fb25jZS5jaGVja05vcm1hbFByb3BlcnR5KGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuaGFyZGVuKGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuXG5jb25zdCAgICAgICAgZ2V0VGFnPSh0YWdSZWNvcmQpPT50YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaOKAjV9vbmNlLmdldFRhZyhnZXRUYWcpO1xuaGFyZGVuKGdldFRhZyk7XG5cbmNvbnN0ICAgICAgICBjaGVja1Bhc3NTdHlsZT0ob2JqLGV4cGVjdGVkUGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGFjdHVhbD1vYmpbUEFTU19TVFlMRV07XG5yZXR1cm4oXG5hY3R1YWw9PT1leHBlY3RlZFBhc3NTdHlsZXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEV4cGVjdGVkICR7cShleHBlY3RlZFBhc3NTdHlsZSl9LCBub3QgJHtxKGFjdHVhbCl9OiAke29ian1gKSk7XG5cbiB9OyRo4oCNX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkPShjaGVja1Byb3RvKT0+e1xuLyoqXG4gKiBAcGFyYW0ge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcgfX0gdGFnUmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1RhZ1JlY29yZD0odGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5yZXR1cm4oXG4oaXNPYmplY3QodGFnUmVjb3JkKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEEgbm9uLW9iamVjdCBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmKFxuaXNGcm96ZW4odGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdChYIGBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpJiYoXG4haXNBcnJheSh0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFBBU1NfU1RZTEUsZmFsc2UsY2hlY2spJiZcbmNoZWNrUGFzc1N0eWxlKHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFN5bWJvbC50b1N0cmluZ1RhZyxmYWxzZSxjaGVjaykmJihcbnR5cGVvZiBnZXRUYWcodGFnUmVjb3JkKT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBBIFtTeW1ib2wudG9TdHJpbmdUYWddLW5hbWVkIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnUmVjb3JkfWApKSYmXG5cbmNoZWNrUHJvdG8odGFnUmVjb3JkLGdldFByb3RvdHlwZU9mKHRhZ1JlY29yZCksY2hlY2spKTtcblxuIH07XG5yZXR1cm4gaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcbiB9O1xuXG5jb25zdCAgICAgICAgY2hlY2tUYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhmYWxzZSxYIGBBIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja1RhZ1JlY29yZChjaGVja1RhZ1JlY29yZCk7XG5cbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbmNvbnN0ICAgICAgICBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxucHJvdG8hPT1udWxsJiZnZXRQcm90b3R5cGVPZihwcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKFxuZmFsc2UsXG5YIGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5cblxuaGFyZGVuKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiJdLCJpc09iamVjdCI6WyJpc09iamVjdCJdLCJpc1R5cGVkQXJyYXkiOlsiaXNUeXBlZEFycmF5Il0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSJdLCJjYW5CZU1ldGhvZCI6WyJjYW5CZU1ldGhvZCJdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiXSwiY2hlY2tOb3JtYWxQcm9wZXJ0eSI6WyJjaGVja05vcm1hbFByb3BlcnR5Il0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAC5usQ2DGwAAgxsAACoAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiLi9jb3B5QXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL2Vycm9yLmpzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIiwiLi9zYWZlLXByb21pc2UuanMiLCIuL3N5bWJvbC5qcyIsIi4vdGFnZ2VkLmpzIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZSIsInBhc3NTdHlsZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxpc09iamVjdCxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxDb3B5QXJyYXlIZWxwZXIsQ29weVJlY29yZEhlbHBlcixUYWdnZWRIZWxwZXIsRXJyb3JIZWxwZXIsUmVtb3RhYmxlSGVscGVyLGFzc2VydFBhc3NhYmxlU3ltYm9sLGFzc2VydFNhZmVQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImlzVHlwZWRBcnJheVwiLCBbJGjigI1fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVPZn0gUGFzc1N0eWxlT2YgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByaW1pdGl2ZVN0eWxlfSBQcmltaXRpdmVTdHlsZSAqL1xuXG4vKiogQHR5cGVkZWYge0V4Y2x1ZGU8UGFzc1N0eWxlLCBQcmltaXRpdmVTdHlsZSB8IFwicHJvbWlzZVwiPn0gSGVscGVyUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0Zyb3plbn09T2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBQYXNzU3R5bGVIZWxwZXI+IH1cbiAqL1xuXG5jb25zdCBtYWtlSGVscGVyVGFibGU9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG4vKiogQHR5cGUge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIGFueT4gJiB7X19wcm90b19fOiBudWxsfX0gKi9cbmNvbnN0IEhlbHBlclRhYmxlPXtcbl9fcHJvdG9fXzpudWxsLFxuY29weUFycmF5OnVuZGVmaW5lZCxcbmNvcHlSZWNvcmQ6dW5kZWZpbmVkLFxudGFnZ2VkOnVuZGVmaW5lZCxcbmVycm9yOnVuZGVmaW5lZCxcbnJlbW90YWJsZTp1bmRlZmluZWR9O1xuXG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuY29uc3R7c3R5bGVOYW1lfT1oZWxwZXI7XG5zdHlsZU5hbWUgaW4gSGVscGVyVGFibGV8fEZhaWwgYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPT09dW5kZWZpbmVkfHxcbkZhaWwgYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPWhlbHBlcjtcbiB9XG5mb3IoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKXtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV0hPT11bmRlZmluZWR8fFxuRmFpbCBgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gfVxuXG5yZXR1cm4gaGFyZGVuKEhlbHBlclRhYmxlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnMgVGhlIHBhc3NTdHlsZUhlbHBlcnMgdG8gcmVnaXN0ZXIsXG4gKiBpbiBwcmlvcml0eSBvcmRlci5cbiAqIE5PVEUgVGhlc2UgbXVzdCBhbGwgYmUgXCJ0cnVzdGVkXCIsXG4gKiBjb21wbGV0ZSwgYW5kIG5vbi1jb2xsaWRpbmcuIGBtYWtlUGFzc1N0eWxlT2ZgIG1heSAqYXNzdW1lKiB0aGF0IGVhY2ggaGVscGVyXG4gKiBkb2VzIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uIGBtYWtlUGFzc1N0eWxlT2ZgIGlzIG5vdCB0cnlpbmcgdG8gZGVmZW5kXG4gKiBpdHNlbGYgYWdhaW5zdCBtYWxpY2lvdXMgaGVscGVycywgdGhvdWdoIGl0IGRvZXMgZGVmZW5kIGFnYWluc3Qgc29tZVxuICogYWNjaWRlbnRzLlxuICogQHJldHVybnMge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2Y9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG5jb25zdCBIZWxwZXJUYWJsZT1tYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG5jb25zdCByZW1vdGFibGVIZWxwZXI9SGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4vKipcbiAqIFB1cmVseSBmb3IgcGVyZm9ybWFuY2UuIEhvd2V2ZXIgaXQgaXMgbXV0YWJsZSBzdGF0aWMgc3RhdGUsIGFuZFxuICogaXQgZG9lcyBoYXZlIHNvbWUgb2JzZXJ2YWJpbGl0eSBvbiBwcm94aWVzLiBUT0RPIG5lZWQgdG8gYXNzZXNzXG4gKiB3aGV0aGVyIHRoaXMgY3JlYXRlcyBhIHN0YXRpYyBjb21tdW5pY2F0aW9ucyBjaGFubmVsLlxuICpcbiAqIHBhc3NTdHlsZU9mIGRvZXMgYSBmdWxsIHJlY3Vyc2l2ZSB3YWxrIG9mIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgaW4gb3JkZXIgdG8gdmFsaWRhdGUgdGhhdCB0aGV5IGFyZSBhY3ljbGljLiBJbiBhZGRpdGlvblxuICogaXQgaXMgdXNlZCBieSBvdGhlciBhbGdvcml0aG1zIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2UgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBzbyB3aXRob3V0IHRoaXMgY2FjaGUsIHRoZXNlIGFsZ29yaXRobXMgY291bGQgYmVcbiAqIE8oTioqMikgb3Igd29yc2UuXG4gKlxuICogQHR5cGUge1dlYWtNYXA8UGFzc2FibGUsIFBhc3NTdHlsZT59XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU1lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mPShwYXNzYWJsZSk9Pntcbi8qIEV2ZW4gd2hlbiBhIFdlYWtTZXQgaXMgY29ycmVjdCwgd2hlbiB0aGUgc2V0IGhhcyBhIHNob3J0ZXIgbGlmZXRpbWUqL1xuLyogdGhhbiBpdHMga2V5cywgd2UgcHJlZmVyIGEgU2V0IGR1ZSB0byBleHBlY3RlZCBpbXBsZW1lbnRhdGlvbiovXG4vKiB0cmFkZW9mZnMuKi9cbmNvbnN0IGluUHJvZ3Jlc3M9bmV3IFNldCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZSZWN1cj0oaW5uZXIpPT57XG5jb25zdCBpbm5lcklzT2JqZWN0PWlzT2JqZWN0KGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xuaWYocGFzc1N0eWxlTWVtby5oYXMoaW5uZXIpKXtcbi8qIEB0cy1pZ25vcmUgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdCBgZ2V0YCBhZnRlciBgaGFzYCBpcyBzYWZlKi9cbnJldHVybiBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gfVxuIWluUHJvZ3Jlc3MuaGFzKGlubmVyKXx8XG5GYWlsIGBQYXNzLWJ5LWNvcHkgZGF0YSBjYW5ub3QgYmUgY3ljbGljICR7aW5uZXJ9YDtcbmluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5wYXNzU3R5bGVNZW1vLnNldChpbm5lcixwYXNzU3R5bGUpO1xuaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuIH1cbnJldHVybiBwYXNzU3R5bGU7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mSW50ZXJuYWw9KGlubmVyKT0+e1xuY29uc3QgdHlwZXN0cj10eXBlb2YgaW5uZXI7XG5zd2l0Y2godHlwZXN0cil7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOntcbnJldHVybiB0eXBlc3RyO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG5yZXR1cm4nc3ltYm9sJztcbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoaW5uZXI9PT1udWxsKXtcbnJldHVybidudWxsJztcbiB9XG5pZighaXNGcm96ZW4oaW5uZXIpKXtcbmFzc2VydC5mYWlsKFxuLyogVHlwZWRBcnJheXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGluIGhhcmRlbigpKi9cbi8qIGFuZCBhIGNvcnJlc3BvbmRpbmcgc3BlY2lhbCBlcnJvciBtZXNzYWdlIGhlcmUuKi9cbmlzVHlwZWRBcnJheShpbm5lcik/XG5YIGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmA6XG5YIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCk7XG5cbiB9XG5pZihpc1Byb21pc2UoaW5uZXIpKXtcbmFzc2VydFNhZmVQcm9taXNlKGlubmVyKTtcbnJldHVybidwcm9taXNlJztcbiB9XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbmNvbnN0IHBhc3NTdHlsZVRhZz1pbm5lcltQQVNTX1NUWUxFXTtcbmlmKHBhc3NTdHlsZVRhZyE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywnc3RyaW5nJyk7XG5jb25zdCBoZWxwZXI9SGVscGVyVGFibGVbcGFzc1N0eWxlVGFnXTtcbmhlbHBlciE9PXVuZGVmaW5lZHx8XG5GYWlsIGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuICgvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi9wYXNzU3R5bGVUYWcpO1xuIH1cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5pZihoZWxwZXIuY2FuQmVWYWxpZChpbm5lcikpe1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuIGhlbHBlci5zdHlsZU5hbWU7XG4gfVxuIH1cbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmNhc2UnZnVuY3Rpb24nOntcbmlzRnJvemVuKGlubmVyKXx8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07XG5cbnJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiB9O1xucmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG4gfTtcblxuY29uc3QgICAgICAgIHBhc3NTdHlsZU9mPW1ha2VQYXNzU3R5bGVPZihbXG5Db3B5QXJyYXlIZWxwZXIsXG5Db3B5UmVjb3JkSGVscGVyLFxuVGFnZ2VkSGVscGVyLFxuRXJyb3JIZWxwZXIsXG5SZW1vdGFibGVIZWxwZXJdKTskaOKAjV9vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGU9KHZhbCk9PntcbnBhc3NTdHlsZU9mKHZhbCk7LyogdGhyb3dzIGlmIHZhbCBpcyBub3QgYSBwYXNzYWJsZSovXG4gfTskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFLGifcMhAADDIQAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlJlbW90YWJsZUhlbHBlciIsImFzc2VydElmYWNlIiwiZ2V0SW50ZXJmYWNlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxoYXNPd25Qcm9wZXJ0eU9mLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc09iamVjdCxnZXRUYWc7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLk1hcnNoYWxHZXRJbnRlcmZhY2VPZn0gTWFyc2hhbEdldEludGVyZmFjZU9mICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZSxcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PVxuT2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja0lmYWNlPShpZmFjZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5yZXR1cm4oXG4vKiBUT0RPIG90aGVyIHBvc3NpYmxlIGlmYWNlcywgb25jZSB3ZSBoYXZlIHRoaXJkIHBhcnR5IHZlcmFjaXR5Ki9cbih0eXBlb2YgaWZhY2U9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkmJihcblxuaWZhY2U9PT0nUmVtb3RhYmxlJ3x8XG5pZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKXx8XG5pZmFjZS5zdGFydHNXaXRoKCdEZWJ1Z05hbWU6ICcpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGb3Igbm93LCBpZmFjZSAke3EoXG5pZmFjZSlcbiB9IG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiOyB1bmltcGxlbWVudGVkYCkpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBBbiBgaWZhY2VgIG11c3QgYmUgcHVyZS4gUmlnaHQgbm93IGl0IG11c3QgYmUgYSBzdHJpbmcsIHdoaWNoIGlzIHB1cmUuXG4gKiBMYXRlciB3ZSBleHBlY3QgdG8gaW5jbHVkZSBzb21lIG90aGVyIHZhbHVlcyB0aGF0IHF1YWxpZnkgYXMgYFB1cmVEYXRhYCxcbiAqIHdoaWNoIGlzIGEgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGVuZGluZyBvbmx5IGluIHByaW1pdGl2ZXMgb3JcbiAqIGVtcHR5IHBhc3MtYnktY29weSBjb21wb3NpdGVzLiBObyByZW1vdGFibGVzLCBwcm9taXNlcywgb3IgZXJyb3JzLlxuICogV2UgKmFzc3VtZSogZm9yIG5vdyB0aGF0IHRoZSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgY29udGFpbnMgbm9cbiAqIHByb3hpZXMuXG4gKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0SWZhY2U9KGlmYWNlKT0+Y2hlY2tJZmFjZShpZmFjZSxhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydElmYWNlKGFzc2VydElmYWNlKTtcbmhhcmRlbihhc3NlcnRJZmFjZSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3QgfCBGdW5jdGlvbn0gb3JpZ2luYWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlUHJvdG9PZj0ob3JpZ2luYWwsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaXNPYmplY3Qob3JpZ2luYWwpfHxcbkZhaWwgYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4vKiBBIHZhbGlkIHJlbW90YWJsZSBvYmplY3QgbXVzdCBpbmhlcml0IGZyb20gYSBcInRhZyByZWNvcmRcIiAtLSBhKi9cbi8qIHBsYWluLW9iamVjdCBwcm90b3R5cGUgY29uc2lzdGluZyBvZiBvbmx5Ki9cbi8qIGEgYFBBU1NfU1RZTEVgIHByb3BlcnR5IHdpdGggdmFsdWUgXCJyZW1vdGFibGVcIiBhbmQgYSBzdWl0YWJsZSBgU3ltYm9sLnRvU3RyaW5nVGFnYCovXG4vKiBwcm9wZXJ0eS4gVGhlIHJlbW90YWJsZSBjb3VsZCBpbmhlcml0IGRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQsIG9yKi9cbi8qIGl0IGNvdWxkIGluaGVyaXQgZnJvbSBhbm90aGVyIHZhbGlkIHJlbW90YWJsZSwgdGhhdCB0aGVyZWZvcmUgaXRzZWxmKi9cbi8qIGluaGVyaXRzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZC4qL1xuLyoqL1xuLyogVE9ETzogSXQgd291bGQgYmUgbmljZSB0byB0eXBlZGVmIHRoaXMgc2hhcGUsIGJ1dCB3ZSBjYW4ndCBkZWNsYXJlIGEgdHlwZSovXG4vKiB3aXRoIFBBU1NfU1RZTEUgZnJvbSBKU0RvYy4qL1xuLyoqL1xuLyogQHR5cGUge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcsKi9cbi8qIFtTeW1ib2wudG9TdHJpbmdUYWddOiBzdHJpbmcsKi9cbi8qIH19Ki9cbi8qKi9cbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKG9yaWdpbmFsKTtcbmlmKHByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxwcm90bz09PW51bGwpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBSZW1vdGFibGVzIG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZDogJHtxKG9yaWdpbmFsKX1gKSk7XG5cbiB9XG5cbmlmKHR5cGVvZiBvcmlnaW5hbD09PSdvYmplY3QnKXtcbmNvbnN0IHByb3RvUHJvdG89Z2V0UHJvdG90eXBlT2YocHJvdG8pO1xuaWYocHJvdG9Qcm90byE9PW9iamVjdFByb3RvdHlwZSYmcHJvdG9Qcm90byE9PW51bGwpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiBjaGVja1JlbW90YWJsZShwcm90byxjaGVjayk7XG4gfVxuaWYoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1lbHNlIGlmKHR5cGVvZiBvcmlnaW5hbD09PSdmdW5jdGlvbicpe1xuaWYoIWNoZWNrRnVuY3Rpb25UYWdSZWNvcmQocHJvdG8sJ3JlbW90YWJsZScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06e3ZhbHVlOmlmYWNlfSxcbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHByb3RvKTtcblxucmV0dXJuKFxuKG93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhyZXN0RGVzY3MpfWApKSYmXG5cbmNoZWNrSWZhY2UoaWZhY2UsY2hlY2spKTtcblxuIH07XG5cbi8qKlxuICogS2VlcCBhIHdlYWsgc2V0IG9mIGNvbmZpcm1lZCByZW1vdGFibGVzIGZvciBtYXJzaGFsIHBlcmZvcm1hbmNlXG4gKiAod2l0aG91dCB3aGljaCB3ZSB3b3VsZCBpbmN1ciBhIHJlZHVuZGFudCB2ZXJpZmljYXRpb24gaW5cbiAqIGdldEludGVyZmFjZU9mKS5cbiAqIFdlIGRvbid0IHJlbWVtYmVyIHJlamVjdGlvbnMgYmVjYXVzZSB0aGV5IGFyZSBwb3NzaWJsZSB0byBjb3JyZWN0XG4gKiB3aXRoIGUuZy4gYGhhcmRlbmAuXG4gKlxuICogQHR5cGUge1dlYWtTZXQ8UmVtb3RhYmxlPn1cbiAqL1xuY29uc3QgY29uZmlybWVkUmVtb3RhYmxlcz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmVtb3RhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlPSh2YWwsY2hlY2spPT57XG5pZihjb25maXJtZWRSZW1vdGFibGVzLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZighaXNGcm96ZW4odmFsKSl7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke3ZhbH1gKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHJlc3VsdD1jaGVja1JlbW90YWJsZVByb3RvT2YodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb25maXJtZWRSZW1vdGFibGVzLmFkZCh2YWwpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqIEB0eXBlIHtNYXJzaGFsR2V0SW50ZXJmYWNlT2Z9ICovXG5jb25zdCAgICAgICAgZ2V0SW50ZXJmYWNlT2Y9KHZhbCk9PntcbmlmKFxuIWlzT2JqZWN0KHZhbCl8fFxudmFsW1BBU1NfU1RZTEVdIT09J3JlbW90YWJsZSd8fFxuIWNoZWNrUmVtb3RhYmxlKHZhbCkpXG57XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBnZXRUYWcodmFsKTtcbiB9OyRo4oCNX29uY2UuZ2V0SW50ZXJmYWNlT2YoZ2V0SW50ZXJmYWNlT2YpO1xuaGFyZGVuKGdldEludGVyZmFjZU9mKTtcblxuLyoqXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidyZW1vdGFibGUnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IHZhbGlkVHlwZT1cbihpc09iamVjdChjYW5kaWRhdGUpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpJiYoXG4haXNBcnJheShjYW5kaWRhdGUpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBhcnJheXMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKTtcbmlmKCF2YWxpZFR5cGUpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdvYmplY3QnKXtcbi8qIEV2ZXJ5IG93biBwcm9wZXJ0eSAocmVnYXJkbGVzcyBvZiBlbnVtZXJhYmlsaXR5KSovXG4vKiBtdXN0IGhhdmUgYSBmdW5jdGlvbiB2YWx1ZS4qL1xucmV0dXJuIG93bktleXMoZGVzY3MpLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4vKiBUeXBlY2FzdCBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG4oaGFzT3duUHJvcGVydHlPZihkZXNjc1svKiogQHR5cGUge3N0cmluZ30gKi9rZXldLCd2YWx1ZScpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBhY2Nlc3NvcnMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5rZXk9PT1TeW1ib2wudG9TdHJpbmdUYWcmJmNoZWNrSWZhY2UoY2FuZGlkYXRlW2tleV0sY2hlY2spfHxcbihjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIG5vbi1tZXRob2RzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxua2V5IT09UEFTU19TVFlMRXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEEgcGFzcy1ieS1yZW1vdGUgY2Fubm90IHNoYWRvdyAke3EoUEFTU19TVFlMRSl9YCkpKSk7XG5cbiB9KTtcbiB9ZWxzZSBpZih0eXBlb2YgY2FuZGlkYXRlPT09J2Z1bmN0aW9uJyl7XG4vKiBGYXIgZnVuY3Rpb25zIGNhbm5vdCBiZSBtZXRob2RzLCBhbmQgY2Fubm90IGhhdmUgbWV0aG9kcy4qL1xuLyogVGhleSBtdXN0IGhhdmUgZXhhY3RseSBleHBlY3RlZCBgLm5hbWVgIGFuZCBgLmxlbmd0aGAgcHJvcGVydGllcyovXG5jb25zdHtcbm5hbWU6bmFtZURlc2MsXG5sZW5ndGg6bGVuZ3RoRGVzYyxcbi8qIEB0cy1pZ25vcmUgVFMgZG9lc24ndCBsaWtlIHN5bWJvbHMgYXMgY29tcHV0ZWQgaW5kZXhlcz8/Ki9cbltTeW1ib2wudG9TdHJpbmdUYWddOnRvU3RyaW5nVGFnRGVzYyxcbi4uLnJlc3REZXNjc309XG5kZXNjcztcbmNvbnN0IHJlc3RLZXlzPW93bktleXMocmVzdERlc2NzKTtcbnJldHVybihcbihuYW1lRGVzYyYmdHlwZW9mIG5hbWVEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChYIGBGYXIgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkmJihcbmxlbmd0aERlc2MmJnR5cGVvZiBsZW5ndGhEZXNjLnZhbHVlPT09J251bWJlcid8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZhciBmdW5jdGlvbiBsZW5ndGggbXVzdCBiZSBhIG51bWJlciwgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnRvU3RyaW5nVGFnRGVzYz09PXVuZGVmaW5lZHx8XG4odHlwZW9mIHRvU3RyaW5nVGFnRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkmJlxuXG5jaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSxjaGVjaykpJiYoXG5yZXN0S2V5cy5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpKTtcblxuXG4gfVxucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYHVucmVjb2duaXplZCB0eXBlb2YgJHtjYW5kaWRhdGV9YCk7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PmNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKSxcblxuZXZlcnk6KF9wYXNzYWJsZSxfZm4pPT50cnVlfSk7JGjigI1fb25jZS5SZW1vdGFibGVIZWxwZXIoUmVtb3RhYmxlSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJZmFjZSI6WyJhc3NlcnRJZmFjZSJdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiJdLCJSZW1vdGFibGVIZWxwZXIiOlsiUmVtb3RhYmxlSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADXiToqaDwAAmg8AACsAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvc2FmZS1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFzc2VydFNhZmVQcm9taXNlIiwiaXNTYWZlUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsYXNzZXJ0Q2hlY2tlcixoYXNPd25Qcm9wZXJ0eU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2lzRnJvemVuLGdldFByb3RvdHlwZU9mfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZX0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXM9KHByLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscyk7XG5jb25zdCBrZXlzPW93bktleXMocHIpO1xuXG5pZihrZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5jb25zdCB1bmtub3duS2V5cz1rZXlzLmZpbHRlcihcbihrZXkpPT50eXBlb2Yga2V5IT09J3N5bWJvbCd8fCFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLGtleSkpO1xuXG5cbmlmKHVua25vd25LZXlzLmxlbmd0aCE9PTApe1xucmV0dXJuIHJlamVjdChcblggYCR7cHJ9IC0gTXVzdCBub3QgaGF2ZSBhbnkgb3duIHByb3BlcnRpZXM6ICR7cSh1bmtub3duS2V5cyl9YCk7XG5cbiB9XG5cbi8qKlxuICogQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCBOb2RlJ3MgYXN5bmNfaG9va3MgY29udGFpbnMgdGhlXG4gKiBmb2xsb3dpbmcgY29kZSwgd2hpY2ggd2UgY2FuIGFsc28gc2FmZWx5IHRvbGVyYXRlXG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIGRlc3Ryb3lUcmFja2luZyhwcm9taXNlLCBwYXJlbnQpIHtcbiAqIHRyYWNrUHJvbWlzZShwcm9taXNlLCBwYXJlbnQpO1xuICogICBjb25zdCBhc3luY0lkID0gcHJvbWlzZVthc3luY19pZF9zeW1ib2xdO1xuICogICBjb25zdCBkZXN0cm95ZWQgPSB7IGRlc3Ryb3llZDogZmFsc2UgfTtcbiAqICAgcHJvbWlzZVtkZXN0cm95ZWRTeW1ib2xdID0gZGVzdHJveWVkO1xuICogICByZWdpc3RlckRlc3Ryb3lIb29rKHByb21pc2UsIGFzeW5jSWQsIGRlc3Ryb3llZCk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGtleVxuICovXG5jb25zdCBjaGVja1NhZmVBc3luY0hvb2tzS2V5PShrZXkpPT57XG5jb25zdCB2YWw9cHJba2V5XTtcbmlmKHZhbD09PXVuZGVmaW5lZHx8dHlwZW9mIHZhbD09PSdudW1iZXInKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKFxudHlwZW9mIHZhbD09PSdvYmplY3QnJiZcbnZhbCE9PW51bGwmJlxuaXNGcm96ZW4odmFsKSYmXG5nZXRQcm90b3R5cGVPZih2YWwpPT09T2JqZWN0LnByb3RvdHlwZSlcbntcbmNvbnN0IHN1YktleXM9b3duS2V5cyh2YWwpO1xuaWYoc3ViS2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuaWYoXG5zdWJLZXlzLmxlbmd0aD09PTEmJlxuc3ViS2V5c1swXT09PSdkZXN0cm95ZWQnJiZcbnZhbC5kZXN0cm95ZWQ9PT1mYWxzZSlcbntcbnJldHVybiB0cnVlO1xuIH1cbiB9XG5yZXR1cm4gcmVqZWN0KFxuWCBgVW5leHBlY3RlZCBOb2RlIGFzeW5jX2hvb2tzIGFkZGl0aW9ucyB0byBwcm9taXNlOiAke3ByfS4ke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGlzICR7dmFsfWApO1xuXG4gfTtcblxucmV0dXJuIGtleXMuZXZlcnkoY2hlY2tTYWZlQXN5bmNIb29rc0tleSk7XG4gfTtcblxuLyoqXG4gKiBVbmRlciBIYXJkZW5lZCBKUyBhIHByb21pc2UgaXMgXCJzYWZlXCIgaWYgaXRzIGB0aGVuYCBtZXRob2QgY2FuIGJlIGNhbGxlZFxuICogc3luY2hyb25vdXNseSB3aXRob3V0IGdpdmluZyB0aGUgcHJvbWlzZSBhbiBvcHBvcnR1bml0eSBmb3IgYVxuICogcmVlbnRyYW5jeSBhdHRhY2sgZHVyaW5nIHRoYXQgY2FsbC5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzlcbiAqIHJhaXNlcyB0aGUgaXNzdWUgb2YgdGVzdGluZyB0aGF0IGEgc3BlY2ltZW4gaXMgYSBzYWZlIHByb21pc2VcbiAqIHN1Y2ggdGhhdCB0aGUgdGVzdCBhbHNvIGRvZXMgbm90IGdpdmUgdGhlIHNwZWNpbWVuIGFcbiAqIHJlZW50cmFuY3kgb3Bwb3J0dW5pdHkuIFRoYXQgaXMgd2VsbCBiZXlvbmQgdGhlIGFtYml0aW9uIGhlcmUuXG4gKiBUT0RPIFRob3VnaCBpZiB3ZSBmaWd1cmUgb3V0IGEgbmljZSBzb2x1dGlvbiwgaXQgbWlnaHQgYmUgZ29vZCB0b1xuICogdXNlIGl0IGhlcmUgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xucmV0dXJuKFxuKGlzRnJvemVuKHByKXx8cmVqZWN0KFggYCR7cHJ9IC0gTXVzdCBiZSBmcm96ZW5gKSkmJihcbmlzUHJvbWlzZShwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkpJiYoXG5nZXRQcm90b3R5cGVPZihwcik9PT1Qcm9taXNlLnByb3RvdHlwZXx8XG5yZWplY3QoXG5YIGAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG5nZXRQcm90b3R5cGVPZihwcikpXG4gfWApKSYmXG5cbmNoZWNrUHJvbWlzZU93bktleXMoLyoqIEB0eXBlIHtQcm9taXNlfSAqL3ByLGNoZWNrKSk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5jb25zdCAgICAgICAgaXNTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLCh4KT0+eCk7JGjigI1fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0U2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwcixhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1NhZmVQcm9taXNlIjpbImlzU2FmZVByb21pc2UiXSwiYXNzZXJ0U2FmZVByb21pc2UiOlsiYXNzZXJ0U2FmZVByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxx/VUEcSAABHEgAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9zeW1ib2wuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIGNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBUaGUgd2VsbCBrbm93biBzeW1ib2xzIGFyZSBzdGF0aWMgc3ltYm9sIHZhbHVlcyBvbiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzPW5ldyBNYXAoXG5vd25LZXlzKFN5bWJvbCkuXG5maWx0ZXIoXG4obmFtZSk9PnR5cGVvZiBuYW1lPT09J3N0cmluZycmJnR5cGVvZiBTeW1ib2xbbmFtZV09PT0nc3ltYm9sJykuXG5cbmZpbHRlcigobmFtZSk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi9cbiFuYW1lLnN0YXJ0c1dpdGgoJ0BAJyl8fFxuRmFpbCBgRGlkIG5vdCBleHBlY3QgU3ltYm9sIHRvIGhhdmUgYSBzeW1ib2wtdmFsdWVkIHByb3BlcnR5IG5hbWUgc3RhcnRpbmcgd2l0aCBcIkBAXCIgJHtxKFxubmFtZSlcbiB9YDtcbnJldHVybiB0cnVlO1xuIH0pXG4vKiBAdHMtaWdub3JlIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovLlxubWFwKChuYW1lKT0+W1N5bWJvbFtuYW1lXSwgYEBAJHtuYW1lfWBdKSk7XG5cblxuLyoqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzeW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG50eXBlb2Ygc3ltPT09J3N5bWJvbCcmJihcbnR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSk9PT0nc3RyaW5nJ3x8d2VsbEtub3duU3ltYm9sTmFtZXMuaGFzKHN5bSkpOyRo4oCNX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sPShzeW0pPT5cbmlzUGFzc2FibGVTeW1ib2woc3ltKXx8XG5GYWlsIGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGVTeW1ib2woYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcblxuLyoqXG4gKiBJZiBgc3ltYCBpcyBhIHBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzXG4gKiBzeW1ib2wuIElmIGBzeW1gIGlzIGEgbm9uLXBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICpcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuIFNpbmNlIHRoZSByZWdpc3RyYXRpb24gc3RyaW5nIG9mIGEgcmVnaXN0ZXJlZCBzeW1ib2wgY2FuIGJlIGFueVxuICogc3RyaW5nLCBpZiB3ZSBzaW1wbHkgdXNlZCB0aGF0IHRvIGlkZW50aWZ5IHRob3NlIHN5bWJvbHMsIHRoZXJlIHdvdWxkIG5vdFxuICogYmUgYW55IHJlbWFpbmluZyBzdHJpbmdzIGxlZnQgb3ZlciB0byBpZGVudGlmeSB0aGUgd2VsbC1rbm93biBzeW1ib2xzLlxuICogSW5zdGVhZCwgd2UgcmVzZXJ2ZSBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGBcIkBAXCJgIGZvciBwdXJwb3NlcyBvZiB0aGlzXG4gKiBlbmNvZGluZy4gV2UgaWRlbnRpZnkgYSB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiBieSBwcmVmaXhpbmcgdGhlIHByb3BlcnR5IG5hbWUgd2l0aCBgXCJAQFwiYCwgc3VjaCBhcyBgXCJAQGl0ZXJhdG9yXCJgLlxuICogRm9yIHJlZ2lzdGVyZWQgc3ltYm9scyB3aG9zZSBuYW1lIGhhcHBlbnMgdG8gYmVnaW4gd2l0aCBgXCJAQFwiYCwgc3VjaFxuICogYXMgYFN5bWJvbC5mb3IoJ0BAaXRlcmF0b3InKWAgb3IgYFN5bWJvbC5mb3IoJ0BAZm9vJylgLCB3ZSBpZGVudGlmeVxuICogdGhlbSBieSBwcmVmaXhpbmcgdGhlbSB3aXRoIGFuIGV4dHJhIGBcIkBAXCJgLCBzdWNoIGFzXG4gKiBgXCJAQEBAaXRlcmF0b3JcImAgb3IgYFwiQEBAQGZvb1wiYC4gKFRoaXMgaXMgdGhlIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmdcbiAqIHRlY2huaXF1ZS4pXG4gKlxuICogQHBhcmFtIHtzeW1ib2x9IHN5bVxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cbmNvbnN0ICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2w9KHN5bSk9PntcbmNvbnN0IG5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYobmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gfVxuaWYobmFtZS5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBgQEAke25hbWV9YDtcbiB9XG5yZXR1cm4gbmFtZTtcbiB9OyRo4oCNX29uY2UubmFtZUZvclBhc3NhYmxlU3ltYm9sKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4obmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogSWYgYG5hbWVgIGlzIGEgc3RyaW5nIHRoYXQgY291bGQgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5XG4gKiBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCwgcmV0dXJuIHRoZSBzeW1ib2wgYXJndW1lbnQgaXQgd2FzIHByb2R1Y2VkIHRvXG4gKiByZXByZXNlbnQuXG4gKlxuICogICAgSWYgYG5hbWVgIGRvZXMgbm90IGJlZ2luIHdpdGggYFwiQEBcImAsIHRoZW4ganVzdCB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgICByZWdpc3RlcmVkIHN5bWJvbCwgYFN5bWJvbC5mb3IobmFtZSlgLlxuICogICAgSWYgYG5hbWVgIGlzIGBcIkBAXCJgIGZvbGxvd2VkIGJ5IGEgd2VsbCBrbm93biBzeW1ib2wncyBwcm9wZXJ0eSBuYW1lIG9uXG4gKiAgICAgIGBTeW1ib2xgIHN1Y2ggYFwiQEBpdGVyYXRvclwiLCByZXR1cm4gdGhhdCB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzXG4gKiAgICAgIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiAgICBJZiBgbmFtZWAgYmVnaW5zIHdpdGggYFwiQEBAQFwiYCBpdCBlbmNvZGVzIHRoZSByZWdpc3RlcmVkIHN5bWJvbCB3aG9zZVxuICogICAgICBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGluc3RlYWQuXG4gKiAgICBPdGhlcndpc2UsIGlmIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaXQgbWF5IGVuY29kZSBhIHJlZ2lzdGVyZWQgc3ltYm9sXG4gKiAgICAgIGZyb20gYSBmdXR1cmUgdmVyc2lvbiBvZiBKYXZhU2NyaXB0LCBidXQgaXQgaXMgbm90IG9uZSB3ZSBjYW4gZGVjb2RlXG4gKiAgICAgIHlldCwgc28gdGhyb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtzeW1ib2w9fVxuICovXG5jb25zdCAgICAgICAgcGFzc2FibGVTeW1ib2xGb3JOYW1lPShuYW1lKT0+e1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5pZihtYXRjaCl7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5pZihzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuIH1lbHNle1xuY29uc3Qgc3ltPVN5bWJvbFtzdWZmaXhdO1xuaWYodHlwZW9mIHN5bT09PSdzeW1ib2wnKXtcbnJldHVybiBzeW07XG4gfVxuRmFpbCBgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gfVxuIH1cbnJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xuIH07JGjigI1fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJbxc+/0HAAD9BwAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90YWdnZWQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsY2hlY2tOb3JtYWxQcm9wZXJ0eSxjaGVja1Bhc3NTdHlsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsIFskaOKAjV9hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBUYWdnZWRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTondGFnZ2VkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PlxuY2hlY2tQYXNzU3R5bGUoY2FuZGlkYXRlLCd0YWdnZWQnLGNoZWNrKSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuY2hlY2tUYWdSZWNvcmQoY2FuZGlkYXRlLCd0YWdnZWQnLGFzc2VydENoZWNrZXIpO1xuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06X2xhYmVsRGVzYyxcbnBheWxvYWQ6X3BheWxvYWREZXNjLC8qIHZhbHVlIGNoZWNrZWQgYnkgcmVjdXJzaXZlIHdhbGsgYXQgdGhlIGVuZCovXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xub3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxuRmFpbCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ3BheWxvYWQnLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbnBhc3NTdHlsZU9mUmVjdXIoY2FuZGlkYXRlLnBheWxvYWQpO1xuIH19KTskaOKAjV9vbmNlLlRhZ2dlZEhlbHBlcihUYWdnZWRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAeqB+aBINAAASDQAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXkgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBBS0EgYSBcImNvcHlBcnJheVwiXG4gKiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyXG4gKiBAcmV0dXJucyB7YXJyIGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5jb25zdCBpc0NvcHlBcnJheT0oYXJyKT0+cGFzc1N0eWxlT2YoYXJyKT09PSdjb3B5QXJyYXknOyRo4oCNX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQsIEFLQSBhXG4gKiBcImNvcHlSZWNvcmRcIiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVjb3JkXG4gKiBAcmV0dXJucyB7cmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuY29uc3QgaXNSZWNvcmQ9KHJlY29yZCk9PnBhc3NTdHlsZU9mKHJlY29yZCk9PT0nY29weVJlY29yZCc7JGjigI1fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcmVtb3RhYmxlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHJldHVybnMge3JlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cbmNvbnN0IGlzUmVtb3RhYmxlPShyZW1vdGFibGUpPT5wYXNzU3R5bGVPZihyZW1vdGFibGUpPT09J3JlbW90YWJsZSc7JGjigI1fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRBcnJheVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mQXJyYXlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFycmF5IGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0QXJyYXl9ICovXG5jb25zdCBhc3NlcnRDb3B5QXJyYXk9KGFycmF5LG9wdE5hbWVPZkFycmF5PSdBbGxlZ2VkIGFycmF5Jyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihhcnJheSk7XG5wYXNzU3R5bGU9PT0nY29weUFycmF5J3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2FycmF5fSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZWNvcmRcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZWNvcmR9ICovXG5jb25zdCBhc3NlcnRSZWNvcmQ9KHJlY29yZCxvcHROYW1lT2ZSZWNvcmQ9J0FsbGVnZWQgcmVjb3JkJyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZWNvcmQpO1xucGFzc1N0eWxlPT09J2NvcHlSZWNvcmQnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZWNvcmQpfSAke3JlY29yZH0gbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlY29yZChhc3NlcnRSZWNvcmQpO1xuaGFyZGVuKGFzc2VydFJlY29yZCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlbW90YWJsZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlbW90YWJsZVxuICogQHJldHVybnMge2Fzc2VydHMgcmVtb3RhYmxlIGlzIFJlbW90YWJsZX1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydFJlbW90YWJsZX0gKi9cbmNvbnN0IGFzc2VydFJlbW90YWJsZT0oXG5yZW1vdGFibGUsXG5vcHROYW1lT2ZSZW1vdGFibGU9J0FsbGVnZWQgcmVtb3RhYmxlJyk9Plxue1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlbW90YWJsZSk7XG5wYXNzU3R5bGU9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACwnEJ+4goAAOIKAAAeAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiLCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIiwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIiwiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy91dGlscy5qcyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIiwia2V5TFQiLCJrZXlMVCIsIm9iamVjdE1hcCIsIm9iamVjdE1hcCIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMva2V5cy9jaGVja0tleS5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5U2V0LmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvcHlCYWcuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW11dLFtcIi4vc3JjL3V0aWxzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIjpbWyJpc0tleSIsImlzS2V5Il0sWyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiXSxbImFzc2VydFNjYWxhcktleSIsImFzc2VydFNjYWxhcktleSJdLFsibWFrZUNvcHlTZXQiLCJtYWtlQ29weVNldCJdLFsiZ2V0Q29weVNldEtleXMiLCJnZXRDb3B5U2V0S2V5cyJdLFsibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZyJdLFsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLFsiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5QmFnRW50cmllcyJdLFsibWFrZUNvcHlNYXAiLCJtYWtlQ29weU1hcCJdLFsiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIjpbWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdXSwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjpbWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXV0sIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOltbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl1dLCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOltbImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzSXNTdXBlcnNldCJdLFsiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50Il0sWyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0NvbXBhcmUiXSxbImVsZW1lbnRzVW5pb24iLCJlbGVtZW50c1VuaW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSxbImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSxbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLFsic2V0SXNTdXBlcnNldCIsInNldElzU3VwZXJzZXQiXSxbInNldElzRGlzam9pbnQiLCJzZXRJc0Rpc2pvaW50Il0sWyJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSJdLFsic2V0VW5pb24iLCJzZXRVbmlvbiJdLFsic2V0RGlzam9pbnRVbmlvbiIsInNldERpc2pvaW50VW5pb24iXSxbInNldEludGVyc2VjdGlvbiIsInNldEludGVyc2VjdGlvbiJdLFsic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50U3VidHJhY3QiXV0sIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6W1siYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOltbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJtdXN0TWF0Y2giLCJtdXN0TWF0Y2giXV0sIi4vc3JjL3V0aWxzLmpzIjpbWyJsaXN0RGlmZmVyZW5jZSIsImxpc3REaWZmZXJlbmNlIl0sWyJvYmplY3RNYXAiLCJvYmplY3RNYXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMsXGeCkRgAApEYAACoAAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY2hlY2tLZXkuanN7ImltcG9ydHMiOlsiLi4vdXRpbHMuanMiLCIuL2NvcHlCYWcuanMiLCIuL2NvcHlTZXQuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUJhZyIsImFzc2VydENvcHlNYXAiLCJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0S2V5IiwiYXNzZXJ0UHJpbWl0aXZlS2V5IiwiYXNzZXJ0U2NhbGFyS2V5IiwiY2hlY2tDb3B5QmFnIiwiY2hlY2tDb3B5TWFwIiwiY2hlY2tDb3B5U2V0IiwiY2hlY2tLZXkiLCJjaGVja1NjYWxhcktleSIsImNvcHlNYXBLZXlTZXQiLCJldmVyeUNvcHlCYWdFbnRyeSIsImV2ZXJ5Q29weU1hcEtleSIsImV2ZXJ5Q29weU1hcFZhbHVlIiwiZXZlcnlDb3B5U2V0S2V5IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBLZXlzIiwiZ2V0Q29weU1hcFZhbHVlcyIsImdldENvcHlTZXRLZXlzIiwiaXNDb3B5QmFnIiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwiaXNLZXkiLCJpc1ByaW1pdGl2ZUtleSIsImlzU2NhbGFyS2V5IiwibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixhc3NlcnRQYXNzYWJsZSxGYXIsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssaWRlbnRDaGVja2VyLGNoZWNrRWxlbWVudHMsbWFrZVNldE9mRWxlbWVudHMsY2hlY2tCYWdFbnRyaWVzLG1ha2VCYWdPZkVudHJpZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL3V0aWxzLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRWxlbWVudHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoY2hlY2tCYWdFbnRyaWVzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXlDb21wYXJpc29ufSBLZXlDb21wYXJpc29uICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5fSBLZXkgKi9cbi8qKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5QmFnPEs+fSBDb3B5QmFnICovXG4vKiogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV0gQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ29weVNldDxLPn0gQ29weVNldCAqL1xuLyoqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFtWPVBhc3NhYmxlXSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5TWFwPEssIFY+fSBDb3B5TWFwICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyZX0gS2V5Q29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8gUHJpbWl0aXZlIGFuZCBTY2FsYXIga2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQcmltaXRpdmVLZXk9KHZhbCxjaGVjayk9PntcbmlmKGlzT2JqZWN0KHZhbCkpe1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSAke3EodHlwZW9mIHZhbCl9IGNhbm5vdCBiZSBhIHByaW1pdGl2ZTogJHt2YWx9YCkpO1xuXG4gfVxuLyogVE9ETyBUaGVyZSBpcyBub3QgeWV0IGEgY2hlY2tQYXNzYWJsZSwgYnV0IHBlcmhhcHMgdGhlcmUgc2hvdWxkIGJlLiovXG4vKiBJZiB0aGF0IGhhcHBlbnMsIHdlIHNob3VsZCBjYWxsIGl0IGhlcmUgaW5zdGVhZC4qL1xuYXNzZXJ0UGFzc2FibGUodmFsKTtcbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUHJpbWl0aXZlS2V5PSh2YWwpPT5jaGVja1ByaW1pdGl2ZUtleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzUHJpbWl0aXZlS2V5KGlzUHJpbWl0aXZlS2V5KTtcbmhhcmRlbihpc1ByaW1pdGl2ZUtleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFByaW1pdGl2ZUtleT0odmFsKT0+e1xuY2hlY2tQcmltaXRpdmVLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRQcmltaXRpdmVLZXkoYXNzZXJ0UHJpbWl0aXZlS2V5KTtcbmhhcmRlbihhc3NlcnRQcmltaXRpdmVLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja1NjYWxhcktleT0odmFsLGNoZWNrKT0+e1xuaWYoaXNQcmltaXRpdmVLZXkodmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbmlmKHBhc3NTdHlsZT09PSdyZW1vdGFibGUnKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBzY2FsYXIga2V5OiAke3ZhbH1gKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmNoZWNrU2NhbGFyS2V5KGNoZWNrU2NhbGFyS2V5KTtcbmNvbnN0ICAgICAgICBpc1NjYWxhcktleT0odmFsKT0+Y2hlY2tTY2FsYXJLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc1NjYWxhcktleShpc1NjYWxhcktleSk7XG5oYXJkZW4oaXNTY2FsYXJLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRTY2FsYXJLZXk9KHZhbCk9PntcbmNoZWNrU2NhbGFyS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0U2NhbGFyS2V5KGFzc2VydFNjYWxhcktleSk7XG5oYXJkZW4oYXNzZXJ0U2NhbGFyS2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8S2V5Pn0gKi9cbmNvbnN0IGtleU1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tLZXk9KHZhbCxjaGVjayk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbi8qIFRPRE8gVGhlcmUgaXMgbm90IHlldCBhIGNoZWNrUGFzc2FibGUsIGJ1dCBwZXJoYXBzIHRoZXJlIHNob3VsZCBiZS4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGQgY2FsbCBpdCBoZXJlIGluc3RlYWQuKi9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihrZXlNZW1vLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCByZXN1bHQ9Y2hlY2tLZXlJbnRlcm5hbCh2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbi8qIERvbid0IGNhY2hlIHRoZSB1bmRlZmluZWQgY2FzZXMsIHNvIHRoYXQgaWYgaXQgaXMgdHJpZWQgYWdhaW4qL1xuLyogd2l0aCBgYXNzZXJ0Q2hlY2tlcmAgaXQnbGwgdGhyb3cgYSBkaWFnbm9zdGljIGFnYWluKi9cbmtleU1lbW8uYWRkKHZhbCk7XG4gfVxuLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBtZW1vaXplIGEgbmVnYXRpdmUganVkZ2VtZW50LCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkKi9cbi8qIGFnYWluIHdpdGggYSBjaGVja2VyLCBpdCB3aWxsIHN0aWxsIHByb2R1Y2UgYSB1c2VmdWwgZGlhZ25vc3RpYy4qL1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tLZXkoY2hlY2tLZXkpO1xuaGFyZGVuKGNoZWNrS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNLZXk9KHZhbCk9PmNoZWNrS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNLZXkoaXNLZXkpO1xuaGFyZGVuKGlzS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge0tleX0gdmFsXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRLZXk9KHZhbCk9PntcbmNoZWNrS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0S2V5KGFzc2VydEtleSk7XG5oYXJkZW4oYXNzZXJ0S2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5U2V0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlTZXQgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5U2V0Pn0gKi9cbmNvbnN0IGNvcHlTZXRNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlTZXQ9KHMsY2hlY2spPT57XG5pZihjb3B5U2V0TWVtby5oYXMocykpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVzdWx0PVxuKHBhc3NTdHlsZU9mKHMpPT09J3RhZ2dlZCcmJmdldFRhZyhzKT09PSdjb3B5U2V0J3x8XG5jaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5U2V0OiAke3N9YCkpJiZcbmNoZWNrRWxlbWVudHMocy5wYXlsb2FkLGNoZWNrKSYmXG5jaGVja0tleShzLnBheWxvYWQsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvcHlTZXRNZW1vLmFkZChzKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlTZXQoY2hlY2tDb3B5U2V0KTtcbmhhcmRlbihjaGVja0NvcHlTZXQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHtzIGlzIENvcHlTZXR9XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlTZXR9ICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0PShzKT0+Y2hlY2tDb3B5U2V0KHMsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuaGFyZGVuKGlzQ29weVNldCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHMgaXMgQ29weVNldH1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlTZXR9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weVNldD0ocyk9PntcbmNoZWNrQ29weVNldChzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5U2V0KGFzc2VydENvcHlTZXQpO1xuaGFyZGVuKGFzc2VydENvcHlTZXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5U2V0S2V5cz0ocyk9PntcbmFzc2VydENvcHlTZXQocyk7XG5yZXR1cm4gcy5wYXlsb2FkO1xuIH07JGjigI1fb25jZS5nZXRDb3B5U2V0S2V5cyhnZXRDb3B5U2V0S2V5cyk7XG5oYXJkZW4oZ2V0Q29weVNldEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5U2V0S2V5PShzLGZuKT0+XG5nZXRDb3B5U2V0S2V5cyhzKS5ldmVyeSgoa2V5LGluZGV4KT0+Zm4oa2V5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlTZXRLZXkoZXZlcnlDb3B5U2V0S2V5KTtcbmhhcmRlbihldmVyeUNvcHlTZXRLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weVNldD0oZWxlbWVudEl0ZXIpPT57XG5jb25zdCByZXN1bHQ9bWFrZVNldE9mRWxlbWVudHMoZWxlbWVudEl0ZXIpO1xuYXNzZXJ0Q29weVNldChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlTZXQobWFrZUNvcHlTZXQpO1xuaGFyZGVuKG1ha2VDb3B5U2V0KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5QmFnIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlCYWcgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5QmFnPn0gKi9cbmNvbnN0IGNvcHlCYWdNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlCYWc9KGIsY2hlY2spPT57XG5pZihjb3B5QmFnTWVtby5oYXMoYikpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVzdWx0PVxuKHBhc3NTdHlsZU9mKGIpPT09J3RhZ2dlZCcmJmdldFRhZyhiKT09PSdjb3B5QmFnJ3x8XG5jaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5QmFnOiAke2J9YCkpJiZcbmNoZWNrQmFnRW50cmllcyhiLnBheWxvYWQsY2hlY2spJiZcbmNoZWNrS2V5KGIucGF5bG9hZCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29weUJhZ01lbW8uYWRkKGIpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrQ29weUJhZyhjaGVja0NvcHlCYWcpO1xuaGFyZGVuKGNoZWNrQ29weUJhZyk7XG5cbi8qKlxuICogQGNhbGxiYWNrIElzQ29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2IgaXMgQ29weUJhZ31cbiAqL1xuXG4vKiogQHR5cGUge0lzQ29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlCYWc9KGIpPT5jaGVja0NvcHlCYWcoYixpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNDb3B5QmFnKGlzQ29weUJhZyk7XG5oYXJkZW4oaXNDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2Fzc2VydHMgYiBpcyBDb3B5QmFnfVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5QmFnPShiKT0+e1xuY2hlY2tDb3B5QmFnKGIsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlCYWcoYXNzZXJ0Q29weUJhZyk7XG5oYXJkZW4oYXNzZXJ0Q29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHJldHVybnMge0NvcHlCYWc8Sz5bJ3BheWxvYWQnXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlCYWdFbnRyaWVzPShiKT0+e1xuYXNzZXJ0Q29weUJhZyhiKTtcbnJldHVybiBiLnBheWxvYWQ7XG4gfTskaOKAjV9vbmNlLmdldENvcHlCYWdFbnRyaWVzKGdldENvcHlCYWdFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5QmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHBhcmFtIHsoZW50cnk6IFtLLCBiaWdpbnRdLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlCYWdFbnRyeT0oYixmbik9PlxuZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LGluZGV4KT0+Zm4oZW50cnksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weUJhZ0VudHJ5KGV2ZXJ5Q29weUJhZ0VudHJ5KTtcbmhhcmRlbihldmVyeUNvcHlCYWdFbnRyeSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weUJhZz0oYmFnRW50cnlJdGVyKT0+e1xuY29uc3QgcmVzdWx0PW1ha2VCYWdPZkVudHJpZXMoYmFnRW50cnlJdGVyKTtcbmFzc2VydENvcHlCYWcocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5QmFnKG1ha2VDb3B5QmFnKTtcbmhhcmRlbihtYWtlQ29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzPShlbGVtZW50SXRlcik9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuY29uc3Qgc29ydGVkPXNvcnRCeVJhbmsoZWxlbWVudEl0ZXIsZnVsbENvbXBhcmUpO1xuLyoqIEB0eXBlIHtbSyxiaWdpbnRdW119ICovXG5jb25zdCBlbnRyaWVzPVtdO1xuZm9yKGxldCBpPTA7aTxzb3J0ZWQubGVuZ3RoOyl7XG5jb25zdCBrPXNvcnRlZFtpXTtcbmxldCBqPWkrMTtcbndoaWxlKGo8c29ydGVkLmxlbmd0aCYmZnVsbENvbXBhcmUoayxzb3J0ZWRbal0pPT09MCl7XG5qKz0xO1xuIH1cbmVudHJpZXMucHVzaChbayxCaWdJbnQoai1pKV0pO1xuaT1qO1xuIH1cbnJldHVybiBtYWtlQ29weUJhZyhlbnRyaWVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlCYWdGcm9tRWxlbWVudHMobWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5TWFwIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlNYXAncyBrZXlzIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weU1hcD59ICovXG5jb25zdCBjb3B5TWFwTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5TWFwPShtLGNoZWNrKT0+e1xuaWYoY29weU1hcE1lbW8uaGFzKG0pKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKCEocGFzc1N0eWxlT2YobSk9PT0ndGFnZ2VkJyYmZ2V0VGFnKG0pPT09J2NvcHlNYXAnKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgTm90IGEgY29weU1hcDogJHttfWApO1xuIH1cbmNvbnN0e3BheWxvYWR9PW07XG5pZihwYXNzU3R5bGVPZihwYXlsb2FkKSE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IGJlIGEgcmVjb3JkOiAke219YCk7XG4gfVxuY29uc3R7a2V5cyx2YWx1ZXMsLi4ucmVzdH09cGF5bG9hZDtcbmNvbnN0IHJlc3VsdD1cbihvd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBvbmx5IGhhdmUgLmtleXMgYW5kIC52YWx1ZXM6ICR7bX1gKSkmJlxuXG5jaGVja0VsZW1lbnRzKGtleXMsY2hlY2spJiZcbmNoZWNrS2V5KGtleXMsY2hlY2spJiYoXG5wYXNzU3R5bGVPZih2YWx1ZXMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgLnZhbHVlcyBtdXN0IGJlIGEgY29weUFycmF5OiAke219YCkpJiYoXG5rZXlzLmxlbmd0aD09PXZhbHVlcy5sZW5ndGh8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGtleXMgYW5kIHZhbHVlczogJHttfWApKTtcblxuaWYocmVzdWx0KXtcbmNvcHlNYXBNZW1vLmFkZChtKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlNYXAoY2hlY2tDb3B5TWFwKTtcbmhhcmRlbihjaGVja0NvcHlNYXApO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlNYXBcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHttIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlNYXB9ICovXG5jb25zdCAgICAgICAgaXNDb3B5TWFwPShtKT0+Y2hlY2tDb3B5TWFwKG0saWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuaGFyZGVuKGlzQ29weU1hcCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlNYXBcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHthc3NlcnRzIG0gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlNYXB9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weU1hcD0obSk9PntcbmNoZWNrQ29weU1hcChtLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5TWFwKGFzc2VydENvcHlNYXApO1xuaGFyZGVuKGFzc2VydENvcHlNYXApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0tbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBLZXlzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbnJldHVybiBtLnBheWxvYWQua2V5cztcbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcEtleXMoZ2V0Q29weU1hcEtleXMpO1xuaGFyZGVuKGdldENvcHlNYXBLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtWW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwVmFsdWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbnJldHVybiBtLnBheWxvYWQudmFsdWVzO1xuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwVmFsdWVzKGdldENvcHlNYXBWYWx1ZXMpO1xuaGFyZGVuKGdldENvcHlNYXBWYWx1ZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBFbnRyaWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbmNvbnN0e1xucGF5bG9hZDp7a2V5cyx2YWx1ZXN9fT1cbm07XG5jb25zdHtsZW5ndGh9PS8qKiBAdHlwZSB7QXJyYXl9ICova2V5cztcbnJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPTA7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmF0b3InLHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8W0ssVl0sdm9pZD59ICovXG5sZXQgcmVzdWx0O1xuaWYoaTxsZW5ndGgpe1xucmVzdWx0PWhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTpba2V5c1tpXSx2YWx1ZXNbaV1dfSk7XG5pKz0xO1xucmV0dXJuIHJlc3VsdDtcbiB9ZWxzZXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH19KTtcblxuIH19KTtcblxuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlNYXBLZXk9KG0sZm4pPT5cbmdldENvcHlNYXBLZXlzKG0pLmV2ZXJ5KChrZXksaW5kZXgpPT5mbihrZXksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weU1hcEtleShldmVyeUNvcHlNYXBLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcGFyYW0geyh2YWx1ZTogViwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5TWFwVmFsdWU9KG0sZm4pPT5cbmdldENvcHlNYXBWYWx1ZXMobSkuZXZlcnkoKHZhbHVlLGluZGV4KT0+Zm4odmFsdWUsaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weU1hcFZhbHVlKGV2ZXJ5Q29weU1hcFZhbHVlKTtcbmhhcmRlbihldmVyeUNvcHlNYXBWYWx1ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIGNvcHlNYXBLZXlTZXQ9KG0pPT5cbi8qIEEgY29weU1hcCdzIGtleXMgYXJlIGFscmVhZHkgaW4gdGhlIGludGVybmFsIGZvcm0gdXNlZCBieSBjb3B5U2V0cy4qL1xubWFrZVRhZ2dlZCgnY29weVNldCcsbS5wYXlsb2FkLmtleXMpOyRo4oCNX29uY2UuY29weU1hcEtleVNldChjb3B5TWFwS2V5U2V0KTtcbmhhcmRlbihjb3B5TWFwS2V5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgVl0+fSBlbnRyaWVzXG4gKiBAcmV0dXJucyB7Q29weU1hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlNYXA9KGVudHJpZXMpPT57XG4vKiBUaGlzIGlzIHdlaXJkLCBidXQgcmV2ZXJzZSByYW5rIHNvcnRpbmcgdGhlIGVudHJpZXMgaXMgYSBnb29kIGZpcnN0IHN0ZXAqL1xuLyogZm9yIGdldHRpbmcgdGhlIHJhbmsgc29ydGVkIGtleXMgdG9nZXRoZXIgd2l0aCB0aGUgdmFsdWVzKi9cbi8qIG9yZ2FuaXplZCBieSB0aG9zZSBrZXlzLiBBbHNvLCBhbW9uZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoKi9cbi8qIGtleXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MsIHRob3NlIGFyZSByYW5rIHNvcnRlZC4qL1xuLyogVE9ETyBUaGlzKi9cbi8qIGNvdWxkIHNvbHZlIHRoZSBjb3B5TWFwIGNvdmVyIGlzc3VlIGV4cGxhaW5lZCBpbiBwYXR0ZXJuTWF0Y2hlcnMuanMuKi9cbi8qIEJ1dCBvbmx5IGlmIHdlIGluY2x1ZGUgdGhpcyBjcml0ZXJpYSBpbiBvdXIgdmFsaWRhdGlvbiBvZiBjb3B5TWFwcywqL1xuLyogd2hpY2ggd2UgY3VycmVudGx5IGRvIG5vdC4qL1xuY29uc3Qgc29ydGVkRW50cmllcz1zb3J0QnlSYW5rKGVudHJpZXMsY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0IGtleXM9c29ydGVkRW50cmllcy5tYXAoKFtrLF92XSk9PmspO1xuY29uc3QgdmFsdWVzPXNvcnRlZEVudHJpZXMubWFwKChbX2ssdl0pPT52KTtcbmNvbnN0IHJlc3VsdD1tYWtlVGFnZ2VkKCdjb3B5TWFwJyx7a2V5cyx2YWx1ZXN9KTtcbmFzc2VydENvcHlNYXAocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5TWFwKG1ha2VDb3B5TWFwKTtcbmhhcmRlbihtYWtlQ29weU1hcCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIFJlY3VyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0tleUludGVybmFsPSh2YWwsY2hlY2spPT57XG5jb25zdCBjaGVja0l0PShjaGlsZCk9PmNoZWNrS2V5KGNoaWxkLGNoZWNrKTtcblxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuLyogQSBjb3B5UmVjb3JkIGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbnJldHVybiBPYmplY3QudmFsdWVzKHZhbCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIEEgY29weUFycmF5IGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbnJldHVybiB2YWwuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4oXG5jaGVja0NvcHlNYXAodmFsLGNoZWNrKSYmXG4vKiBGb3IgYSBjb3B5TWFwIHRvIGJlIGEga2V5LCBhbGwgaXRzIGtleXMgYW5kIHZhbHVlcyBtdXN0Ki9cbi8qIGJlIGtleXMuIEtleXMgYWxyZWFkeSBjaGVja2VkIGJ5IGBjaGVja0NvcHlNYXBgIHNpbmNlKi9cbi8qIHRoYXQncyBhIGNvcHlNYXAgcmVxdWlyZW1lbnQgaW4gZ2VuZXJhbC4qL1xuZXZlcnlDb3B5TWFwVmFsdWUodmFsLGNoZWNrSXQpKTtcblxuIH1cbmRlZmF1bHQ6e1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHt2YWx9YCkpO1xuXG4gfX1cblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG4vKiBBbGwgcmVtb3RhYmxlcyBhcmUga2V5cy4qL1xucmV0dXJuIHRydWU7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBrZXlgKTtcbiB9XG5kZWZhdWx0Ontcbi8qIFVuZXhwZWN0ZWQgdGFncyBhcmUganVzdCBub24ta2V5cywgYnV0IGFuIHVuZXhwZWN0ZWQgcGFzc1N0eWxlKi9cbi8qIGlzIGFsd2F5cyBhbiBlcnJvci4qL1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3ZhbH1gO1xuIH19XG5cbiB9O1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJpbWl0aXZlS2V5IjpbImlzUHJpbWl0aXZlS2V5Il0sImFzc2VydFByaW1pdGl2ZUtleSI6WyJhc3NlcnRQcmltaXRpdmVLZXkiXSwiY2hlY2tTY2FsYXJLZXkiOlsiY2hlY2tTY2FsYXJLZXkiXSwiaXNTY2FsYXJLZXkiOlsiaXNTY2FsYXJLZXkiXSwiYXNzZXJ0U2NhbGFyS2V5IjpbImFzc2VydFNjYWxhcktleSJdLCJjaGVja0tleSI6WyJjaGVja0tleSJdLCJpc0tleSI6WyJpc0tleSJdLCJhc3NlcnRLZXkiOlsiYXNzZXJ0S2V5Il0sImNoZWNrQ29weVNldCI6WyJjaGVja0NvcHlTZXQiXSwiaXNDb3B5U2V0IjpbImlzQ29weVNldCJdLCJhc3NlcnRDb3B5U2V0IjpbImFzc2VydENvcHlTZXQiXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiXSwiZXZlcnlDb3B5U2V0S2V5IjpbImV2ZXJ5Q29weVNldEtleSJdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCJdLCJjaGVja0NvcHlCYWciOlsiY2hlY2tDb3B5QmFnIl0sImlzQ29weUJhZyI6WyJpc0NvcHlCYWciXSwiYXNzZXJ0Q29weUJhZyI6WyJhc3NlcnRDb3B5QmFnIl0sImdldENvcHlCYWdFbnRyaWVzIjpbImdldENvcHlCYWdFbnRyaWVzIl0sImV2ZXJ5Q29weUJhZ0VudHJ5IjpbImV2ZXJ5Q29weUJhZ0VudHJ5Il0sIm1ha2VDb3B5QmFnIjpbIm1ha2VDb3B5QmFnIl0sIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIjpbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sImNoZWNrQ29weU1hcCI6WyJjaGVja0NvcHlNYXAiXSwiaXNDb3B5TWFwIjpbImlzQ29weU1hcCJdLCJhc3NlcnRDb3B5TWFwIjpbImFzc2VydENvcHlNYXAiXSwiZ2V0Q29weU1hcEtleXMiOlsiZ2V0Q29weU1hcEtleXMiXSwiZ2V0Q29weU1hcFZhbHVlcyI6WyJnZXRDb3B5TWFwVmFsdWVzIl0sImdldENvcHlNYXBFbnRyaWVzIjpbImdldENvcHlNYXBFbnRyaWVzIl0sImV2ZXJ5Q29weU1hcEtleSI6WyJldmVyeUNvcHlNYXBLZXkiXSwiZXZlcnlDb3B5TWFwVmFsdWUiOlsiZXZlcnlDb3B5TWFwVmFsdWUiXSwiY29weU1hcEtleVNldCI6WyJjb3B5TWFwS2V5U2V0Il0sIm1ha2VDb3B5TWFwIjpbIm1ha2VDb3B5TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPfmwlF3GgAAdxoAAC0AAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY29tcGFyZUtleXMuanN7ImltcG9ydHMiOlsiLi9jaGVja0tleS5qcyIsIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4vbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJjb21wYXJlS2V5cyIsImtleUVRIiwia2V5R1QiLCJrZXlHVEUiLCJrZXlMVCIsImtleUxURSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixnZXRUYWcsY29tcGFyZVJhbmsscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLGFzc2VydEtleSxiYWdDb21wYXJlLHNldENvbXBhcmU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXSxbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dLFtcIi4vY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXV1dLFtcIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnQ29tcGFyZVwiLCBbJGjigI1fYSA9PiAoYmFnQ29tcGFyZSA9ICRo4oCNX2EpXV1dXSxbXCIuL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcInNldENvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKHNldENvbXBhcmUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyZX0gKi9cbmNvbnN0ICAgICAgICBjb21wYXJlS2V5cz0obGVmdCxyaWdodCk9PntcbmFzc2VydEtleShsZWZ0KTtcbmFzc2VydEtleShyaWdodCk7XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xuLyogRGlmZmVyZW50IHBhc3NTdHlsZXMgYXJlIGluY29tbWVuc3VyYXRlKi9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzp7XG4vKiBmb3IgdGhlc2UsIGtleXMgY29tcGFyZSB0aGUgc2FtZSBhcyByYW5rKi9cbnJldHVybiBjb21wYXJlUmFuayhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ251bWJlcic6e1xuY29uc3QgcmFua0NvbXA9Y29tcGFyZVJhbmsobGVmdCxyaWdodCk7XG5pZihyYW5rQ29tcD09PTApe1xucmV0dXJuIDA7XG4gfVxuaWYoTnVtYmVyLmlzTmFOKGxlZnQpfHxOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbi8qIE5hTiBpcyBlcXVhbCB0byBpdHNlbGYsIGJ1dCBpbmNvbW1lbnN1cmF0ZSB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSovXG5hc3NlcnQoIU51bWJlci5pc05hTihsZWZ0KXx8IU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIE5hTjtcbiB9XG4vKiBBbW9uZyBub24tTmFOIG51bWJlcnMsIGtleSBvcmRlciBpcyB0aGUgc2FtZSBhcyByYW5rIG9yZGVyLiBOb3RlIHRoYXQqL1xuLyogaW4gYm90aCBvcmRlcnMsIGAtMGAgaXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MgYXMgYDBgLiovXG5yZXR1cm4gcmFua0NvbXA7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmlmKGxlZnQ9PT1yaWdodCl7XG5yZXR1cm4gMDtcbiB9XG4vKiBJZiB0d28gcmVtb3RhYmxlcyBhcmUgbm90IGlkZW50aWNhbCwgdGhlbiBhcyBrZXlzIHRoZXkgYXJlKi9cbi8qIGluY29tbWVuc3VyYXRlLiovXG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGtleSBvcmRlci4gUmFuayBvcmRlciBvZiBhcnJheXMgaXMgbGV4aWNvZ3JhcGhpYyBieSovXG4vKiByYW5rIG9yZGVyLiovXG4vKiBCZWNhdXNlIHRoZSBpbnZhcmlhbnRzIGFib3ZlIGFwcGx5IHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXksKi9cbi8qIHRoZXkgYXBwbHkgdG8gdGhlIGFycmF5IGFzIGEgd2hvbGUuKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyZUtleXMobGVmdFtpXSxyaWdodFtpXSk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbi8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyBhcmUga2V5RVEsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbi8qIFRodXMsIGlmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGlzIHNtYWxsZXIgdGhhbiBZLiovXG5yZXR1cm4gY29tcGFyZVJhbmsobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIFBhcmV0byBwYXJ0aWFsIG9yZGVyIGNvbXBhcmlzb24uKi9cbmNvbnN0IGxlZnROYW1lcz1yZWNvcmROYW1lcyhsZWZ0KTtcbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIWtleUVRKGxlZnROYW1lcyxyaWdodE5hbWVzKSl7XG4vKiBJZiB0aGV5IGRvIG5vdCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydGllcywqL1xuLyogdGhleSBhcmUgaW5jb21tZW5zdXJhdGUuKi9cbi8qIE5vdGUgdGhhdCByYW5rIHNvcnRpbmcgb2YgY29weVJlY29yZHMgZ3JvdXBzIGFsbCBjb3B5UmVjb3JkcyB3aXRoKi9cbi8qIHRoZSBzYW1lIGtleXMgdG9nZXRoZXIsIGVuYWJsaW5nIHJhbmdlIHNlYXJjaGluZyBvdmVyIGNvcHlSZWNvcmRzKi9cbi8qIHRvIGF2b2lkIG1vcmUgaXJyZWxldmFudCBvbmVzLiovXG5yZXR1cm4gTmFOO1xuIH1cbmNvbnN0IGxlZnRWYWx1ZXM9cmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKTtcbmNvbnN0IHJpZ2h0VmFsdWVzPXJlY29yZFZhbHVlcyhyaWdodCxyaWdodE5hbWVzKTtcbi8qIFByZXN1bWUgdGhhdCBib3RoIGNvcHlSZWNvcmRzIGhhdmUgdGhlIHNhbWUga2V5IG9yZGVyKi9cbi8qIHVudGlsIGVuY291bnRlcmluZyBhIHByb3BlcnR5IGRpc3Byb3ZpbmcgdGhhdCBoeXBvdGhlc2lzLiovXG5sZXQgcmVzdWx0PTA7XG5mb3IobGV0IGk9MDtpPGxlZnRWYWx1ZXMubGVuZ3RoO2krPTEpe1xuY29uc3QgY29tcD1jb21wYXJlS2V5cyhsZWZ0VmFsdWVzW2ldLHJpZ2h0VmFsdWVzW2ldKTtcbmlmKE51bWJlci5pc05hTihjb21wKSl7XG5yZXR1cm4gTmFOO1xuIH1cbmlmKHJlc3VsdCE9PWNvbXAmJmNvbXAhPT0wKXtcbmlmKHJlc3VsdD09PTApe1xucmVzdWx0PWNvbXA7XG4gfWVsc2V7XG5hc3NlcnQoXG5yZXN1bHQ9PT0tMSYmY29tcD09PTF8fHJlc3VsdD09PTEmJmNvbXA9PT0tMSk7XG5cbnJldHVybiBOYU47XG4gfVxuIH1cbiB9XG4vKiBJZiBjb3B5UmVjb3JkIFggaXMgc21hbGxlciB0aGFuIGNvcHlSZWNvcmQgWSwgdGhlbiB0aGV5IG11c3QgaGF2ZSB0aGUqL1xuLyogc2FtZSBwcm9wZXJ0eSBuYW1lcyBhbmQgZXZlcnkgdmFsdWUgaW4gWCBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8qL1xuLyogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gWSAod2l0aCBhdCBsZWFzdCBvbmUgdmFsdWUgc21hbGxlcikuKi9cbi8qIFRoZSByYW5rIG9yZGVyIG9mIFggYW5kIFkgaXMgYmFzZWQgb24gbGV4aWNvZ3JhcGhpYyByYW5rIG9yZGVyIG9mKi9cbi8qIHRoZWlyIHZhbHVlcywgYXMgb3JnYW5pemVkIGJ5IHJldmVyc2UgbGV4aWNvZ3JhcGhpYyBvcmRlciBvZiB0aGVpciovXG4vKiBwcm9wZXJ0eSBuYW1lcy4qL1xuLyogVGh1cyBpZiBjb21wYXJlS2V5cyhYLFkpIDwgMCB0aGVuIGNvbXBhcmVSYW5rKFgsWSkgPCAwLiovXG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCBsZWZ0VGFnPWdldFRhZyhsZWZ0KTtcbmNvbnN0IHJpZ2h0VGFnPWdldFRhZyhyaWdodCk7XG5pZihsZWZ0VGFnIT09cmlnaHRUYWcpe1xuLyogZGlmZmVyZW50IHRhZ3MgYXJlIGluY29tbWVuc3VyYXRlKi9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRUYWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG4vKiBjb3B5U2V0IFggaXMgc21hbGxlciB0aGFuIGNvcHlTZXQgWSB3aGVuIGV2ZXJ5IGVsZW1lbnQgb2YgWCovXG4vKiBpcyBrZXlFUSB0byBzb21lIGVsZW1lbnQgb2YgWSBhbmQgc29tZSBlbGVtZW50IG9mIFkgaXMqL1xuLyogbm90IGtleUVRIHRvIGFueSBlbGVtZW50IG9mIFguKi9cbnJldHVybiBzZXRDb21wYXJlKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnY29weUJhZyc6e1xuLyogY29weUJhZyBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5QmFnIFkgd2hlbiBldmVyeSBlbGVtZW50IG9mIFgqL1xuLyogb2NjdXJzIG5vIG1vcmUgdGhhbiB0aGUga2V5RVEgZWxlbWVudCBvZiBZLCBhbmQgc29tZSBlbGVtZW50Ki9cbi8qIG9mIFkgb2NjdXJzIG1vcmUgdGhhbiBzb21lIGVsZW1lbnQgb2YgWCwgd2hlcmUgYmVpbmcgYWJzZW50Ki9cbi8qIGZyb20gWCBjb3VudHMgYXMgb2NjdXJyaW5nIHplcm8gdGltZXMuKi9cbnJldHVybiBiYWdDb21wYXJlKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogVHdvIGNvcHlNYXBzIHRoYXQgaGF2ZSBkaWZmZXJlbnQga2V5cyAoYWNjb3JkaW5nIHRvIGtleUVRKSBhcmUqL1xuLyogaW5jb21tZW5zdXJhdGUuIFRoZSByZXByZXNlbnRhdGlvbiBvZiBjb3B5TWFwcyBpbmNsdWRlcyB0aGUga2V5cyovXG4vKiBmaXJzdCwgaW4gdGhlIHNhbWUgcmV2ZXJzZSByYW5rIG9yZGVyIHVzZWQgYnkgc2V0cy4gVGh1cywgYWxsKi9cbi8qIGNvcHlNYXBzIHdpdGgga2V5cyBvZiB0aGUgc2FtZSByYW5rICh3aGljaCBpcyovXG4vKiBsZXNzIHByZWNpc2UhKSB3aWxsIGJlIGdyb3VwZWQgdG9nZXRoZXIgd2hlbiBjb3B5TWFwcyBhcmUgc29ydGVkKi9cbi8qIGJ5IHJhbmssIG1pbmltaXppbmcgdGhlIG51bWJlciBvZiBtaXNzZXMgd2hlbiByYW5nZSBzZWFyY2hpbmcuKi9cbi8qKi9cbi8qIEFtb25nIGNvcHlNYXBzIHdpdGggdGhlIHNhbWUga2V5cyAoYWNjb3JkaW5nIHRvIGtleUVRKSwgdGhleSovXG4vKiBjb21wYXJlIGJ5IGEgY29ycmVzcG9uZGluZyBjb21wYXJpc29uIG9mIHRoZWlyIHZhbHVlcy4gVGh1cywgYXMqL1xuLyogd2l0aCByZWNvcmRzLCBmb3IgdHdvIGNvcHlNYXBzIFggYW5kIFksIGlmIGBjb21wYXJlS2V5cyhYLFkpIDwqL1xuLyogMGAgdGhlbiwgYmVjYXVzZSB0aGVzZSB2YWx1ZXMgb2JleSB0aGUgYWJvdmUgaW52YXJpYW50cywgbm9uZSBvZiovXG4vKiB0aGUgdmFsdWVzIGluIFggaGF2ZSBhIGxhdGVyIHJhbmsgdGhhbiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSovXG4vKiBvZiBZLiBUaHVzLCBgY29tcGFyZVJhbmsoWCxZKSA8PSAwYC4gVE9ETyBpbXBsZW1lbnQqL1xudGhyb3cgRmFpbCBgTWFwIGNvbXBhcmlzb24gbm90IHlldCBpbXBsZW1lbnRlZDogJHtsZWZ0fSB2cyAke3JpZ2h0fWA7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHRhZyAke3EobGVmdFRhZyl9OiAke2xlZnR9YDtcbiB9fVxuXG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EobGVmdFN0eWxlKX06ICR7bGVmdH1gO1xuIH19XG5cbiB9OyRo4oCNX29uY2UuY29tcGFyZUtleXMoY29tcGFyZUtleXMpO1xuaGFyZGVuKGNvbXBhcmVLZXlzKTtcblxuY29uc3QgICAgICAgIGtleUxUPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk8MDskaOKAjV9vbmNlLmtleUxUKGtleUxUKTtcbmhhcmRlbihrZXlMVCk7XG5cbmNvbnN0ICAgICAgICBrZXlMVEU9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KTw9MDskaOKAjV9vbmNlLmtleUxURShrZXlMVEUpO1xuaGFyZGVuKGtleUxURSk7XG5cbmNvbnN0ICAgICAgICBrZXlFUT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPT09MDskaOKAjV9vbmNlLmtleUVRKGtleUVRKTtcbmhhcmRlbihrZXlFUSk7XG5cbmNvbnN0ICAgICAgICBrZXlHVEU9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT49MDskaOKAjV9vbmNlLmtleUdURShrZXlHVEUpO1xuaGFyZGVuKGtleUdURSk7XG5cbmNvbnN0ICAgICAgICBrZXlHVD0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPjA7JGjigI1fb25jZS5rZXlHVChrZXlHVCk7XG5oYXJkZW4oa2V5R1QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvbXBhcmVLZXlzIjpbImNvbXBhcmVLZXlzIl0sImtleUxUIjpbImtleUxUIl0sImtleUxURSI6WyJrZXlMVEUiXSwia2V5RVEiOlsia2V5RVEiXSwia2V5R1RFIjpbImtleUdURSJdLCJrZXlHVCI6WyJrZXlHVCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABVIML9KhQAACoUAAApAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL2NvcHlCYWcuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFzc2VydEJhZ0VudHJpZXMiLCJhc3NlcnROb0R1cGxpY2F0ZUtleXMiLCJjaGVja0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiLCJtYWtlQmFnT2ZFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChpc1JhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbi8qKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5QmFnPEs+fSBDb3B5QmFnICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5fSBLZXkgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5XG4gKiBrbm93biB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdFxuICogcmF0aGVyIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmVcbiAqIGFycmF5IGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlLWtleXMgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZUtleXM9KGJhZ0VudHJpZXMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuLyogU2luY2UgdGhlIGtleSBpcyBtb3JlIHNpZ25pZmljYW50IHRoYW4gdGhlIHZhbHVlICh0aGUgY291bnQpLCovXG4vKiBzb3J0aW5nIGJ5IGZ1bGxPcmRlciBpcyBndWFyYW50ZWVkIHRvIG1ha2UgZHVwbGljYXRlIGtleXMqL1xuLyogYWRqYWNlbnQgaW5kZXBlbmRlbnQgb2YgdGhlaXIgY291bnRzLiovXG5iYWdFbnRyaWVzPXNvcnRCeVJhbmsoYmFnRW50cmllcyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5mb3IobGV0IGk9MTtpPGxlbmd0aDtpKz0xKXtcbmNvbnN0IGswPWJhZ0VudHJpZXNbaS0xXVswXTtcbmNvbnN0IGsxPWJhZ0VudHJpZXNbaV1bMF07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlIGtleXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBbZnVsbENvbXBhcmVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlS2V5cz0oYmFnRW50cmllcyxmdWxsQ29tcGFyZT11bmRlZmluZWQpPT57XG5jaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKGFzc2VydE5vRHVwbGljYXRlS2V5cyk7XG5jb25zdCAgICAgICAgY2hlY2tCYWdFbnRyaWVzPShiYWdFbnRyaWVzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoYmFnRW50cmllcykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIGEgY29weUFycmF5OiAke2JhZ0VudHJpZXN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rKSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7YmFnRW50cmllc31gKTtcblxuIH1cbmZvcihjb25zdCBlbnRyeSBvZiBiYWdFbnRyaWVzKXtcbmlmKFxucGFzc1N0eWxlT2YoZW50cnkpIT09J2NvcHlBcnJheSd8fFxuZW50cnkubGVuZ3RoIT09Mnx8XG50eXBlb2YgZW50cnlbMV0hPT0nYmlnaW50JylcbntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBiZSBwYWlyIG9mIGEga2V5IGFuZCBhIGJpZ2ludCByZXByZXNlbnRpbmcgYSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbmlmKGVudHJ5WzFdPDEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyx1bmRlZmluZWQsY2hlY2spO1xuIH07JGjigI1fb25jZS5jaGVja0JhZ0VudHJpZXMoY2hlY2tCYWdFbnRyaWVzKTtcbmhhcmRlbihjaGVja0JhZ0VudHJpZXMpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrIC0tIGRvZXNuJ3QgdW5kZXJzdGFuZCBhc3NlcnRzKi9cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiYWdFbnRyaWVzIGlzIFtQYXNzYWJsZSxiaWdpbnRdW119XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRCYWdFbnRyaWVzPShiYWdFbnRyaWVzKT0+e1xuY2hlY2tCYWdFbnRyaWVzKGJhZ0VudHJpZXMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEJhZ0VudHJpZXMoYXNzZXJ0QmFnRW50cmllcyk7XG5oYXJkZW4oYXNzZXJ0QmFnRW50cmllcyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0JhZ0VudHJpZXM9KGJhZ0VudHJpZXNMaXN0KT0+e1xuY29uc3QgYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXNMaXN0LGNvbXBhcmVBbnRpUmFuayk7XG5hc3NlcnRCYWdFbnRyaWVzKGJhZ0VudHJpZXMpO1xucmV0dXJuIGJhZ0VudHJpZXM7XG4gfTskaOKAjV9vbmNlLmNvZXJjZVRvQmFnRW50cmllcyhjb2VyY2VUb0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNvZXJjZVRvQmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUJhZ09mRW50cmllcz0oYmFnRW50cnlJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5QmFnJyxjb2VyY2VUb0JhZ0VudHJpZXMoYmFnRW50cnlJdGVyKSk7JGjigI1fb25jZS5tYWtlQmFnT2ZFbnRyaWVzKG1ha2VCYWdPZkVudHJpZXMpO1xuaGFyZGVuKG1ha2VCYWdPZkVudHJpZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACh3+v6MQAACjEAAAKQAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMva2V5cy9jb3B5U2V0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhc3NlcnRFbGVtZW50cyIsImFzc2VydE5vRHVwbGljYXRlcyIsImNoZWNrRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIiwibWFrZVNldE9mRWxlbWVudHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuazskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuLyoqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkNvcHlTZXQ8Sz59IENvcHlTZXQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXl9IEtleSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBlbGVtZW50c2AgaXMgYWxyZWFkeSBrbm93blxuICogdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXQgcmF0aGVyXG4gKiB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlIGFycmF5XG4gKiBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZSBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlcz0oZWxlbWVudHMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50cyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWVsZW1lbnRzO1xuZm9yKGxldCBpPTE7aTxsZW5ndGg7aSs9MSl7XG5jb25zdCBrMD1lbGVtZW50c1tpLTFdO1xuY29uc3QgazE9ZWxlbWVudHNbaV07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlczogJHtrMH1gKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBbZnVsbENvbXBhcmVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlcz0oZWxlbWVudHMsZnVsbENvbXBhcmU9dW5kZWZpbmVkKT0+e1xuY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsZnVsbENvbXBhcmUsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVzKGFzc2VydE5vRHVwbGljYXRlcyk7XG5jb25zdCAgICAgICAgY2hlY2tFbGVtZW50cz0oZWxlbWVudHMsY2hlY2spPT57XG5pZihwYXNzU3R5bGVPZihlbGVtZW50cykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7ZWxlbWVudHN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuaykpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7ZWxlbWVudHN9YCk7XG5cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsdW5kZWZpbmVkLGNoZWNrKTtcbiB9OyRo4oCNX29uY2UuY2hlY2tFbGVtZW50cyhjaGVja0VsZW1lbnRzKTtcbmhhcmRlbihjaGVja0VsZW1lbnRzKTtcblxuY29uc3QgICAgICAgIGFzc2VydEVsZW1lbnRzPShlbGVtZW50cyk9PntcbmNoZWNrRWxlbWVudHMoZWxlbWVudHMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEVsZW1lbnRzKGFzc2VydEVsZW1lbnRzKTtcbmhhcmRlbihhc3NlcnRFbGVtZW50cyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0VsZW1lbnRzPShlbGVtZW50c0xpc3QpPT57XG5jb25zdCBlbGVtZW50cz1zb3J0QnlSYW5rKGVsZW1lbnRzTGlzdCxjb21wYXJlQW50aVJhbmspO1xuYXNzZXJ0RWxlbWVudHMoZWxlbWVudHMpO1xucmV0dXJuIGVsZW1lbnRzO1xuIH07JGjigI1fb25jZS5jb2VyY2VUb0VsZW1lbnRzKGNvZXJjZVRvRWxlbWVudHMpO1xuaGFyZGVuKGNvZXJjZVRvRWxlbWVudHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0T2ZFbGVtZW50cz0oZWxlbWVudEl0ZXIpPT5cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLGNvZXJjZVRvRWxlbWVudHMoZWxlbWVudEl0ZXIpKTskaOKAjV9vbmNlLm1ha2VTZXRPZkVsZW1lbnRzKG1ha2VTZXRPZkVsZW1lbnRzKTtcbmhhcmRlbihtYWtlU2V0T2ZFbGVtZW50cyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVzIjpbImFzc2VydE5vRHVwbGljYXRlcyJdLCJjaGVja0VsZW1lbnRzIjpbImNoZWNrRWxlbWVudHMiXSwiYXNzZXJ0RWxlbWVudHMiOlsiYXNzZXJ0RWxlbWVudHMiXSwiY29lcmNlVG9FbGVtZW50cyI6WyJjb2VyY2VUb0VsZW1lbnRzIl0sIm1ha2VTZXRPZkVsZW1lbnRzIjpbIm1ha2VTZXRPZkVsZW1lbnRzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAsonm15JQAAeSUAADUAAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyIuL2NvcHlCYWcuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYmFnQ29tcGFyZSIsImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJc0Rpc2pvaW50IiwiYmFnSXNTdXBlcmJhZyIsImJhZ1VuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzLG1ha2VCYWdPZkVudHJpZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlS2V5c1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyaXNvbn0gS2V5Q29tcGFyaXNvbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG5cbi8qIEJhc2VkIG9uIG1lcmdlLXNldC1vcGVyYXRvcnMuanMsIGJ1dCBhbHRlcmVkIGZvciB0aGUgYmFnIHJlcHJlc2VudGF0aW9uLiovXG4vKiBUT0RPIHNoYXJlIG1vcmUgY29kZSB3aXRoIG1lcmdlLXNldC1vcGVyYXRvcnMuanMsIHJhdGhlciB0aGFuKi9cbi8qIGR1cGxpY2F0aW5nIHdpdGggY2hhbmdlcy4qL1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZVxuICogdGhlcmVcbiAqIG1heSBiZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgYmFnRW50cmllcyB3aG9zZSBrZXlzIGFyZSB0aWVkIGZvciB0aGUgc2FtZVxuICogcmFuay5cbiAqIFJldHVybnMgYW4gaXRlcmFibGUgdGhhdCB3aWxsIGVudW1lcmF0ZSBhbGwgdGhlIGJhZ0VudHJpZXMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBiYWdFbnRyaWVzYCBhcnJheVxuICogYWNjb3JkaW5nXG4gKiB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludF0+fVxuICovXG5jb25zdCBiYWdXaW5kb3dSZXNvcnQ9KGJhZ0VudHJpZXMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG5hc3NlcnRSYW5rU29ydGVkKGJhZ0VudHJpZXMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1iYWdFbnRyaWVzO1xubGV0IGk9MDtcbmxldCBvcHRJbm5lckl0ZXJhdG9yO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+XG5oYXJkZW4oe1xubmV4dDooKT0+e1xuaWYob3B0SW5uZXJJdGVyYXRvcil7XG5jb25zdCByZXN1bHQ9b3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG5pZihyZXN1bHQuZG9uZSl7XG5vcHRJbm5lckl0ZXJhdG9yPXVuZGVmaW5lZDtcbi8qIGZhbGwgdGhyb3VnaCovXG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5pZihpPGxlbmd0aCl7XG5jb25zdCBlbnRyeT1iYWdFbnRyaWVzW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoXG5qPGxlbmd0aCYmXG5yYW5rQ29tcGFyZShlbnRyeVswXSxiYWdFbnRyaWVzW2pdWzBdKT09PTApXG57XG5qKz0xO1xuIH1cbmlmKGo9PT1pKzEpe1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTplbnRyeX0pO1xuIH1cbmNvbnN0IHNpbWlsYXJSdW49YmFnRW50cmllcy5zbGljZShpLGopO1xuaT1qO1xuY29uc3QgcmVzb3J0ZWQ9c29ydEJ5UmFuayhzaW1pbGFyUnVuLGZ1bGxDb21wYXJlKTtcbi8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbi8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbi8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbmFzc2VydE5vRHVwbGljYXRlS2V5cyhyZXNvcnRlZCxmdWxsQ29tcGFyZSk7XG4vKiBUaGlzIGlzIHRoZSByYXcgSlMgYXJyYXkgaXRlcmF0b3Igd2hvc2UgYC5uZXh0KClgIG1ldGhvZCovXG4vKiBkb2VzIG5vdCBoYXJkZW4gdGhlIEl0ZXJhdG9yUmVzdWx0LCBpbiB2aW9sYXRpb24gb2Ygb3VyKi9cbi8qIGNvbnZlbnRpb25zLiBGaXhpbmcgdGhpcyBpcyBleHBlbnNpdmUgYW5kIEknbSBjb25maWRlbnQgdGhlKi9cbi8qIHVuZnJvemVuIHZhbHVlIGRvZXMgbm90IGVzY2FwZSB0aGlzIGZpbGUsIHNvIEknbSBsZWF2aW5nIHRoaXMqL1xuLyogYXMgaXMuKi9cbm9wdElubmVySXRlcmF0b3I9cmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOltudWxsLDBuXX0pO1xuIH1cbiB9fSl9KTtcblxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHhiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geWJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59XG4gKi9cbmNvbnN0IG1lcmdlPSh4YmFnRW50cmllcyx5YmFnRW50cmllcyk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPWJhZ1dpbmRvd1Jlc29ydCh4YmFnRW50cmllcyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xuY29uc3QgeXM9YmFnV2luZG93UmVzb3J0KHliYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG4vKiBUaGVzZSBzaXggYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbi8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHg7XG5sZXQgeGM7XG5sZXQgeERvbmU7XG4vKiogQHR5cGUge1R9ICovXG5sZXQgeTtcbmxldCB5YztcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe1xuZG9uZTp4RG9uZSxcbnZhbHVlOlt4LHhjXX09XG54aS5uZXh0KCkpO1xuIH07XG5uZXh0WCgpO1xuXG5jb25zdCB5aT15c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WT0oKT0+e1xuIXlEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7XG5kb25lOnlEb25lLFxudmFsdWU6W3kseWNdfT1cbnlpLm5leHQoKSk7XG4gfTtcbm5leHRZKCk7XG5cbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtib29sZWFufSAqL1xubGV0IGRvbmU9ZmFsc2U7XG4vKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbnZhbHVlPVtudWxsLDBuLDBuXTtcbiB9ZWxzZSBpZih4RG9uZSl7XG4vKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt5LDBuLHljXTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoeURvbmUpe1xuLyogb25seSB4cyBhcmUgbGVmdCovXG52YWx1ZT1beCx4Yywwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuY29uc3QgY29tcD1mdWxsQ29tcGFyZSh4LHkpO1xuaWYoY29tcD09PTApe1xuLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xudmFsdWU9W3gseGMseWNdO1xubmV4dFgoKTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoY29tcDwwKXtcbi8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbnZhbHVlPVt4LHhjLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG4vKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG5jb21wPjB8fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG52YWx1ZT1beSwwbix5Y107XG5uZXh0WSgpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lLHZhbHVlfSk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTtcbmhhcmRlbihtZXJnZSk7XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNTdXBlcnNldCBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc1N1cGVyYmFnPSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPHljKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzRGlzam9pbnQgYXMgd2VsbC4qL1xuLyogVGhlIGNvZGUgaXMgaWRlbnRpY2FsLiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgYmFnSXRlcklzRGlzam9pbnQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVyQ29tcGFyZSBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge0tleUNvbXBhcmlzb259XG4gKi9cbmNvbnN0IGJhZ0l0ZXJDb21wYXJlPSh4eWkpPT57XG5sZXQgbG9uZVk9ZmFsc2U7XG5sZXQgbG9uZVg9ZmFsc2U7XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPHljKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xubG9uZVk9dHJ1ZTtcbiB9XG5pZih4Yz55Yyl7XG4vKiBzb21ldGhpbmcgaW4geCBpcyBub3QgaW4geSwgc28geSBpcyBub3QgYSBzdXBlcmJhZyBvZiB4Ki9cbmxvbmVYPXRydWU7XG4gfVxuaWYobG9uZVgmJmxvbmVZKXtcbnJldHVybiBOYU47XG4gfVxuIH1cbmlmKGxvbmVYKXtcbnJldHVybiAxO1xuIH1lbHNlIGlmKGxvbmVZKXtcbnJldHVybi0xO1xuIH1lbHNle1xuIWxvbmVYJiYhbG9uZVl8fFxuRmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsbG9uZVldKX1gO1xucmV0dXJuIDA7XG4gfVxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50LGJpZ2ludF1bXX0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVyVW5pb249KHh5aSk9Pntcbi8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnJlc3VsdC5wdXNoKFttLHhjK3ljXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVySW50ZXJzZWN0aW9uPSh4eWkpPT57XG4vKiogQHR5cGUge1tULGJpZ2ludF1bXX0gKi9cbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5jb25zdCBtYz14Yzw9eWM/eGM6eWM7XG5yZXN1bHQucHVzaChbbSxtY10pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1tULGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgYmFnSXRlckRpc2pvaW50U3VidHJhY3Q9KHh5aSk9Pntcbi8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmNvbnN0IG1jPXhjLXljO1xubWM+PTBufHxGYWlsIGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbmlmKG1jPj0xbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2goW20sbWNdKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBtZXJnZWlmeT0oYmFnSXRlck9wKT0+KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+XG5iYWdJdGVyT3AobWVyZ2UoeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpKTtcblxuY29uc3QgYmFnRW50cmllc0lzU3VwZXJiYWc9bWVyZ2VpZnkoYmFnSXRlcklzU3VwZXJiYWcpO1xuY29uc3QgYmFnRW50cmllc0lzRGlzam9pbnQ9bWVyZ2VpZnkoYmFnSXRlcklzRGlzam9pbnQpO1xuY29uc3QgYmFnRW50cmllc0NvbXBhcmU9bWVyZ2VpZnkoYmFnSXRlckNvbXBhcmUpO1xuY29uc3QgYmFnRW50cmllc1VuaW9uPW1lcmdlaWZ5KGJhZ0l0ZXJVbmlvbik7XG5jb25zdCBiYWdFbnRyaWVzSW50ZXJzZWN0aW9uPW1lcmdlaWZ5KGJhZ0l0ZXJJbnRlcnNlY3Rpb24pO1xuY29uc3QgYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3Q9bWVyZ2VpZnkoYmFnSXRlckRpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdCYWdpZnk9KGJhZ0VudHJpZXNPcCk9Pih4YmFnLHliYWcpPT5cbmJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKTtcblxuY29uc3QgYmFnaWZ5PShiYWdFbnRyaWVzT3ApPT4oeGJhZyx5YmFnKT0+XG5tYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBiYWdJc1N1cGVyYmFnPXJhd0JhZ2lmeShiYWdFbnRyaWVzSXNTdXBlcmJhZyk7JGjigI1fb25jZS5iYWdJc1N1cGVyYmFnKGJhZ0lzU3VwZXJiYWcpO1xuY29uc3QgICAgICAgIGJhZ0lzRGlzam9pbnQ9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc0Rpc2pvaW50KTskaOKAjV9vbmNlLmJhZ0lzRGlzam9pbnQoYmFnSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgYmFnQ29tcGFyZT1yYXdCYWdpZnkoYmFnRW50cmllc0NvbXBhcmUpOyRo4oCNX29uY2UuYmFnQ29tcGFyZShiYWdDb21wYXJlKTtcbmNvbnN0ICAgICAgICBiYWdVbmlvbj1iYWdpZnkoYmFnRW50cmllc1VuaW9uKTskaOKAjV9vbmNlLmJhZ1VuaW9uKGJhZ1VuaW9uKTtcbmNvbnN0ICAgICAgICBiYWdJbnRlcnNlY3Rpb249YmFnaWZ5KGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2UuYmFnSW50ZXJzZWN0aW9uKGJhZ0ludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgYmFnRGlzam9pbnRTdWJ0cmFjdD1iYWdpZnkoYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2UuYmFnRGlzam9pbnRTdWJ0cmFjdChiYWdEaXNqb2ludFN1YnRyYWN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJiYWdJc1N1cGVyYmFnIjpbImJhZ0lzU3VwZXJiYWciXSwiYmFnSXNEaXNqb2ludCI6WyJiYWdJc0Rpc2pvaW50Il0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSJdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiJdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIl0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAi9nVSnigAAJ4oAAA1AAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiLi9jb3B5U2V0LmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsInNldENvbXBhcmUiLCJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRVbmlvbiIsInNldEludGVyc2VjdGlvbiIsInNldElzRGlzam9pbnQiLCJzZXRJc1N1cGVyc2V0Iiwic2V0VW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxhc3NlcnROb0R1cGxpY2F0ZXMsbWFrZVNldE9mRWxlbWVudHM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlc1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVzID0gJGjigI1fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXlDb21wYXJpc29ufSBLZXlDb21wYXJpc29uICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5SYW5rQ29tcGFyZX0gUmFua0NvbXBhcmUgKi9cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGVsZW1lbnRzIHRpZWQgZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBlbGVtZW50cyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGVsZW1lbnRzYCBhcnJheSBhY2NvcmRpbmdcbiAqICB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3Qgd2luZG93UmVzb3J0PShlbGVtZW50cyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoZWxlbWVudHMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmxldCBpPTA7XG5sZXQgb3B0SW5uZXJJdGVyYXRvcjtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PlxuaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKG9wdElubmVySXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PW9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuaWYocmVzdWx0LmRvbmUpe1xub3B0SW5uZXJJdGVyYXRvcj11bmRlZmluZWQ7XG4vKiBmYWxsIHRocm91Z2gqL1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgdmFsdWU9ZWxlbWVudHNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShqPGxlbmd0aCYmcmFua0NvbXBhcmUodmFsdWUsZWxlbWVudHNbal0pPT09MCl7XG5qKz0xO1xuIH1cbmlmKGo9PT1pKzEpe1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbmNvbnN0IHNpbWlsYXJSdW49ZWxlbWVudHMuc2xpY2UoaSxqKTtcbmk9ajtcbmNvbnN0IHJlc29ydGVkPXNvcnRCeVJhbmsoc2ltaWxhclJ1bixmdWxsQ29tcGFyZSk7XG4vKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4vKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4vKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG5hc3NlcnROb0R1cGxpY2F0ZXMocmVzb3J0ZWQsZnVsbENvbXBhcmUpO1xuLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4vKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4vKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbi8qIGFzIGlzLiovXG5vcHRJbm5lckl0ZXJhdG9yPXJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTpudWxsfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0geGVsZW1lbnRzXG4gKiBAcGFyYW0ge1RbXX0geWVsZW1lbnRzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZT0oeGVsZW1lbnRzLHllbGVtZW50cyk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPXdpbmRvd1Jlc29ydCh4ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHlzPXdpbmRvd1Jlc29ydCh5ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pntcbi8qIFRoZXNlIGZvdXIgYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbi8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHg7XG5sZXQgeERvbmU7XG4vKiogQHR5cGUge1R9ICovXG5sZXQgeTtcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eERvbmUsdmFsdWU6eH09eGkubmV4dCgpKTtcbiB9O1xubmV4dFgoKTtcblxuY29uc3QgeWk9eXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFk9KCk9PntcbiF5RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eURvbmUsdmFsdWU6eX09eWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge2Jvb2xlYW59ICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xudmFsdWU9W251bGwsMG4sMG5dO1xuIH1lbHNlIGlmKHhEb25lKXtcbi8qIG9ubHkgeXMgYXJlIGxlZnQqL1xudmFsdWU9W3ksMG4sMW5dO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG52YWx1ZT1beCwxbiwxbl07XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xudmFsdWU9W3gsMW4sMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbi8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbmNvbXA+MHx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuY29uc3QgaXRlcklzU3VwZXJzZXQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4YyxfeWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge0tleUNvbXBhcmlzb259XG4gKi9cbmNvbnN0IGl0ZXJDb21wYXJlPSh4eWkpPT57XG5sZXQgbG9uZVk9ZmFsc2U7XG5sZXQgbG9uZVg9ZmFsc2U7XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG5sb25lWT10cnVlO1xuIH1cbmlmKHljPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHggaXMgbm90IGluIHksIHNvIHkgaXMgbm90IGEgc3VwZXJzZXQgb2YgeCovXG5sb25lWD10cnVlO1xuIH1cbmlmKGxvbmVYJiZsb25lWSl7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG5pZihsb25lWCl7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihsb25lWSl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbiFsb25lWCYmIWxvbmVZfHxcbkZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLGxvbmVZXSl9YDtcbnJldHVybiAwO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyVW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MG4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MG58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbi8qIGlmIHggYW5kIHkgd2VyZSBib3RoIHJlYWR5LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50IGFuZCovXG4vKiBhYm92ZSBjbGF1c2UgYWxyZWFkeSB0b29rIGNhcmUgb2YgaXQuIE90aGVyd2lzZSBwdXNoIGhlcmUuKi9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFVuaW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xueGM9PT0wbnx8eWM9PT0wbnx8RmFpbCBgU2V0cyBtdXN0IG5vdCBoYXZlIGNvbW1vbiBlbGVtZW50czogJHttfWA7XG5pZih4Yz49MW4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MW58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJJbnRlcnNlY3Rpb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBJZiB0aGV5IGFyZSBib3RoIHByZXNlbnQsIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlckRpc2pvaW50U3VidHJhY3Q9KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG54Yz49MW58fEZhaWwgYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuaWYoeWM9PT0wbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgbWVyZ2VpZnk9KGl0ZXJPcCk9Pih4ZWxlbWVudHMseWVsZW1lbnRzKT0+XG5pdGVyT3AobWVyZ2UoeGVsZW1lbnRzLHllbGVtZW50cykpO1xuXG5jb25zdCAgICAgICAgZWxlbWVudHNJc1N1cGVyc2V0PW1lcmdlaWZ5KGl0ZXJJc1N1cGVyc2V0KTskaOKAjV9vbmNlLmVsZW1lbnRzSXNTdXBlcnNldChlbGVtZW50c0lzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzSXNEaXNqb2ludD1tZXJnZWlmeShpdGVySXNEaXNqb2ludCk7JGjigI1fb25jZS5lbGVtZW50c0lzRGlzam9pbnQoZWxlbWVudHNJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0NvbXBhcmU9bWVyZ2VpZnkoaXRlckNvbXBhcmUpOyRo4oCNX29uY2UuZWxlbWVudHNDb21wYXJlKGVsZW1lbnRzQ29tcGFyZSk7XG5jb25zdCAgICAgICAgZWxlbWVudHNVbmlvbj1tZXJnZWlmeShpdGVyVW5pb24pOyRo4oCNX29uY2UuZWxlbWVudHNVbmlvbihlbGVtZW50c1VuaW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0Rpc2pvaW50VW5pb249bWVyZ2VpZnkoaXRlckRpc2pvaW50VW5pb24pOyRo4oCNX29uY2UuZWxlbWVudHNEaXNqb2ludFVuaW9uKGVsZW1lbnRzRGlzam9pbnRVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNJbnRlcnNlY3Rpb249bWVyZ2VpZnkoaXRlckludGVyc2VjdGlvbik7JGjigI1fb25jZS5lbGVtZW50c0ludGVyc2VjdGlvbihlbGVtZW50c0ludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0PW1lcmdlaWZ5KGl0ZXJEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdTZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5lbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpO1xuXG5jb25zdCBzZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpKTtcblxuY29uc3QgICAgICAgIHNldElzU3VwZXJzZXQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNTdXBlcnNldCk7JGjigI1fb25jZS5zZXRJc1N1cGVyc2V0KHNldElzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIHNldElzRGlzam9pbnQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNEaXNqb2ludCk7JGjigI1fb25jZS5zZXRJc0Rpc2pvaW50KHNldElzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIHNldENvbXBhcmU9cmF3U2V0aWZ5KGVsZW1lbnRzQ29tcGFyZSk7JGjigI1fb25jZS5zZXRDb21wYXJlKHNldENvbXBhcmUpO1xuY29uc3QgICAgICAgIHNldFVuaW9uPXNldGlmeShlbGVtZW50c1VuaW9uKTskaOKAjV9vbmNlLnNldFVuaW9uKHNldFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFVuaW9uPXNldGlmeShlbGVtZW50c0Rpc2pvaW50VW5pb24pOyRo4oCNX29uY2Uuc2V0RGlzam9pbnRVbmlvbihzZXREaXNqb2ludFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXRJbnRlcnNlY3Rpb249c2V0aWZ5KGVsZW1lbnRzSW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLnNldEludGVyc2VjdGlvbihzZXRJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIHNldERpc2pvaW50U3VidHJhY3Q9c2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5zZXREaXNqb2ludFN1YnRyYWN0KHNldERpc2pvaW50U3VidHJhY3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCJdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIl0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiJdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0Il0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCJdLCJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiXSwic2V0VW5pb24iOlsic2V0VW5pb24iXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIl0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIkMOwUzwwAAM8MAADUAAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4va2V5cy9jb21wYXJlS2V5cy5qcyIsIi4uL3V0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIk0iLCJhc3NlcnRQYXR0ZXJuIiwiY2hlY2tNYXRjaGVzIiwiZGVmYXVsdExpbWl0cyIsImdldFJhbmtDb3ZlciIsImlzUGF0dGVybiIsIm1hdGNoZXMiLCJtdXN0TWF0Y2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaGFzT3duUHJvcGVydHlPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsY29tcGFyZVJhbmssZ2V0UGFzc1N0eWxlQ292ZXIsaW50ZXJzZWN0UmFua0NvdmVycyx1bmlvblJhbmtDb3ZlcnMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLGlkZW50Q2hlY2tlcixhcHBseUxhYmVsaW5nRXJyb3IsZnJvbVVuaXF1ZUVudHJpZXMsbGlzdERpZmZlcmVuY2Usa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV0sW1wiZ2V0UGFzc1N0eWxlQ292ZXJcIiwgWyRo4oCNX2EgPT4gKGdldFBhc3NTdHlsZUNvdmVyID0gJGjigI1fYSldXSxbXCJpbnRlcnNlY3RSYW5rQ292ZXJzXCIsIFskaOKAjV9hID0+IChpbnRlcnNlY3RSYW5rQ292ZXJzID0gJGjigI1fYSldXSxbXCJ1bmlvblJhbmtDb3ZlcnNcIiwgWyRo4oCNX2EgPT4gKHVuaW9uUmFua0NvdmVycyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXSxbXCIuLi91dGlscy5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChpZGVudENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImFwcGx5TGFiZWxpbmdFcnJvclwiLCBbJGjigI1fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjigI1fYSldXSxbXCJmcm9tVW5pcXVlRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaOKAjV9hKV1dLFtcImxpc3REaWZmZXJlbmNlXCIsIFskaOKAjV9hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dLFtcImtleUdUXCIsIFskaOKAjV9hID0+IChrZXlHVCA9ICRo4oCNX2EpXV0sW1wia2V5R1RFXCIsIFskaOKAjV9hID0+IChrZXlHVEUgPSAkaOKAjV9hKV1dLFtcImtleUxUXCIsIFskaOKAjV9hID0+IChrZXlMVCA9ICRo4oCNX2EpXV0sW1wia2V5TFRFXCIsIFskaOKAjV9hID0+IChrZXlMVEUgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrS2V5XCIsIFskaOKAjV9hID0+IChjaGVja0tleSA9ICRo4oCNX2EpXV0sW1wiaXNLZXlcIiwgWyRo4oCNX2EgPT4gKGlzS2V5ID0gJGjigI1fYSldXSxbXCJjaGVja1NjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoY2hlY2tTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weVNldFwiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRo4oCNX2EpXV0sW1wiY29weU1hcEtleVNldFwiLCBbJGjigI1fYSA9PiAoY29weU1hcEtleVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlCYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e3F1b3RlOnEsZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcbmNvbnN0e2VudHJpZXMsdmFsdWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8UGF0dGVybj59ICovXG5jb25zdCBwYXR0ZXJuTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogRm9yIGZvcndhcmQgcmVmZXJlbmNlcyB0byBgTWAgKi9cbmxldCBNTTtcblxuLyoqXG4gKiBUaGUgYWN0dWFsIGRlZmF1bHQgdmFsdWVzIGhlcmUgYXJlLCBhdCB0aGUgcHJlc2VudCB0aW1lLCBmYWlybHlcbiAqIGFyYml0cmFyeSBjaG9pY2VzIGFuZCBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IHNldHRsZSBkb3duLiBPZiBjb3Vyc2VcbiAqIGF0IHNvbWUgcG9pbnQgd2UnbGwgbmVlZCB0byBzdG9wIGNoYW5naW5nIHRoZW0uIEJ1dCB3ZSBzaG91bGQgZmlyc3RcbiAqIHNlZSBob3cgb3VyIHN5c3RlbSBob2xkcyB1cCB3aXRoIHRoZXNlIGNob2ljZXMuIFRoZSBtYWluIGNyaXRlcmlhXG4gKiBpcyB0aGF0IHRoZXkgYmUgYmlnIGVub3VnaCB0aGF0IFwibm9ybWFsXCIgaW5ub2NlbnQgcHJvZ3JhbXMgcmFyZWx5XG4gKiBlbmNvdW50ZXIgdGhlc2UgbGltaXRzLlxuICpcbiAqIEV4cG9ydGVkIHByaW1hcmlseSBmb3IgdGVzdGluZy5cbiAqL1xuY29uc3QgICAgICAgIGRlZmF1bHRMaW1pdHM9aGFyZGVuKHtcbmRlY2ltYWxEaWdpdHNMaW1pdDoxMDAsXG5zdHJpbmdMZW5ndGhMaW1pdDoxMDBfMDAwLFxuc3ltYm9sTmFtZUxlbmd0aExpbWl0OjEwMCxcbm51bVByb3BlcnRpZXNMaW1pdDo4MCxcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0OjEwMCxcbmFycmF5TGVuZ3RoTGltaXQ6MTBfMDAwLFxubnVtU2V0RWxlbWVudHNMaW1pdDoxMF8wMDAsXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bU1hcEVudHJpZXNMaW1pdDo1MDAwfSk7XG5cblxuLyoqXG4gKiBVc2UgdGhlIHJlc3VsdCBvbmx5IHRvIGdldCB0aGUgbGltaXRzIHlvdSBuZWVkIGJ5IGRlc3RydWN0dXJpbmcuXG4gKiBUaHVzLCB0aGUgcmVzdWx0IG9ubHkgbmVlZHMgdG8gc3VwcG9ydCBkZXN0cnVjdHVyaW5nLiBUaGUgY3VycmVudFxuICogaW1wbGVtZW50YXRpb24gdXNlcyBpbmhlcml0YW5jZSBhcyBhIGNoZWFwIGhhY2suXG4gKlxuICogQHBhcmFtIHtMaW1pdHN9IFtsaW1pdHNdXG4gKiBAcmV0dXJucyB7QWxsTGltaXRzfVxuICovJGjigI1fb25jZS5kZWZhdWx0TGltaXRzKGRlZmF1bHRMaW1pdHMpO1xuY29uc3QgbGltaXQ9KGxpbWl0cz17fSk9PlxuLyoqIEB0eXBlIHtBbGxMaW1pdHN9ICovaGFyZGVuKHtfX3Byb3RvX186ZGVmYXVsdExpbWl0cywuLi5saW1pdHN9KTtcblxuY29uc3QgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQ9KFxucGF5bG9hZCxcbm1haW5QYXlsb2FkU2hhcGUsXG5jaGVjayxcbmxhYmVsKT0+XG57XG5hc3NlcnQoQXJyYXkuaXNBcnJheShtYWluUGF5bG9hZFNoYXBlKSk7XG5pZighQXJyYXkuaXNBcnJheShwYXlsb2FkKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtxKGxhYmVsKX0gcGF5bG9hZCBtdXN0IGJlIGFuIGFycmF5OiAke3BheWxvYWR9YCk7XG4gfVxuXG4vKiBXYXMgdGhlIGZvbGxvd2luZywgYnV0IGl0cyBvdmVydXNlIG9mIHBhdHRlcm5zIGNhdXNlZCBhbiBpbmZpbml0ZSByZWdyZXNzKi9cbi8qIGNvbnN0IHBheWxvYWRMaW1pdFNoYXBlID0gaGFyZGVuKCovXG4vKiBNLnNwbGl0KCovXG4vKiBtYWluUGF5bG9hZFNoYXBlLCovXG4vKiBNLnBhcnRpYWwoaGFyZGVuKFtNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0ubnVtYmVyKCkpXSksIGhhcmRlbihbXSkpLCovXG4vKiApLCovXG4vKiApOyovXG4vKiByZXR1cm4gY2hlY2tNYXRjaGVzKHBheWxvYWQsIHBheWxvYWRMaW1pdFNoYXBlLCBjaGVjaywgbGFiZWwpOyovXG5cbmNvbnN0IG1haW5MZW5ndGg9bWFpblBheWxvYWRTaGFwZS5sZW5ndGg7XG5pZighKHBheWxvYWQubGVuZ3RoPT09bWFpbkxlbmd0aHx8cGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RoKzEpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuIH1cbmNvbnN0IGxpbWl0cz1wYXlsb2FkW21haW5MZW5ndGhdO1xucGF5bG9hZD1oYXJkZW4ocGF5bG9hZC5zbGljZSgwLG1haW5MZW5ndGgpKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighY2hlY2tNYXRjaGVzKHBheWxvYWQsbWFpblBheWxvYWRTaGFwZSxjaGVjayxsYWJlbCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmlmKGxpbWl0cz09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YobGltaXRzKT09PSdjb3B5UmVjb3JkJ3x8XG5jaGVjayhmYWxzZSxYIGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpJiZcbmVudHJpZXMobGltaXRzKS5ldmVyeShcbihba2V5LHZhbHVlXSk9PlxucGFzc1N0eWxlT2YodmFsdWUpPT09J251bWJlcid8fFxuY2hlY2soZmFsc2UsWCBgVmFsdWUgb2YgbGltaXQgJHtxKGtleSl9IGJ1dCBiZSBhIG51bWJlcjogJHtxKHZhbHVlKX1gKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWNpbWFsRGlnaXRzTGltaXRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY29uc3QgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQ9KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjayk9PntcbmlmKFxuTWF0aC5mbG9vcihNYXRoLmxvZzEwKE1hdGguYWJzKE51bWJlcihzcGVjaW1lbikpKSkrMTw9XG5kZWNpbWFsRGlnaXRzTGltaXQpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGJpZ2ludCAke3NwZWNpbWVufSBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke2RlY2ltYWxEaWdpdHNMaW1pdH0gZGlnaXRzYCk7XG5cbiB9O1xuXG4vKipcbiAqIEByZXR1cm5zIHtQYXR0ZXJuS2l0fVxuICovXG5jb25zdCBtYWtlUGF0dGVybktpdD0oKT0+e1xuLyoqXG4gKiBJZiB0aGlzIGlzIGEgcmVjb2duaXplZCBtYXRjaCB0YWcsIHJldHVybiB0aGUgTWF0Y2hIZWxwZXIuXG4gKiBPdGhlcndpc2UgcmVzdWx0IHVuZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7TWF0Y2hIZWxwZXIgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1heWJlTWF0Y2hIZWxwZXI9KHRhZyk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkhlbHBlcnNCeU1hdGNoVGFnW3RhZ107XG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gS2luZFxuICogSXQgaXMgZWl0aGVyIGEgUGFzc1N0eWxlIG90aGVyIHRoYW4gJ3RhZ2dlZCcsIG9yLCBpZiB0aGUgdW5kZXJseWluZ1xuICogUGFzc1N0eWxlIGlzICd0YWdnZWQnLCB0aGVuIHRoZSBgZ2V0VGFnYCB2YWx1ZSBmb3IgdGFncyB0aGF0IGFyZVxuICogcmVjb2duaXplZCBhdCB0aGUgc3RvcmUgbGV2ZWwgb2YgYWJzdHJhY3Rpb24uIEZvciBlYWNoIG9mIHRob3NlXG4gKiB0YWdzLCBhIHRhZ2dlZCByZWNvcmQgb25seSBoYXMgdGhhdCBraW5kIGlmIGl0IHNhdGlzZmllcyB0aGUgaW52YXJpYW50c1xuICogdGhhdCB0aGUgc3RvcmUgbGV2ZWwgYXNzb2NpYXRlcyB3aXRoIHRoYXQga2luZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPENvcHlUYWdnZWQsIEtpbmQ+fVxuICogT25seSBmb3IgdGFnZ2VkIHJlY29yZHMgb2YgcmVjb2duaXplZCBraW5kcyB3aG9zZSBzdG9yZS1sZXZlbCBpbnZhcmlhbnRzXG4gKiBoYXZlIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICovXG5jb25zdCB0YWdNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCB0YWdzLCBhbmQgb25seSBpZiB0aGUgdGFnZ2VkXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdGFnZ2VkXG4gKiBAcGFyYW0ge0tpbmR9IHRhZ1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnZ2VkPSh0YWdnZWQsdGFnLGNoZWNrKT0+e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIpe1xuLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbi8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQodGFnZ2VkLnBheWxvYWQsY2hlY2spO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4gY2hlY2tDb3B5TWFwKHRhZ2dlZCxjaGVjayk7XG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfTogJHt0YWdnZWR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIG9ubHkgYSByZWNvZ25pemVkIGtpbmQsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lbiBwYXNzZXMgdGhlXG4gKiBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICogT3RoZXJ3aXNlLCBgY2hlY2soZmFsc2UsIC4uLilgIGFuZCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtLaW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBraW5kT2Y9KHNwZWNpbWVuLGNoZWNrPWlkZW50Q2hlY2tlcik9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihwYXNzU3R5bGUhPT0ndGFnZ2VkJyl7XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH1cbi8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHNwZWNpbWVuIGlzIGEgd2VsbCBmb3JtZWQqL1xuLyogYXMgYSB0YWdnZWQgcmVjb3JkLCB3aGljaCBpcyBkZWZpbmVkIGF0IHRoZSBtYXJzaGFsIGxldmVsIG9mIGFic3RyYWN0aW9uLCovXG4vKiBzaW5jZSBgcGFzc1N0eWxlT2ZgIGNoZWNrcyB0aG9zZSBpbnZhcmlhbnRzLiovXG5pZih0YWdNZW1vLmhhcyhzcGVjaW1lbikpe1xucmV0dXJuIHRhZ01lbW8uZ2V0KHNwZWNpbWVuKTtcbiB9XG5jb25zdCB0YWc9Z2V0VGFnKHNwZWNpbWVuKTtcbmlmKGNoZWNrVGFnZ2VkKHNwZWNpbWVuLHRhZyxjaGVjaykpe1xudGFnTWVtby5zZXQoc3BlY2ltZW4sdGFnKTtcbnJldHVybiB0YWc7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuY2hlY2soZmFsc2UsWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9YCk7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuaGFyZGVuKGtpbmRPZik7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2luZH0ga2luZFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2luZD0oc3BlY2ltZW4sa2luZCxjaGVjayk9PntcbmNvbnN0IHJlYWxLaW5kPWtpbmRPZihzcGVjaW1lbixjaGVjayk7XG5pZihraW5kPT09cmVhbEtpbmQpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuLyogcXVvdGluZyB3aXRob3V0IHF1b3RlcyovXG5jb25zdCBkZXRhaWxzPVgoWyBgJHtyZWFsS2luZH0gYCxgIC0gTXVzdCBiZSBhICR7a2luZH1gXSxzcGVjaW1lbik7XG5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLZXl9IGtleUFzUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrQXNLZXlQYXR0PShzcGVjaW1lbixrZXlBc1BhdHRlcm4sY2hlY2spPT57XG5pZihrZXlFUShzcGVjaW1lbixrZXlBc1BhdHRlcm4pKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZTogJHtrZXlBc1BhdHRlcm59YCkpO1xuXG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtDaGVja1BhdHRlcm59ICovXG5jb25zdCBjaGVja1BhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vKiBBbGwga2V5cyBhcmUgcGF0dGVybnMuIEZvciB0aGVzZSwgdGhlIGtleU1lbW8gd2lsbCBkby4qL1xuLyogQWxsIHByaW1pdGl2ZXMgdGhhdCBhcmUgcGF0dGVybnMgYXJlIGFsc28ga2V5cywgd2hpY2ggdGhpcyovXG4vKiBhbHNvIHRha2VzIGNhcmUgb2Ygd2l0aG91dCBtZW1vLiBUaGUgcmVzdCBvZiBvdXIgY2hlY2tpbmcgbG9naWMqL1xuLyogaXMgb25seSBjb25jZXJuZWQgd2l0aCBub24ta2V5IHBhdHRlcm5zLiovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihwYXR0ZXJuTWVtby5oYXMocGF0dCkpe1xucmV0dXJuIHRydWU7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHJlc3VsdD1jaGVja1BhdHRlcm5JbnRlcm5hbChwYXR0LGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5wYXR0ZXJuTWVtby5hZGQocGF0dCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHQgLSBrbm93biBub3QgdG8gYmUgYSBrZXksIGFuZCB0aGVyZWZvcmUga25vd25cbiAqIG5vdCB0byBiZSBwcmltaXRpdmUuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQYXR0ZXJuSW50ZXJuYWw9KHBhdHQsY2hlY2spPT57XG4vKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4vKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4vKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbmNvbnN0IGNoZWNrSXQ9KGNoaWxkKT0+Y2hlY2tQYXR0ZXJuKGNoaWxkLGNoZWNrKTtcblxuY29uc3Qga2luZD1raW5kT2YocGF0dCxjaGVjayk7XG5zd2l0Y2goa2luZCl7XG5jYXNlIHVuZGVmaW5lZDp7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBBIGNvcHlSZWNvcmQgaXMgYSBwYXR0ZXJuIGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSovXG4vKiBwYXR0ZXJucyovXG5yZXR1cm4gdmFsdWVzKHBhdHQpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiBwYXR0LmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUga2V5cyBhbmQgdGhlcmVmb3JlIGFscmVhZHkga25vd24gdG8gYmUqL1xuLyogcGF0dGVybnMuKi9cbi8qIEEgY29weU1hcCBpcyBhIHBhdHRlcm4gaWYgaXRzIHZhbHVlcyBhcmUgcGF0dGVybnMuKi9cbnJldHVybiBjaGVja1BhdHRlcm4ocGF0dC52YWx1ZXMsY2hlY2spO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiB9XG5kZWZhdWx0OntcbmlmKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkhPT11bmRlZmluZWQpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBIHBhc3NhYmxlIG9mIGtpbmQgJHtxKGtpbmQpfSBpcyBub3QgYSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNQYXR0ZXJuPShwYXR0KT0+Y2hlY2tQYXR0ZXJuKHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuY29uc3QgYXNzZXJ0UGF0dGVybj0ocGF0dCk9PntcbmNoZWNrUGF0dGVybihwYXR0LGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1hdGNoZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzPShzcGVjaW1lbixwYXR0ZXJuLGNoZWNrLGxhYmVsPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCxbc3BlY2ltZW4scGF0dGVybixjaGVja10sbGFiZWwpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbD0oc3BlY2ltZW4scGF0dCxjaGVjayk9Pntcbi8qIFdvcnRoIGJlaW5nIGEgYml0IHZlcmJvc2UgYW5kIHJlcGV0aXRpdmUgaW4gb3JkZXIgdG8gb3B0aW1pemUqL1xuY29uc3QgcGF0dGVybktpbmQ9a2luZE9mKHBhdHQsY2hlY2spO1xuY29uc3Qgc3BlY2ltZW5LaW5kPWtpbmRPZihzcGVjaW1lbik7LyogbWF5IGJlIHVuZGVmaW5lZCovXG5zd2l0Y2gocGF0dGVybktpbmQpe1xuY2FzZSB1bmRlZmluZWQ6e1xucmV0dXJuIEZhaWwgYHBhdHRlcm4gZXhwZWN0ZWQ6ICR7cGF0dH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEZhaWwgYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIEZhaWwgYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weUJhZyc6XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogVGhlc2Uga2luZHMgYXJlIG5lY2Vzc2FyaWx5IGtleXMqL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG5jb25zdHtsZW5ndGh9PXBhdHQ7XG5pZihzcGVjaW1lbi5sZW5ndGghPT1sZW5ndGgpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSAke3NwZWNpbWVufSAtIE11c3QgYmUgYXMgbG9uZyBhcyBjb3B5QXJyYXkgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxucmV0dXJuIHBhdHQuZXZlcnkoKHAsaSk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbltpXSxwLGNoZWNrLGkpKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlSZWNvcmQgdG8gbWF0Y2ggYSBjb3B5UmVjb3JkIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbi8qIFRPRE8gRGV0ZWN0IGFuZCBhY2N1bXVsYXRlIGRpZmZlcmVuY2UgaW4gb25lIHBhc3MuKi9cbi8qIFJhdGhlciB0aGFuIHVzaW5nIHR3byBjYWxscyB0byBgbGlzdERpZmZlcmVuY2VgIHRvIGRldGVjdCBhbmQqL1xuLyogcmVwb3J0IGlmIGFuZCBob3cgdGhlc2UgbGlzdHMgZGlmZmVyLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5Ki9cbi8qIGluIHNvcnRlZCBvcmRlciwgd2Ugc2hvdWxkIGluc3RlYWQgdXNlIGFuIGFsZ29yaXRobSBsaWtlKi9cbi8qIGBpdGVyRGlzam9pbnRVbmlvbmAgZnJvbSBtZXJnZS1zb3J0LW9wZXJhdG9ycy5qcyovXG5jb25zdCBzcGVjaW1lbk5hbWVzPXJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbmNvbnN0IHBhdHROYW1lcz1yZWNvcmROYW1lcyhwYXR0KTtcbmNvbnN0IG1pc3Npbmc9bGlzdERpZmZlcmVuY2UocGF0dE5hbWVzLHNwZWNpbWVuTmFtZXMpO1xuaWYobWlzc2luZy5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWApO1xuXG4gfVxuY29uc3QgdW5leHBlY3RlZD1saXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLHBhdHROYW1lcyk7XG5pZih1bmV4cGVjdGVkLmxlbmd0aD49MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBub3QgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShcbnVuZXhwZWN0ZWQpXG4gfWApO1xuXG4gfVxuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9cmVjb3JkVmFsdWVzKHNwZWNpbWVuLHNwZWNpbWVuTmFtZXMpO1xuY29uc3QgcGF0dFZhbHVlcz1yZWNvcmRWYWx1ZXMocGF0dCxwYXR0TmFtZXMpO1xucmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsaSk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLHBhdHRWYWx1ZXNbaV0sY2hlY2ssbGFiZWwpKTtcblxuIH1cbmNhc2UnY29weU1hcCc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlNYXAnKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuY29uc3R7cGF5bG9hZDpwYXR0UGF5bG9hZH09cGF0dDtcbmNvbnN0e3BheWxvYWQ6c3BlY2ltZW5QYXlsb2FkfT1zcGVjaW1lbjtcbmNvbnN0IHBhdHRLZXlTZXQ9Y29weU1hcEtleVNldChwYXR0UGF5bG9hZCk7XG5jb25zdCBzcGVjaW1lbktleVNldD1jb3B5TWFwS2V5U2V0KHNwZWNpbWVuUGF5bG9hZCk7XG4vKiBDb21wYXJlIGtleXMgYXMgY29weVNldHMqL1xuaWYoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCxwYXR0S2V5U2V0LGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcGF0dFZhbHVlcz1wYXR0UGF5bG9hZC52YWx1ZXM7XG5jb25zdCBzcGVjaW1lblZhbHVlcz1zcGVjaW1lblBheWxvYWQudmFsdWVzO1xuLyogY29tcGFyZSB2YWx1ZXMgYXMgY29weUFycmF5cyovXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzLHBhdHRWYWx1ZXMsY2hlY2spO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG5pZihtYXRjaEhlbHBlcil7XG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQucGF5bG9hZCxjaGVjayk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgbWF0Y2hlcz0oc3BlY2ltZW4scGF0dCk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgbm9ybWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MuIE1hdGNoIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5XG4gKiB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqL1xuY29uc3QgbXVzdE1hdGNoPShzcGVjaW1lbixwYXR0LGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcixsYWJlbCkpe1xucmV0dXJuO1xuIH1cbi8qIHNob3VsZCBvbmx5IHRocm93Ki9cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGFzc2VydENoZWNrZXIsbGFiZWwpO1xuRmFpbCBgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxKHBhdHQpfWA7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZ2V0UmFua0NvdmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtHZXRSYW5rQ292ZXJ9ICovXG5jb25zdCBnZXRSYW5rQ292ZXI9KHBhdHQsZW5jb2RlUGFzc2FibGUpPT57XG5pZihpc0tleShwYXR0KSl7XG5jb25zdCBlbmNvZGVkPWVuY29kZVBhc3NhYmxlKHBhdHQpO1xuaWYoZW5jb2RlZCE9PXVuZGVmaW5lZCl7XG5yZXR1cm5bZW5jb2RlZCwgYCR7ZW5jb2RlZH1+YF07XG4gfVxuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5QXJyYXknOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weUFycmF5cy4qL1xuLyoqL1xuLyogY29uc3QgcmFua0NvdmVycyA9IHBhdHQubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiByYW5rQ292ZXJzLm1hcCgoW2xlZnQsIF9yaWdodF0pID0+IGxlZnQpLCovXG4vKiByYW5rQ292ZXJzLm1hcCgoW19sZWZ0LCByaWdodF0pID0+IHJpZ2h0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5UmVjb3Jkcy4qL1xuLyoqL1xuLyogY29uc3QgcGF0dEtleXMgPSBvd25LZXlzKHBhdHQpOyovXG4vKiBjb25zdCBwYXR0RW50cmllcyA9IGhhcmRlbihwYXR0S2V5cy5tYXAoa2V5ID0+IFtrZXksIHBhdHRba2V5XV0pKTsqL1xuLyogY29uc3QgW2xlZnRFbnRyaWVzTGltaXQsIHJpZ2h0RW50cmllc0xpbWl0XSA9Ki9cbi8qIGdldFJhbmtDb3ZlcihwYXR0RW50cmllcyk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBmcm9tVW5pcXVlRW50cmllcyhsZWZ0RW50cmllc0xpbWl0KSwqL1xuLyogZnJvbVVuaXF1ZUVudHJpZXMocmlnaHRFbnRyaWVzTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcocGF0dCk7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5U2V0cy4qL1xuLyoqL1xuLyogLy8gU2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkIGJ5IGNoZWNrUGF0dGVybi4gQnV0IGJlY2F1c2UgdGhpcyovXG4vKiAvLyBpcyBhIGNoZWNrIHRoYXQgbWF5IGxvb3NlbiBvdmVyIHRpbWUsIHdlIGFsc28gYXNzZXJ0Ki9cbi8qIC8vIGV2ZXJ5d2hlcmUgd2Ugc3RpbGwgcmVseSBvbiB0aGUgcmVzdHJpY3Rpb24uKi9cbi8qIGBgYGpzKi9cbi8qIHBhdHQucGF5bG9hZC5sZW5ndGggPT09IDEgfHwqL1xuLyogRmFpbGBOb24tc2luZ2xldG9uIGNvcHlTZXRzIHdpdGggbWF0Y2hlciBub3QgeWV0IGltcGxlbWVudGVkOiAke3BhdHR9YDsqL1xuLyogYGBgKi9cbi8qKi9cbi8qIGNvbnN0IFtsZWZ0RWxlbWVudExpbWl0LCByaWdodEVsZW1lbnRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZFswXSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIG1ha2VDb3B5U2V0KFtsZWZ0RWxlbWVudExpbWl0XSksKi9cbi8qIG1ha2VDb3B5U2V0KFtyaWdodEVsZW1lbnRMaW1pdF0pLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlNYXBzLiovXG4vKiovXG4vKiAvLyBBIG1hdGNoaW5nIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMsIG9yIGF0IG1vc3Qgb25lKi9cbi8qIC8vIG5vbi1rZXkga2V5IHBhdHRlcm4uIFRodXMgd2UgY2FuIGFzc3VtZSB0aGF0IHZhbHVlIHBvc2l0aW9ucyovXG4vKiAvLyBtYXRjaCAxLXRvLTEuKi9cbi8qIC8vKi9cbi8qIC8vIFRPRE8gSSBtYXkgYmUgb3Zlcmxvb2tpbmcgdGhhdCB0aGUgbGVzcyBwcmVjaXNlIHJhbmtPcmRlciovXG4vKiAvLyBlcXVpdmFsZW5jZSBjbGFzcyBtYXkgY2F1c2UgdmFsdWVzIHRvIGJlIG91dCBvZiBvcmRlciwqL1xuLyogLy8gbWFraW5nIHRoaXMgcmFua0NvdmVyIG5vdCBhY3R1YWxseSBjb3Zlci4gSW4gdGhhdCBjYXNlLCBmb3IqL1xuLyogLy8gYWxsIHRoZSB2YWx1ZXMgZm9yIGtleXMgYXQgdGhlIHNhbWUgcmFuaywgd2Ugc2hvdWxkIHVuaW9uIHRoZWlyKi9cbi8qIC8vIHJhbmsgY292ZXJzLiBUT0RPIFBPU1NJQkxFIFNJTEVOVCBDT1JSRUNUTkVTUyBCVUcqL1xuLyogLy8qL1xuLyogLy8gSWYgdGhpcyBpcyBhIGJ1ZywgaXQgcHJvYmFibHkgYWZmZWN0cyB0aGUgZ2V0UmFua0NvdmVyKi9cbi8qIC8vIGNhc2VzIG9mIG1hdGNoTFRFSGVscGVyIGFuZCBtYXRjaEdURUhlbHBlciBvbiBjb3B5TWFwIGFzKi9cbi8qIC8vIHdlbGwuIFNlZSBtYWtlQ29weU1hcCBmb3IgYW4gaWRlYSBvbiBmaXhpbmcqL1xuLyogLy8gdGhpcyBidWcuKi9cbi8qIGNvbnN0IFtsZWZ0UGF5bG9hZExpbWl0LCByaWdodFBheWxvYWRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZCwqL1xuLyogZW5jb2RlUGFzc2FibGUsKi9cbi8qICk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgbGVmdFBheWxvYWRMaW1pdCksKi9cbi8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCByaWdodFBheWxvYWRMaW1pdCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9fVxuXG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfVxuZGVmYXVsdDp7XG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gfTtcblxuY29uc3QgYXJyYXlFdmVyeU1hdGNoUGF0dGVybj0oYXJyYXkscGF0dCxjaGVjayxsYWJlbFByZWZpeD0nJyk9PntcbmlmKGNoZWNrS2luZChwYXR0LCdtYXRjaDphbnknLGlkZW50Q2hlY2tlcikpe1xuLyogaWYgdGhlIHBhdHRlcm4gaXMgTS5hbnkoKSwgd2Uga25vdyBpdHMgdHJ1ZSovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gYXJyYXkuZXZlcnkoKGVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhlbCxwYXR0LGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbnlIZWxwZXI9RmFyKCdtYXRjaDphbnkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KF9zcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KG1hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5tYXRjaGVyUGF5bG9hZD09PXVuZGVmaW5lZHx8XG5jaGVjayhmYWxzZSxYIGBtYXRjaDphbnkgcGF5bG9hZDogJHttYXRjaGVyUGF5bG9hZH0gLSBNdXN0IGJlIHVuZGVmaW5lZGApLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbmRIZWxwZXI9RmFyKCdtYXRjaDphbmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHRzLGNoZWNrKT0+e1xucmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KT0+Y2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsY2hlY2spKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZFBhdHRzLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0ocGF0dCk9PmNoZWNrUGF0dGVybihwYXR0LGNoZWNrKTtcbnJldHVybihcbihwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgTmVlZHMgYXJyYXkgb2Ygc3ViLXBhdHRlcm5zOiAke2FsbGVnZWRQYXR0c31gKSkmJlxuYWxsZWdlZFBhdHRzLmV2ZXJ5KGNoZWNrSXQpKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjoocGF0dHMsZW5jb2RlUGFzc2FibGUpPT5cbmludGVyc2VjdFJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpfSk7XG5cblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hPckhlbHBlcj1GYXIoJ21hdGNoOm9yIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbmNvbnN0e2xlbmd0aH09cGF0dHM7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBubyBwYXR0ZXJuIGRpc2p1bmN0cyB0byBtYXRjaDogJHtwYXR0c31gKTtcblxuIH1cbmlmKFxucGF0dHMubGVuZ3RoPT09MiYmXG4hbWF0Y2hlcyhzcGVjaW1lbixwYXR0c1swXSkmJlxuY2hlY2tLaW5kKHBhdHRzWzBdLCdtYXRjaDpraW5kJyxpZGVudENoZWNrZXIpJiZcbnBhdHRzWzBdLnBheWxvYWQ9PT0ndW5kZWZpbmVkJylcbntcbi8qIFdvcnRoIHNwZWNpYWwgY2FzaW5nIHRoZSBvcHRpb25hbCBwYXR0ZXJuIGZvciovXG4vKiBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuKi9cbnJldHVybiBjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dHNbMV0sY2hlY2spO1xuIH1cbmlmKHBhdHRzLnNvbWUoKHBhdHQpPT5tYXRjaGVzKHNwZWNpbWVuLHBhdHQpKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3BhdHRzfWApO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW5kSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG51bmlvblJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpfSk7XG5cblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOb3RIZWxwZXI9RmFyKCdtYXRjaDpub3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG5pZihtYXRjaGVzKHNwZWNpbWVuLHBhdHQpKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9ZWxzZXtcbnJldHVybiB0cnVlO1xuIH1cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja1BhdHRlcm4sXG5cbmdldFJhbmtDb3ZlcjooX3BhdHQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXI9RmFyKCdtYXRjaDpzY2FsYXIgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tTY2FsYXJLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLZXlIZWxwZXI9RmFyKCdtYXRjaDprZXkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyPUZhcignbWF0Y2g6cGF0dGVybiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1BhdHRlcm4oc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLaW5kSGVscGVyPUZhcignbWF0Y2g6a2luZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczpjaGVja0tpbmQsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkS2V5S2luZCxjaGVjayk9PlxudHlwZW9mIGFsbGVnZWRLZXlLaW5kPT09J3N0cmluZyd8fFxuY2hlY2soXG5mYWxzZSxcblggYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2ApLFxuXG5cbmdldFJhbmtDb3Zlcjooa2luZCxfZW5jb2RlUGFzc2FibGUpPT57XG5sZXQgc3R5bGU7XG5zd2l0Y2goa2luZCl7XG5jYXNlJ2NvcHlTZXQnOlxuY2FzZSdjb3B5TWFwJzp7XG5zdHlsZT0ndGFnZ2VkJztcbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuc3R5bGU9a2luZDtcbmJyZWFrO1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihzdHlsZSk7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJpZ2ludEhlbHBlcj1GYXIoJ21hdGNoOmJpZ2ludCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6YmlnaW50IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOYXRIZWxwZXI9RmFyKCdtYXRjaDpuYXQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2RlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnYmlnaW50JyxjaGVjaykmJlxuY2hlY2soXG4vKiogQHR5cGUge2JpZ2ludH0gKi9zcGVjaW1lbj49MG4sXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgbm9uLW5lZ2F0aXZlYCkmJlxuXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6bmF0IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG4vKiBUT0RPIENvdWxkIGJlIG1vcmUgcHJlY2lzZSovXG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTdHJpbmdIZWxwZXI9RmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N0cmluZ0xlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuLyogcHJldHRpZXItaWdub3JlKi9cbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnc3RyaW5nJyxjaGVjaykmJihcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbi8qKiBAdHlwZSB7c3RyaW5nfSAqL3NwZWNpbWVuLmxlbmd0aDw9c3RyaW5nTGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYHN0cmluZyAke3NwZWNpbWVufSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N0cmluZ0xlbmd0aExpbWl0fWApKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6c3RyaW5nIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3Zlcignc3RyaW5nJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTeW1ib2xIZWxwZXI9RmFyKCdtYXRjaDpzeW1ib2wgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N5bWJvbE5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ3N5bWJvbCcsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBzeW1ib2xOYW1lPW5hbWVGb3JQYXNzYWJsZVN5bWJvbChzcGVjaW1lbik7XG5cbmlmKHR5cGVvZiBzeW1ib2xOYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFBhc3NhYmxlIHN5bWJvbCAke3NwZWNpbWVufSBtdXN0IGhhdmUgYSBwYXNzYWJsZSBuYW1lYDtcbiB9XG5yZXR1cm4gY2hlY2soXG5zeW1ib2xOYW1lLmxlbmd0aDw9c3ltYm9sTmFtZUxlbmd0aExpbWl0LFxuWCBgU3ltYm9sIG5hbWUgJHtxKFxuc3ltYm9sTmFtZSlcbiB9IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3ltYm9sTmFtZUxlbmd0aExpbWl0fWApO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpzeW1ib2wgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdzeW1ib2wnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFJlbW90YWJsZUhlbHBlcj1GYXIoJ21hdGNoOnJlbW90YWJsZSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmVtb3RhYmxlRGVzYyxjaGVjayk9Pntcbi8qIFVuZm9ydHVuYXRlIGR1cGxpY2F0aW9uIG9mIGNoZWNrS2luZCBsb2dpYywgYnV0IG5vIGJldHRlciBjaG9pY2VzLiovXG5pZihjaGVja0tpbmQoc3BlY2ltZW4sJ3JlbW90YWJsZScsaWRlbnRDaGVja2VyKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihjaGVjaz09PWlkZW50Q2hlY2tlcil7XG5yZXR1cm4gZmFsc2U7XG4gfVxubGV0IHNwZWNpbWVuS2luZD1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihzcGVjaW1lbktpbmQ9PT0ndGFnZ2VkJyl7XG5zcGVjaW1lbktpbmQ9Z2V0VGFnKHNwZWNpbWVuKTtcbiB9XG5jb25zdHtsYWJlbH09cmVtb3RhYmxlRGVzYztcblxuLyogcXVvdGluZyB3aXRob3V0IHF1b3RlcyovXG5jb25zdCBkZXRhaWxzPVgoXG5bIGAke3NwZWNpbWVuS2luZH0gYCxgIC0gTXVzdCBiZSBhIHJlbW90YWJsZSAoJHtsYWJlbH0pYF0sXG5zcGVjaW1lbik7XG5cbnJldHVybiBjaGVjayhmYWxzZSxkZXRhaWxzKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZFJlbW90YWJsZURlc2MsY2hlY2spPT5cbmNoZWNrTWF0Y2hlcyhcbmFsbGVnZWRSZW1vdGFibGVEZXNjLFxuaGFyZGVuKHtsYWJlbDpNTS5zdHJpbmcoKX0pLFxuY2hlY2ssXG4nbWF0Y2g6cmVtb3RhYmxlIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9yZW1vdGFibGVEZXNjLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3JlbW90YWJsZScpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTFRFSGVscGVyPUZhcignbWF0Y2g6bHRlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdSaWdodEJvdW5kPSBgJHtlbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpfX5gO1xuaWYobmV3UmlnaHRCb3VuZCE9PXVuZGVmaW5lZCl7XG5yaWdodEJvdW5kPW5ld1JpZ2h0Qm91bmQ7XG4gfVxucmV0dXJuW2xlZnRCb3VuZCxyaWdodEJvdW5kXTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTFRIZWxwZXI9RmFyKCdtYXRjaDpsdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlMVChzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOm1hdGNoTFRFSGVscGVyLmdldFJhbmtDb3Zlcn0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEdURUhlbHBlcj1GYXIoJ21hdGNoOmd0ZSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlHVEUoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPj0gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6KHJpZ2h0T3BlcmFuZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuLyogVGhlIHByZWZlci1jb25zdCBtYWtlcyBubyBzZW5zZSB3aGVuIHNvbWUgb2YgdGhlIHZhcmlhYmxlcyBuZWVkKi9cbi8qIHRvIGJlIGBsZXRgKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QqL1xubGV0W2xlZnRCb3VuZCxyaWdodEJvdW5kXT1nZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuY29uc3QgbmV3TGVmdEJvdW5kPWVuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCk7XG5pZihuZXdMZWZ0Qm91bmQhPT11bmRlZmluZWQpe1xubGVmdEJvdW5kPW5ld0xlZnRCb3VuZDtcbiB9XG5yZXR1cm5bbGVmdEJvdW5kLHJpZ2h0Qm91bmRdO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hHVEhlbHBlcj1GYXIoJ21hdGNoOmd0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID4gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hHVEVIZWxwZXIuZ2V0UmFua0NvdmVyfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUmVjb3JkT2ZIZWxwZXI9RmFyKCdtYXRjaDpyZWNvcmRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1Qcm9wZXJ0aWVzTGltaXQscHJvcGVydHlOYW1lTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlSZWNvcmQnLGNoZWNrKSYmXG5jaGVjayhcbm93bktleXMoc3BlY2ltZW4pLmxlbmd0aDw9bnVtUHJvcGVydGllc0xpbWl0LFxuWCBgTXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxubnVtUHJvcGVydGllc0xpbWl0KVxuIH0gcHJvcGVydGllczogJHtzcGVjaW1lbn1gKSYmXG5cbmVudHJpZXMoc3BlY2ltZW4pLmV2ZXJ5KFxuKFtrZXksdmFsdWVdKT0+XG5hcHBseUxhYmVsaW5nRXJyb3IoXG5jaGVjayxcbltcbmtleS5sZW5ndGg8PXByb3BlcnR5TmFtZUxlbmd0aExpbWl0LFxuWCBgUHJvcGVydHkgbmFtZSBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAke3EoXG5wcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdClcbiB9YF0sXG5cbmtleSkmJlxuXG5jaGVja01hdGNoZXMoXG5oYXJkZW4oW2tleSx2YWx1ZV0pLFxuaGFyZGVuKFtrZXlQYXR0LHZhbHVlUGF0dF0pLFxuY2hlY2ssXG5rZXkpKSk7XG5cblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6cmVjb3JkT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5UmVjb3JkJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBcnJheU9mSGVscGVyPUZhcignbWF0Y2g6YXJyYXlPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW3N1YlBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHthcnJheUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuLyogcHJldHRpZXItaWdub3JlKi9cbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weUFycmF5JyxjaGVjaykmJihcbi8qKiBAdHlwZSB7QXJyYXl9ICovc3BlY2ltZW4ubGVuZ3RoPD1hcnJheUxlbmd0aExpbWl0fHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSBsZW5ndGggJHtzcGVjaW1lbi5sZW5ndGh9IG11c3QgYmUgPD0gbGltaXQgJHthcnJheUxlbmd0aExpbWl0fWApKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4sc3ViUGF0dCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDphcnJheU9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNldE9mSGVscGVyPUZhcignbWF0Y2g6c2V0T2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtrZXlQYXR0LGxpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7bnVtU2V0RWxlbWVudHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weVNldCcsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDxudW1TZXRFbGVtZW50c0xpbWl0LFxuWCBgU2V0IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShudW1TZXRFbGVtZW50c0xpbWl0KX0gZWxlbWVudHM6ICR7XG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aFxuIH1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4ucGF5bG9hZCxrZXlQYXR0LGNoZWNrLCdzZXQgZWxlbWVudHMnKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOnNldE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJhZ09mSGVscGVyPUZhcignbWF0Y2g6YmFnT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlCYWcnLGNoZWNrKSYmXG5jaGVjayhcbi8qKiBAdHlwZSB7QXJyYXl9ICovc3BlY2ltZW4ucGF5bG9hZC5sZW5ndGg8PVxubnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxcblggYEJhZyBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0KVxuIH0gdW5pcXVlIGVsZW1lbnRzOiAke3NwZWNpbWVufWApJiZcblxuc3BlY2ltZW4ucGF5bG9hZC5ldmVyeShcbihba2V5LGNvdW50XSxpKT0+XG5jaGVja01hdGNoZXMoa2V5LGtleVBhdHQsY2hlY2ssIGBiYWcga2V5c1ske2l9XWApJiZcbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuW2NvdW50LGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVja10sXG4gYGJhZyBjb3VudHNbJHtpfV1gKSYmXG5cbmNoZWNrTWF0Y2hlcyhjb3VudCxjb3VudFBhdHQsY2hlY2ssIGBiYWcgY291bnRzWyR7aX1dYCkpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6YmFnT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTWFwT2ZIZWxwZXI9RmFyKCdtYXRjaDptYXBPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1NYXBFbnRyaWVzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlNYXAnLGNoZWNrKSYmXG5jaGVjayhcbi8qKiBAdHlwZSB7QXJyYXl9ICovc3BlY2ltZW4ucGF5bG9hZC5rZXlzLmxlbmd0aDw9XG5udW1NYXBFbnRyaWVzTGltaXQsXG5YIGBDb3B5TWFwIG11c3QgaGF2ZSBubyBtb3JlIHRoYW4gJHtxKFxubnVtTWFwRW50cmllc0xpbWl0KVxuIH0gZW50cmllczogJHtzcGVjaW1lbn1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG5zcGVjaW1lbi5wYXlsb2FkLmtleXMsXG5rZXlQYXR0LFxuY2hlY2ssXG4nbWFwIGtleXMnKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG5zcGVjaW1lbi5wYXlsb2FkLnZhbHVlcyxcbnZhbHVlUGF0dCxcbmNoZWNrLFxuJ21hcCB2YWx1ZXMnKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKSxNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOm1hcE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9lbnRyeVBhdHQpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybltdfSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEByZXR1cm5zIHt7XG4gKiAgIHJlcXVpcmVkU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIHJlc3RTcGVjaW1lbjogUGFzc2FibGVbXVxuICogfX1cbiAqL1xuY29uc3Qgc3BsaXRBcnJheVBhcnRzPShzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KT0+e1xuY29uc3QgbnVtUmVxdWlyZWQ9cmVxdWlyZWRQYXR0Lmxlbmd0aDtcbmNvbnN0IG51bU9wdGlvbmFsPW9wdGlvbmFsUGF0dC5sZW5ndGg7XG5jb25zdCByZXF1aXJlZFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKDAsbnVtUmVxdWlyZWQpO1xuY29uc3Qgb3B0aW9uYWxTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShcbm51bVJlcXVpcmVkLFxubnVtUmVxdWlyZWQrbnVtT3B0aW9uYWwpO1xuXG5jb25zdCByZXN0U3BlY2ltZW49c3BlY2ltZW4uc2xpY2UobnVtUmVxdWlyZWQrbnVtT3B0aW9uYWwpO1xucmV0dXJuIGhhcmRlbih7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn0pO1xuIH07XG5cbi8qKlxuICogT3B0aW9uYWwgc3BlY2ltZW4gZWxlbWVudHMgd2hpY2ggYXJlIGB1bmRlZmluZWRgIHBhc3MgdW5jb25kaXRpb25hbGx5LlxuICogV2UgZW5jb2RlIHRoaXMgd2l0aCB0aGUgYE0ub3JgIHBhdHRlcm4gc28gaXQgYWxzbyBwcm9kdWNlcyBhIGdvb2RcbiAqIGNvbXByZXNzaW9uIGRpc3Rpbmd1aXNoaW5nIGB1bmRlZmluZWRgIGZyb20gYWJzZW5jZS5cbiAqXG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcmV0dXJucyB7UGF0dGVybltdfSBUaGUgcGFydGlhbFBhdHRcbiAqL1xuY29uc3QgYWRhcHRBcnJheVBhdHRlcm49KG9wdGlvbmFsUGF0dCxsZW5ndGgpPT5cbmhhcmRlbihvcHRpb25hbFBhdHQuc2xpY2UoMCxsZW5ndGgpLm1hcCgocGF0dCk9Pk1NLm9wdChwYXR0KSkpO1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTcGxpdEFycmF5SGVscGVyPUZhcignbWF0Y2g6c3BsaXRBcnJheSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PVtdLHJlc3RQYXR0PU1NLmFueSgpXSxcbmNoZWNrKT0+XG57XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QXJyYXknLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn09XG5zcGxpdEFycmF5UGFydHMoc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk7XG5jb25zdCBwYXJ0aWFsUGF0dD1hZGFwdEFycmF5UGF0dGVybihcbm9wdGlvbmFsUGF0dCxcbm9wdGlvbmFsU3BlY2ltZW4ubGVuZ3RoKTtcblxubGV0IGFyZ051bT0wO1xucmV0dXJuKFxuKHJlcXVpcmVkU3BlY2ltZW4ubGVuZ3RoPT09cmVxdWlyZWRQYXR0Lmxlbmd0aHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgRXhwZWN0ZWQgYXQgbGVhc3QgJHtxKFxucmVxdWlyZWRQYXR0Lmxlbmd0aClcbiB9IGFyZ3VtZW50czogJHtzcGVjaW1lbn1gKSkmJlxuXG5yZXF1aXJlZFBhdHQuZXZlcnkoKHAsaSk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzKi9cbmNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuW2ldLHAsY2hlY2ssIGBhcmcgJHthcmdOdW0rK31gKSkmJlxuXG5wYXJ0aWFsUGF0dC5ldmVyeSgocCxpKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuY2hlY2tNYXRjaGVzKG9wdGlvbmFsU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfT9gKSkmJlxuXG5jaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLHJlc3RQYXR0LGNoZWNrLCcuLi5yZXN0JykpO1xuXG4gfSxcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBzcGxpdEFycmF5XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbmNoZWNrSXNXZWxsRm9ybWVkOihzcGxpdEFycmF5LGNoZWNrKT0+e1xuaWYoXG5wYXNzU3R5bGVPZihzcGxpdEFycmF5KT09PSdjb3B5QXJyYXknJiYoXG5zcGxpdEFycmF5Lmxlbmd0aD49MXx8c3BsaXRBcnJheS5sZW5ndGg8PTMpKVxue1xuY29uc3RbcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD11bmRlZmluZWQscmVzdFBhdHQ9dW5kZWZpbmVkXT1cbnNwbGl0QXJyYXk7XG5pZihcbmlzUGF0dGVybihyZXF1aXJlZFBhdHQpJiZcbnBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCk9PT0nY29weUFycmF5JyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weUFycmF5JykmJihcbnJlc3RQYXR0PT09dW5kZWZpbmVkfHxpc1BhdHRlcm4ocmVzdFBhdHQpKSlcbntcbnJldHVybiB0cnVlO1xuIH1cbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYE11c3QgYmUgYW4gYXJyYXkgb2YgYSByZXF1aXJlZFBhdHQgYXJyYXksIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCBhcnJheSwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xuX3JlcXVpcmVkUGF0dCxcbl9vcHRpb25hbFBhdHQ9dW5kZWZpbmVkLFxuX3Jlc3RQYXR0PXVuZGVmaW5lZF0pPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhc3NhYmxlPn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICByZXN0U3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+XG4gKiB9fVxuICovXG5jb25zdCBzcGxpdFJlY29yZFBhcnRzPShzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KT0+e1xuLyogTm90IGZyb3plbiEgTXV0YXRlZCBpbiBwbGFjZSovXG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3QgcmVxdWlyZWRFbnRyaWVzPVtdO1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IG9wdGlvbmFsRW50cmllcz1bXTtcbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCByZXN0RW50cmllcz1bXTtcbmZvcihjb25zdFtuYW1lLHZhbHVlXW9mIGVudHJpZXMoc3BlY2ltZW4pKXtcbmlmKGhhc093blByb3BlcnR5T2YocmVxdWlyZWRQYXR0LG5hbWUpKXtcbnJlcXVpcmVkRW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfWVsc2UgaWYoaGFzT3duUHJvcGVydHlPZihvcHRpb25hbFBhdHQsbmFtZSkpe1xub3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9ZWxzZXtcbnJlc3RFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7XG5yZXF1aXJlZFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG5vcHRpb25hbFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKG9wdGlvbmFsRW50cmllcyksXG5yZXN0U3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMocmVzdEVudHJpZXMpfSk7XG5cbiB9O1xuXG4vKipcbiAqIE9wdGlvbmFsIHNwZWNpbWVuIHZhbHVlcyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge0NvcHlSZWNvcmQ8UGF0dGVybj59IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdFJlY29yZFBhdHRlcm49KG9wdGlvbmFsUGF0dCxuYW1lcyk9PlxuZnJvbVVuaXF1ZUVudHJpZXMobmFtZXMubWFwKChuYW1lKT0+W25hbWUsTU0ub3B0KG9wdGlvbmFsUGF0dFtuYW1lXSldKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0UmVjb3JkSGVscGVyPUZhcignbWF0Y2g6c3BsaXRSZWNvcmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5bcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD17fSxyZXN0UGF0dD1NTS5hbnkoKV0sXG5jaGVjayk9Plxue1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0UmVjb3JkUGFydHMoc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk7XG5cbmNvbnN0IHBhcnRpYWxOYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMob3B0aW9uYWxTcGVjaW1lbik7XG5jb25zdCBwYXJ0aWFsUGF0dD1hZGFwdFJlY29yZFBhdHRlcm4ob3B0aW9uYWxQYXR0LHBhcnRpYWxOYW1lcyk7XG5yZXR1cm4oXG5jaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbixyZXF1aXJlZFBhdHQsY2hlY2spJiZcbnBhcnRpYWxOYW1lcy5ldmVyeSgobmFtZSk9PlxuY2hlY2tNYXRjaGVzKFxub3B0aW9uYWxTcGVjaW1lbltuYW1lXSxcbnBhcnRpYWxQYXR0W25hbWVdLFxuY2hlY2ssXG4gYCR7bmFtZX0/YCkpJiZcblxuXG5jaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLHJlc3RQYXR0LGNoZWNrLCcuLi5yZXN0JykpO1xuXG4gfSxcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBzcGxpdEFycmF5XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbmNoZWNrSXNXZWxsRm9ybWVkOihzcGxpdEFycmF5LGNoZWNrKT0+e1xuaWYoXG5wYXNzU3R5bGVPZihzcGxpdEFycmF5KT09PSdjb3B5QXJyYXknJiYoXG5zcGxpdEFycmF5Lmxlbmd0aD49MXx8c3BsaXRBcnJheS5sZW5ndGg8PTMpKVxue1xuY29uc3RbcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD11bmRlZmluZWQscmVzdFBhdHQ9dW5kZWZpbmVkXT1cbnNwbGl0QXJyYXk7XG5pZihcbmlzUGF0dGVybihyZXF1aXJlZFBhdHQpJiZcbnBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCk9PT0nY29weVJlY29yZCcmJihcbm9wdGlvbmFsUGF0dD09PXVuZGVmaW5lZHx8XG5pc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSYmXG5wYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpPT09J2NvcHlSZWNvcmQnKSYmKFxucmVzdFBhdHQ9PT11bmRlZmluZWR8fGlzUGF0dGVybihyZXN0UGF0dCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCByZWNvcmQsIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCByZWNvcmQsIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuc3BsaXRBcnJheSlcbiB9YCk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KFtcbnJlcXVpcmVkUGF0dCxcbl9vcHRpb25hbFBhdHQ9dW5kZWZpbmVkLFxuX3Jlc3RQYXR0PXVuZGVmaW5lZF0pPT5cbmdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkpfSk7XG5cblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBNYXRjaEhlbHBlcj59ICovXG5jb25zdCBIZWxwZXJzQnlNYXRjaFRhZz1oYXJkZW4oe1xuJ21hdGNoOmFueSc6bWF0Y2hBbnlIZWxwZXIsXG4nbWF0Y2g6YW5kJzptYXRjaEFuZEhlbHBlcixcbidtYXRjaDpvcic6bWF0Y2hPckhlbHBlcixcbidtYXRjaDpub3QnOm1hdGNoTm90SGVscGVyLFxuXG4nbWF0Y2g6c2NhbGFyJzptYXRjaFNjYWxhckhlbHBlcixcbidtYXRjaDprZXknOm1hdGNoS2V5SGVscGVyLFxuJ21hdGNoOnBhdHRlcm4nOm1hdGNoUGF0dGVybkhlbHBlcixcbidtYXRjaDpraW5kJzptYXRjaEtpbmRIZWxwZXIsXG4nbWF0Y2g6YmlnaW50JzptYXRjaEJpZ2ludEhlbHBlcixcbidtYXRjaDpuYXQnOm1hdGNoTmF0SGVscGVyLFxuJ21hdGNoOnN0cmluZyc6bWF0Y2hTdHJpbmdIZWxwZXIsXG4nbWF0Y2g6c3ltYm9sJzptYXRjaFN5bWJvbEhlbHBlcixcbidtYXRjaDpyZW1vdGFibGUnOm1hdGNoUmVtb3RhYmxlSGVscGVyLFxuXG4nbWF0Y2g6bHQnOm1hdGNoTFRIZWxwZXIsXG4nbWF0Y2g6bHRlJzptYXRjaExURUhlbHBlcixcbidtYXRjaDpndGUnOm1hdGNoR1RFSGVscGVyLFxuJ21hdGNoOmd0JzptYXRjaEdUSGVscGVyLFxuXG4nbWF0Y2g6YXJyYXlPZic6bWF0Y2hBcnJheU9mSGVscGVyLFxuJ21hdGNoOnJlY29yZE9mJzptYXRjaFJlY29yZE9mSGVscGVyLFxuJ21hdGNoOnNldE9mJzptYXRjaFNldE9mSGVscGVyLFxuJ21hdGNoOmJhZ09mJzptYXRjaEJhZ09mSGVscGVyLFxuJ21hdGNoOm1hcE9mJzptYXRjaE1hcE9mSGVscGVyLFxuJ21hdGNoOnNwbGl0QXJyYXknOm1hdGNoU3BsaXRBcnJheUhlbHBlcixcbidtYXRjaDpzcGxpdFJlY29yZCc6bWF0Y2hTcGxpdFJlY29yZEhlbHBlcn0pO1xuXG5cbmNvbnN0IG1ha2VNYXRjaGVyPSh0YWcscGF5bG9hZCk9PntcbmNvbnN0IG1hdGNoZXI9bWFrZVRhZ2dlZCh0YWcscGF5bG9hZCk7XG5hc3NlcnRQYXR0ZXJuKG1hdGNoZXIpO1xucmV0dXJuIG1hdGNoZXI7XG4gfTtcblxuY29uc3QgbWFrZUtpbmRNYXRjaGVyPShraW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmtpbmQnLGtpbmQpO1xuXG5jb25zdCBBbnlTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6YW55Jyx1bmRlZmluZWQpO1xuY29uc3QgU2NhbGFyU2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOnNjYWxhcicsdW5kZWZpbmVkKTtcbmNvbnN0IEtleVNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDprZXknLHVuZGVmaW5lZCk7XG5jb25zdCBQYXR0ZXJuU2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOnBhdHRlcm4nLHVuZGVmaW5lZCk7XG5jb25zdCBCb29sZWFuU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdib29sZWFuJyk7XG5jb25zdCBOdW1iZXJTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ251bWJlcicpO1xuY29uc3QgQmlnSW50U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YmlnaW50JyxbXSk7XG5jb25zdCBOYXRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpuYXQnLFtdKTtcbmNvbnN0IFN0cmluZ1NoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnN0cmluZycsW10pO1xuY29uc3QgU3ltYm9sU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c3ltYm9sJyxbXSk7XG5jb25zdCBSZWNvcmRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpyZWNvcmRPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBBcnJheVNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOmFycmF5T2YnLFtBbnlTaGFwZV0pO1xuY29uc3QgU2V0U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c2V0T2YnLFtBbnlTaGFwZV0pO1xuY29uc3QgQmFnU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YmFnT2YnLFtBbnlTaGFwZSxBbnlTaGFwZV0pO1xuY29uc3QgTWFwU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6bWFwT2YnLFtBbnlTaGFwZSxBbnlTaGFwZV0pO1xuY29uc3QgUmVtb3RhYmxlU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdyZW1vdGFibGUnKTtcbmNvbnN0IEVycm9yU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdlcnJvcicpO1xuY29uc3QgUHJvbWlzZVNoYXBlPW1ha2VLaW5kTWF0Y2hlcigncHJvbWlzZScpO1xuY29uc3QgVW5kZWZpbmVkU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCd1bmRlZmluZWQnKTtcblxuLyoqXG4gKiBGb3Igd2hlbiB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBwYXlsb2FkIGlzIHRoZSBvcHRpb25hbCBsaW1pdHMsXG4gKiBzbyB0aGF0IHdoZW4gaXQgaXMgYHVuZGVmaW5lZGAgaXQgaXMgZHJvcHBlZCBmcm9tIHRoZSBlbmQgb2YgdGhlXG4gKiBwYXlsb2FkcyBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHBheWxvYWRcbiAqL1xuY29uc3QgbWFrZUxpbWl0c01hdGNoZXI9KHRhZyxwYXlsb2FkKT0+e1xuaWYocGF5bG9hZFtwYXlsb2FkLmxlbmd0aC0xXT09PXVuZGVmaW5lZCl7XG5wYXlsb2FkPWhhcmRlbihwYXlsb2FkLnNsaWNlKDAscGF5bG9hZC5sZW5ndGgtMSkpO1xuIH1cbnJldHVybiBtYWtlTWF0Y2hlcih0YWcscGF5bG9hZCk7XG4gfTtcblxuY29uc3QgbWFrZVJlbW90YWJsZU1hdGNoZXI9KGxhYmVsPXVuZGVmaW5lZCk9PlxubGFiZWw9PT11bmRlZmluZWQ/XG5SZW1vdGFibGVTaGFwZTpcbm1ha2VNYXRjaGVyKCdtYXRjaDpyZW1vdGFibGUnLGhhcmRlbih7bGFiZWx9KSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gZW1wdHlcbiAqIEBwYXJhbSB7VH0gYmFzZVxuICogQHBhcmFtIHtUfSBbb3B0aW9uYWxdXG4gKiBAcGFyYW0ge1R9IFtyZXN0XVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgbWFrZVNwbGl0UGF5bG9hZD0oXG5lbXB0eSxcbmJhc2UsXG5vcHRpb25hbD11bmRlZmluZWQsXG5yZXN0PXVuZGVmaW5lZCk9Plxue1xuaWYocmVzdCl7XG5yZXR1cm5bYmFzZSxvcHRpb25hbHx8ZW1wdHkscmVzdF07XG4gfVxuaWYob3B0aW9uYWwpe1xucmV0dXJuW2Jhc2Usb3B0aW9uYWxdO1xuIH1cbnJldHVybltiYXNlXTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7J3N5bmMnfCdhc3luYyd9IGNhbGxLaW5kXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IGFyZ0d1YXJkc1xuICogQHBhcmFtIHtBcmdHdWFyZFtdfSBbb3B0aW9uYWxBcmdHdWFyZHNdXG4gKiBAcGFyYW0ge0FyZ0d1YXJkfSBbcmVzdEFyZ0d1YXJkXVxuICogQHJldHVybnMge01ldGhvZEd1YXJkTWFrZXJ9XG4gKi9cbmNvbnN0IG1ha2VNZXRob2RHdWFyZE1ha2VyPShcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHM9dW5kZWZpbmVkLFxucmVzdEFyZ0d1YXJkPXVuZGVmaW5lZCk9PlxuXG5oYXJkZW4oe1xub3B0aW9uYWw6KC4uLm9wdEFyZ0d1YXJkcyk9Pntcbm9wdGlvbmFsQXJnR3VhcmRzPT09dW5kZWZpbmVkfHxcbkZhaWwgYENhbiBvbmx5IGhhdmUgb25lIHNldCBvZiBvcHRpb25hbCBndWFyZHNgO1xucmVzdEFyZ0d1YXJkPT09dW5kZWZpbmVkfHxcbkZhaWwgYG9wdGlvbmFsIGFyZyBndWFyZHMgbXVzdCBjb21lIGJlZm9yZSByZXN0IGFyZ2A7XG5yZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoY2FsbEtpbmQsYXJnR3VhcmRzLG9wdEFyZ0d1YXJkcyk7XG4gfSxcbnJlc3Q6KHJBcmdHdWFyZCk9PntcbnJlc3RBcmdHdWFyZD09PXVuZGVmaW5lZHx8RmFpbCBgQ2FuIG9ubHkgaGF2ZSBvbmUgcmVzdCBhcmdgO1xucmV0dXJuIG1ha2VNZXRob2RHdWFyZE1ha2VyKFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJBcmdHdWFyZCk7XG5cbiB9LFxucmV0dXJuczoocmV0dXJuR3VhcmQ9VW5kZWZpbmVkU2hhcGUpPT5cbmhhcmRlbih7XG5rbGFzczonbWV0aG9kR3VhcmQnLFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJlc3RBcmdHdWFyZCxcbnJldHVybkd1YXJkfSl9KTtcblxuXG5cbmNvbnN0IG1ha2VBd2FpdEFyZ0d1YXJkPShhcmdHdWFyZCk9PlxuaGFyZGVuKHtcbmtsYXNzOidhd2FpdEFyZycsXG5hcmdHdWFyZH0pO1xuXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7TWF0Y2hlck5hbWVzcGFjZX0gKi9cbmNvbnN0IE09aGFyZGVuKHtcbmFueTooKT0+QW55U2hhcGUsXG5hbmQ6KC4uLnBhdHRzKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmFuZCcscGF0dHMpLFxub3I6KC4uLnBhdHRzKT0+bWFrZU1hdGNoZXIoJ21hdGNoOm9yJyxwYXR0cyksXG5ub3Q6KHN1YlBhdHQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bm90JyxzdWJQYXR0KSxcblxuc2NhbGFyOigpPT5TY2FsYXJTaGFwZSxcbmtleTooKT0+S2V5U2hhcGUsXG5wYXR0ZXJuOigpPT5QYXR0ZXJuU2hhcGUsXG5raW5kOm1ha2VLaW5kTWF0Y2hlcixcbmJvb2xlYW46KCk9PkJvb2xlYW5TaGFwZSxcbm51bWJlcjooKT0+TnVtYmVyU2hhcGUsXG5iaWdpbnQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmlnaW50JyxbbGltaXRzXSk6QmlnSW50U2hhcGUsXG5uYXQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bmF0JyxbbGltaXRzXSk6TmF0U2hhcGUsXG5zdHJpbmc6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3RyaW5nJyxbbGltaXRzXSk6U3RyaW5nU2hhcGUsXG5zeW1ib2w6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3ltYm9sJyxbbGltaXRzXSk6U3ltYm9sU2hhcGUsXG5yZWNvcmQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLnJlY29yZE9mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOlJlY29yZFNoYXBlLFxuYXJyYXk6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLmFycmF5T2YoTS5hbnkoKSxsaW1pdHMpOkFycmF5U2hhcGUsXG5zZXQ6KGxpbWl0cz11bmRlZmluZWQpPT5saW1pdHM/TS5zZXRPZihNLmFueSgpLGxpbWl0cyk6U2V0U2hhcGUsXG5iYWc6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLmJhZ09mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOkJhZ1NoYXBlLFxubWFwOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5tYXBPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpNYXBTaGFwZSxcbnJlbW90YWJsZTptYWtlUmVtb3RhYmxlTWF0Y2hlcixcbmVycm9yOigpPT5FcnJvclNoYXBlLFxucHJvbWlzZTooKT0+UHJvbWlzZVNoYXBlLFxudW5kZWZpbmVkOigpPT5VbmRlZmluZWRTaGFwZSxcbm51bGw6KCk9Pm51bGwsXG5cbmx0OihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bHQnLHJpZ2h0T3BlcmFuZCksXG5sdGU6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpsdGUnLHJpZ2h0T3BlcmFuZCksXG5lcTooa2V5KT0+e1xuYXNzZXJ0S2V5KGtleSk7XG5yZXR1cm4ga2V5PT09dW5kZWZpbmVkP00udW5kZWZpbmVkKCk6a2V5O1xuIH0sXG5uZXE6KGtleSk9Pk0ubm90KE0uZXEoa2V5KSksXG5ndGU6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpndGUnLHJpZ2h0T3BlcmFuZCksXG5ndDoocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmd0JyxyaWdodE9wZXJhbmQpLFxuXG5yZWNvcmRPZjooa2V5UGF0dD1NLmFueSgpLHZhbHVlUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpyZWNvcmRPZicsW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0c10pLFxuYXJyYXlPZjooc3ViUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDphcnJheU9mJyxbc3ViUGF0dCxsaW1pdHNdKSxcbnNldE9mOihrZXlQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnNldE9mJyxba2V5UGF0dCxsaW1pdHNdKSxcbmJhZ09mOihrZXlQYXR0PU0uYW55KCksY291bnRQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJhZ09mJyxba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzXSksXG5tYXBPZjooa2V5UGF0dD1NLmFueSgpLHZhbHVlUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDptYXBPZicsW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0c10pLFxuc3BsaXRBcnJheTooYmFzZSxvcHRpb25hbD11bmRlZmluZWQscmVzdD11bmRlZmluZWQpPT5cbm1ha2VNYXRjaGVyKFxuJ21hdGNoOnNwbGl0QXJyYXknLFxubWFrZVNwbGl0UGF5bG9hZChbXSxiYXNlLG9wdGlvbmFsLHJlc3QpKSxcblxuc3BsaXRSZWNvcmQ6KGJhc2Usb3B0aW9uYWw9dW5kZWZpbmVkLHJlc3Q9dW5kZWZpbmVkKT0+XG5tYWtlTWF0Y2hlcihcbidtYXRjaDpzcGxpdFJlY29yZCcsXG5tYWtlU3BsaXRQYXlsb2FkKHt9LGJhc2Usb3B0aW9uYWwscmVzdCkpLFxuXG5zcGxpdDooYmFzZSxyZXN0PXVuZGVmaW5lZCk9PntcbmlmKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSk9PT0nY29weUFycmF5Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgaXQgc2hvdWxkIGJlIGFuIGFycmF5Ki9cbnJldHVybiBNLnNwbGl0QXJyYXkoYmFzZSxyZXN0JiZbXSxyZXN0KTtcbiB9ZWxzZXtcbnJldHVybiBNLnNwbGl0UmVjb3JkKGJhc2UscmVzdCYme30scmVzdCk7XG4gfVxuIH0sXG5wYXJ0aWFsOihiYXNlLHJlc3Q9dW5kZWZpbmVkKT0+e1xuaWYocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xucmV0dXJuIE0uc3BsaXRBcnJheShbXSxiYXNlLHJlc3QpO1xuIH1lbHNle1xucmV0dXJuIE0uc3BsaXRSZWNvcmQoe30sYmFzZSxyZXN0KTtcbiB9XG4gfSxcblxuZXJlZjoodCk9Pk0ub3IodCxNLnByb21pc2UoKSksXG5vcHQ6KHQpPT5NLm9yKE0udW5kZWZpbmVkKCksdCksXG5cbmludGVyZmFjZTooaW50ZXJmYWNlTmFtZSxtZXRob2RHdWFyZHMse3Nsb3BweT1mYWxzZX09e30pPT57XG5mb3IoY29uc3RbXyxtZXRob2RHdWFyZF1vZiBlbnRyaWVzKG1ldGhvZEd1YXJkcykpe1xubWV0aG9kR3VhcmQua2xhc3M9PT0nbWV0aG9kR3VhcmQnfHxcbkZhaWwgYHVucmVjb2duaXplIG1ldGhvZCBndWFyZCAke21ldGhvZEd1YXJkfWA7XG4gfVxucmV0dXJuIGhhcmRlbih7XG5rbGFzczonSW50ZXJmYWNlJyxcbmludGVyZmFjZU5hbWUsXG5tZXRob2RHdWFyZHMsXG5zbG9wcHl9KTtcblxuIH0sXG5jYWxsOiguLi5hcmdHdWFyZHMpPT5tYWtlTWV0aG9kR3VhcmRNYWtlcignc3luYycsYXJnR3VhcmRzKSxcbmNhbGxXaGVuOiguLi5hcmdHdWFyZHMpPT5tYWtlTWV0aG9kR3VhcmRNYWtlcignYXN5bmMnLGFyZ0d1YXJkcyksXG5cbmF3YWl0OihhcmdHdWFyZCk9Pm1ha2VBd2FpdEFyZ0d1YXJkKGFyZ0d1YXJkKX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuY2hlY2tNYXRjaGVzLFxubWF0Y2hlcyxcbm11c3RNYXRjaCxcbmFzc2VydFBhdHRlcm4sXG5pc1BhdHRlcm4sXG5nZXRSYW5rQ292ZXIsXG5NfSk7XG5cbiB9O1xuXG4vKiBPbmx5IGluY2x1ZGUgdGhvc2Ugd2hvc2UgbWVhbmluZyBpcyBpbmRlcGVuZGVudCBvZiBhbiBpbXB1dGVkIHNvcnQgb3JkZXIqL1xuLyogb2YgcmVtb3RhYmxlcywgb3Igb2YgZW5jb2Rpbmcgb2YgcGFzc2FibGUgYXMgc29ydGFibGUgc3RyaW5ncy4gVGh1cywqL1xuLyogZ2V0UmFua0NvdmVyIGlzIG9taXR0ZWQuIFRvIGdldCBvbmUsIHlvdSdkIG5lZWQgdG8gaW5zdGFudGlhdGUqL1xuLyogYG1ha2VQYXR0ZXJuS2l0KClgIHlvdXJzZWxmLiBTaW5jZSB0aGVyZSBhcmUgY3VycmVudGx5IG5vIGV4dGVybmFsKi9cbi8qIHVzZXMgb2YgYGdldFJhbmtDb3ZlcmAsIGZvciBjbGFyaXR5IGR1cmluZyBkZXZlbG9wbWVudCwgYG1ha2VQYXR0ZXJuS2l0YCovXG4vKiBpcyBub3QgY3VycmVudGx5IGV4cG9ydGVkLiovXG5jb25zdCAgICAgICB7XG5jaGVja01hdGNoZXMsXG5tYXRjaGVzLFxubXVzdE1hdGNoLFxuYXNzZXJ0UGF0dGVybixcbmlzUGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19PVxubWFrZVBhdHRlcm5LaXQoKTskaOKAjV9vbmNlLmNoZWNrTWF0Y2hlcyhjaGVja01hdGNoZXMpOyRo4oCNX29uY2UubWF0Y2hlcyhtYXRjaGVzKTskaOKAjV9vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpOyRo4oCNX29uY2UuYXNzZXJ0UGF0dGVybihhc3NlcnRQYXR0ZXJuKTskaOKAjV9vbmNlLmlzUGF0dGVybihpc1BhdHRlcm4pOyRo4oCNX29uY2UuZ2V0UmFua0NvdmVyKGdldFJhbmtDb3Zlcik7JGjigI1fb25jZS5NKE0pO1xuXG5NTT1NO1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5VGFnZ2VkfSBDb3B5VGFnZ2VkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5QXJyYXk8VD59IENvcHlBcnJheSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5SYW5rQ292ZXJ9IFJhbmtDb3ZlciAqL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQXJnR3VhcmR9IEFyZ0d1YXJkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuTWV0aG9kR3VhcmRNYWtlcn0gTWV0aG9kR3VhcmRNYWtlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLk1hdGNoZXJOYW1lc3BhY2V9IE1hdGNoZXJOYW1lc3BhY2UgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXl9IEtleSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLlBhdHRlcm59IFBhdHRlcm4gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5QYXR0ZXJuS2l0fSBQYXR0ZXJuS2l0ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ2hlY2tQYXR0ZXJufSBDaGVja1BhdHRlcm4gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5MaW1pdHN9IExpbWl0cyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkFsbExpbWl0c30gQWxsTGltaXRzICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuR2V0UmFua0NvdmVyfSBHZXRSYW5rQ292ZXIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXRjaEhlbHBlclxuICogVGhpcyBmYWN0b3JzIG91dCBvbmx5IHRoZSBwYXJ0cyBzcGVjaWZpYyB0byBlYWNoIGtpbmQgb2YgTWF0Y2hlci4gSXQgaXNcbiAqIGVuY2Fwc3VsYXRlZCwgYW5kIGl0cyBtZXRob2RzIGNhbiBtYWtlIHRoZSBzdGF0ZWQgdW5jaGVja2VyIGFzc3VtcHRpb25zXG4gKiBlbmZvcmNlZCBieSB0aGUgY29tbW9uIGNhbGxpbmcgbG9naWMuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZFBheWxvYWQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXJcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tJc1dlbGxGb3JtZWRcbiAqIFJlcG9ydHMgd2hldGhlciBgYWxsZWdlZFBheWxvYWRgIGlzIHZhbGlkIGFzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZFxuICogd2hvc2UgdGFnIGNvcnJlc3BvbmRzIHdpdGggdGhpcyBNYXRjaEhlbHBlcidzIE1hdGNoZXJzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIG1hdGNoZXJQYXlsb2FkOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyLFxuICogKSA9PiBib29sZWFufSBjaGVja01hdGNoZXNcbiAqIEFzc3VtaW5nIHZhbGlkaXR5IG9mIGBtYXRjaGVyUGF5bG9hZGAgYXMgdGhlIHBheWxvYWQgb2YgYSBNYXRjaGVyIGNvcnJlc3BvbmRpbmdcbiAqIHdpdGggdGhpcyBNYXRjaEhlbHBlciwgcmVwb3J0cyB3aGV0aGVyIGBzcGVjaW1lbmAgaXMgbWF0Y2hlZCBieSB0aGF0IE1hdGNoZXIuXG4gKlxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuLi90eXBlcycpLkdldFJhbmtDb3Zlcn0gZ2V0UmFua0NvdmVyXG4gKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsXG4gKiBpbiByYW5rIG9yZGVyLCBhbGwgcG9zc2libGUgUGFzc2FibGVzIHRoYXQgd291bGQgbWF0Y2ggdGhpcyBNYXRjaGVyLlxuICogVGhlIGxlZnQgZWxlbWVudCBtdXN0IGJlIGJlZm9yZSBvciB0aGUgc2FtZSByYW5rIGFzIGFueSBwb3NzaWJsZVxuICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWVcbiAqIHJhbmsgYXMgYW55IHBvc3NpYmxlIG1hdGNoaW5nIHNwZWNpbWVuLlxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdExpbWl0cyI6WyJkZWZhdWx0TGltaXRzIl0sImNoZWNrTWF0Y2hlcyI6WyJjaGVja01hdGNoZXMiXSwibWF0Y2hlcyI6WyJtYXRjaGVzIl0sIm11c3RNYXRjaCI6WyJtdXN0TWF0Y2giXSwiYXNzZXJ0UGF0dGVybiI6WyJhc3NlcnRQYXR0ZXJuIl0sImlzUGF0dGVybiI6WyJpc1BhdHRlcm4iXSwiZ2V0UmFua0NvdmVyIjpbImdldFJhbmtDb3ZlciJdLCJNIjpbIk0iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAIgAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlh73x+oaAADqGgAAIgAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMvdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIiwiZnJvbVVuaXF1ZUVudHJpZXMiLCJpZGVudENoZWNrZXIiLCJsaXN0RGlmZmVyZW5jZSIsIm9iamVjdE1hcCIsInRocm93TGFiZWxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLGlzUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtmcm9tRW50cmllcyxlbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qIFRPRE8gbWlncmF0ZSB0byBwcm9wZXIgaG9tZSovXG4vKiBGcm9tIHRoZSBgYWdvcmljLXNka2AgbW9ub3JlcG8uIE1vdmVkIGhlcmUgdGVtcG9yYXJpbHkgYmVjYXVzZSB0aGUgcGF0dGVybiovXG4vKiBjb2RlIGlzIG1pZ3JhdGVkIGZyb20gYEBhZ29yaWMvc3RvcmVgIHRvIGBAZW5kby9wYXR0ZXJuc2AsIGFuZCBkZXBlbmRzIG9uKi9cbi8qIHRoZSBmdW5jdGlvbmFsaXR5IGluIHRoaXMgZmlsZSwgd2hpY2ggaXMgb3RoZXJ3aXNlIGF2YWlsYWJsZSBvbmx5Ki9cbi8qIHdpdGhpbiB0aGUgYGFnb3JpYy1zZGtgIG1vbm9yZXBvLiovXG5cbi8qKlxuICogVE9ETyBhcyBsb25nIGFzIGBAZW5kby9wYXNzLXN0eWxlYCByZW1haW5zIHRoZSBwcm9wZXIgaG9tZSBvZiB0aGVcbiAqIGBDaGVja2VyYCB0eXBlLCBpdCBwcm9iYWJseSBtYWtlcyBtb3N0IHNlbnNlIHRvIG1vdmUgYGlkZW50Q2hlY2tlcmBcbiAqIGludG8gYEBlbmRvL3Bhc3Mtc3R5bGVgIGFzIHdlbGwuXG4gKlxuICogSW4gdGhlIGBhc3NlcnRGb29gL2Bpc0Zvb2AvYGNoZWNrRm9vYCBwYXR0ZXJuLCBgY2hlY2tGb29gIGhhcyBhIGBjaGVja2BcbiAqIHBhcmFtZXRlciBvZiB0eXBlIGBDaGVja2VyYC4gYGFzc2VydEZvb2AgY2FsbHMgYGNoZWNrRm9vYCBwYXNzZXNcbiAqIGBhc3NlcnRDaGVja2VyYCBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlzRm9vYCBwYXNzZXMgYGlkZW50Q2hlY2tlcmBcbiAqIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaWRlbnRDaGVja2VyYCBhY3RzIHByZWNpc2VseSBsaWtlIGFuXG4gKiBpZGVudGl0eSBmdW5jdGlvbiwgYnV0IGlzIHR5cGVkIGFzIGEgYENoZWNrZXJgIHRvIGluZGljYXRlIGl0c1xuICogaW50ZW5kZWQgdXNlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgaWRlbnRDaGVja2VyPShjb25kLF9kZXRhaWxzKT0+Y29uZDskaOKAjV9vbmNlLmlkZW50Q2hlY2tlcihpZGVudENoZWNrZXIpO1xuaGFyZGVuKGlkZW50Q2hlY2tlcik7XG5cbi8qKlxuICogVGhyb3dzIGlmIG11bHRpcGxlIGVudHJpZXMgdXNlIHRoZSBzYW1lIHByb3BlcnR5IG5hbWUuIE90aGVyd2lzZSBhY3RzXG4gKiBsaWtlIGBPYmplY3QuZnJvbUVudHJpZXNgIGJ1dCBoYXJkZW5zIHRoZSByZXN1bHQuXG4gKiBVc2UgaXQgdG8gcHJvdGVjdCBmcm9tIHByb3BlcnR5IG5hbWVzIGNvbXB1dGVkIGZyb20gdXNlci1wcm92aWRlZCBkYXRhLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssVl0+fSBhbGxFbnRyaWVzXG4gKiBAcmV0dXJucyB7e1trOiBLXTogVn19XG4gKi9cbmNvbnN0ICAgICAgICBmcm9tVW5pcXVlRW50cmllcz0oYWxsRW50cmllcyk9PntcbmNvbnN0IGVudHJpZXNBcnJheT1bLi4uYWxsRW50cmllc107XG5jb25zdCByZXN1bHQ9aGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuaWYob3duS2V5cyhyZXN1bHQpLmxlbmd0aD09PWVudHJpZXNBcnJheS5sZW5ndGgpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7XG5mb3IoY29uc3RbbmFtZSxfXW9mIGVudHJpZXNBcnJheSl7XG5pZihuYW1lcy5oYXMobmFtZSkpe1xuRmFpbCBgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiB9XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xuIH07JGjigI1fb25jZS5mcm9tVW5pcXVlRW50cmllcyhmcm9tVW5pcXVlRW50cmllcyk7XG5oYXJkZW4oZnJvbVVuaXF1ZUVudHJpZXMpO1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZlxuICogYW4gYXJyYXkgdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsXG4gKiBgb2JqZWN0TWFwYCB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgc3RyaW5nLW5hbWVkIG93biBlbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBUeXBpY2FsIHVzYWdlIGFwcGxpZXMgYG9iamVjdE1hcGAgdG8gYSBDb3B5UmVjb3JkLCBpLmUuLFxuICogYW4gb2JqZWN0IGZvciB3aGljaCBgcGFzc1N0eWxlT2Yob3JpZ2luYWwpID09PSAnY29weVJlY29yZCdgLiBGb3IgdGhlc2UsXG4gKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgZWRnZSBjYXNlcyBhcmlzZS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgQ29weVJlY29yZFxuICogd2l0aCBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnR5IG5hbWVzLCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBtYXBwZWQgZm9ybSBvZlxuICogdGhlIG9yaWdpbmFsJ3MgdmFsdWVzLlxuICpcbiAqIFdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBhIENvcHlSZWNvcmQsIHNvbWUgZWRnZSBjYXNlcyB0byBiZSBhd2FyZSBvZlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogT25seSB0aGUgc3RyaW5nLW5hbWVkIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsXG4gKiAgICAgIGFyZSBtYXBwZWQuIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIGBPYmplY3QuZW50cmllc2BcbiAqICAgICAgd2lsbCBjYXVzZSBpdHMgYGdldHRlcmAgdG8gYmUgY2FsbGVkIGFuZCB3aWxsIHVzZSB0aGUgcmVzdWx0aW5nXG4gKiAgICAgIHZhbHVlLlxuICogICAgKiBObyBtYXR0ZXIgd2hldGhlciB0aGUgb3JpZ2luYWwgcHJvcGVydHkgd2FzIGFuIGFjY2Vzc29yLCB3cml0YWJsZSxcbiAqICAgICAgb3IgY29uZmlndXJhYmxlLCBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiAgICAgIG5vbi13cml0YWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgZGF0YSBwcm9wZXJ0aWVzLlxuICogICAgKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IG1heSBoYXZlIGluaGVyaXRlZCBmcm9tLCBhbmRcbiAqICAgICAgbm8gbWF0dGVyIHdoZXRoZXIgaXQgd2FzIGEgc3BlY2lhbCBraW5kIG9mIG9iamVjdCBzdWNoIGFzIGFuIGFycmF5LFxuICogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IGluaGVyaXRpbmcgZGlyZWN0bHlcbiAqICAgICAgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYW5kIHdob3NlIHN0YXRlIGlzIG9ubHkgdGhlc2UgbmV3IG1hcHBlZFxuICogICAgICBvd24gcHJvcGVydGllcy5cbiAqXG4gKiBXaXRoIHRoZXNlIGRpZmZlcmVuY2VzLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBvYmplY3Qgd2FzIG5vdCBhIENvcHlSZWNvcmQsXG4gKiBpZiBhbGwgdGhlIG1hcHBlZCB2YWx1ZXMgYXJlIFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogYSBDb3B5UmVjb3JkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gT1xuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHRlbXBsYXRlIFIgbWFwIHJlc3VsdFxuICogQHBhcmFtIHsodmFsdWU6IE9ba2V5b2YgT10sIGtleToga2V5b2YgTykgPT4gUn0gbWFwRm5cbiAqIEByZXR1cm5zIHt7IFtQIGluIGtleW9mIE9dOiBSfX1cbiAqL1xuY29uc3QgICAgICAgIG9iamVjdE1hcD0ob3JpZ2luYWwsbWFwRm4pPT57XG5jb25zdCBlbnRzPWVudHJpZXMob3JpZ2luYWwpO1xuY29uc3QgbWFwRW50cz1lbnRzLm1hcCgoW2ssdl0pPT5bayxtYXBGbih2LGspXSk7XG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKTtcbiB9OyRo4oCNX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSBsZWZ0TmFtZXNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gcmlnaHROYW1lc1xuICovXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnROYW1lcyxyaWdodE5hbWVzKT0+e1xuY29uc3QgcmlnaHRTZXQ9bmV3IFNldChyaWdodE5hbWVzKTtcbnJldHVybiBsZWZ0TmFtZXMuZmlsdGVyKChuYW1lKT0+IXJpZ2h0U2V0LmhhcyhuYW1lKSk7XG4gfTskaOKAjV9vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcj19IEVycm9yQ29uc3RydWN0b3JcbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKiBFdmFkZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE0NTAgdXNpbmcgYmxhbmsgbGluZSovXG5jb25zdCAgICAgICAgdGhyb3dMYWJlbGVkPShpbm5lckVycixsYWJlbCxFcnJvckNvbnN0cnVjdG9yPXVuZGVmaW5lZCk9PntcbmlmKHR5cGVvZiBsYWJlbD09PSdudW1iZXInKXtcbmxhYmVsPSBgWyR7bGFiZWx9XWA7XG4gfVxuY29uc3Qgb3V0ZXJFcnI9YXNzZXJ0LmVycm9yKFxuIGAke2xhYmVsfTogJHtpbm5lckVyci5tZXNzYWdlfWAsXG5FcnJvckNvbnN0cnVjdG9yKTtcblxuYXNzZXJ0Lm5vdGUob3V0ZXJFcnIsWCBgQ2F1c2VkIGJ5ICR7aW5uZXJFcnJ9YCk7XG50aHJvdyBvdXRlckVycjtcbiB9OyRo4oCNX29uY2UudGhyb3dMYWJlbGVkKHRocm93TGFiZWxlZCk7XG5oYXJkZW4odGhyb3dMYWJlbGVkKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgQSxSXG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFJ9IGZ1bmNcbiAqIEBwYXJhbSB7QVtdfSBhcmdzXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtSfVxuICovXG5jb25zdCAgICAgICAgYXBwbHlMYWJlbGluZ0Vycm9yPShmdW5jLGFyZ3MsbGFiZWw9dW5kZWZpbmVkKT0+e1xuaWYobGFiZWw9PT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmMoLi4uYXJncyk7XG4gfVxubGV0IHJlc3VsdDtcbnRyeXtcbnJlc3VsdD1mdW5jKC4uLmFyZ3MpO1xuIH1jYXRjaChlcnIpe1xudGhyb3dMYWJlbGVkKGVycixsYWJlbCk7XG4gfVxuaWYoaXNQcm9taXNlKHJlc3VsdCkpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBJZiByZXN1bHQgaXMgYSByZWplY3RlZCBwcm9taXNlLCB0aGlzIHdpbGwqL1xuLyogcmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEgZGlmZmVyZW50IHJlamVjdGlvbiByZWFzb24uIEJ1dCB0aGlzKi9cbi8qIGNvbmZ1c2VzIFR5cGVTY3JpcHQgYmVjYXVzZSBpdCB0eXBlcyB0aGF0IGNhc2UgYXMgYFByb21pc2U8bmV2ZXI+YCovXG4vKiB3aGljaCBpcyBjb29sIGZvciBhIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyIGZ1bGZsbC4qL1xuLyogQnV0IFR5cGVTY3JpcHQgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgdGhpcyB3aWxsIG9ubHkgaGFwcGVuKi9cbi8qIHdoZW4gYHJlc3VsdGAgd2FzIGEgcmVqZWN0ZWQgcHJvbWlzZS4gSW4gb25seSB0aGlzIGNhc2UgYFJgKi9cbi8qIHNob3VsZCBhbHJlYWR5IGFsbG93IGBQcm9taXNlPG5ldmVyPmAgYXMgYSBzdWJ0eXBlLiovXG5yZXR1cm4gRS53aGVuKHJlc3VsdCx1bmRlZmluZWQsKHJlYXNvbik9PnRocm93TGFiZWxlZChyZWFzb24sbGFiZWwpKTtcbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH07JGjigI1fb25jZS5hcHBseUxhYmVsaW5nRXJyb3IoYXBwbHlMYWJlbGluZ0Vycm9yKTtcbmhhcmRlbihhcHBseUxhYmVsaW5nRXJyb3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlkZW50Q2hlY2tlciI6WyJpZGVudENoZWNrZXIiXSwiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiXSwib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdLCJsaXN0RGlmZmVyZW5jZSI6WyJsaXN0RGlmZmVyZW5jZSJdLCJ0aHJvd0xhYmVsZWQiOlsidGhyb3dMYWJlbGVkIl0sImFwcGx5TGFiZWxpbmdFcnJvciI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAClK+n3AJAABwCQAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCxtZW1vUmFjZTskaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLCBbJGjigI1fYSA9PiAobWVtb1JhY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlUHJvbWlzZUtpdFwifSk7JGjigI1fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywgJ25hbWUnLCB7dmFsdWU6IFwicmFjZVByb21pc2VzXCJ9KTskaOKAjV9vbmNlLnJhY2VQcm9taXNlcyhyYWNlUHJvbWlzZXMpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2U9Z2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZXx8UHJvbWlzZTtcblxuLyoqXG4gKiBtYWtlUHJvbWlzZUtpdCgpIGJ1aWxkcyBhIFByb21pc2Ugb2JqZWN0LCBhbmQgcmV0dXJucyBhIHJlY29yZFxuICogY29udGFpbmluZyB0aGUgcHJvbWlzZSBpdHNlbGYsIGFzIHdlbGwgYXMgc2VwYXJhdGUgZmFjZXRzIGZvciByZXNvbHZpbmdcbiAqIGFuZCByZWplY3RpbmcgaXQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3NyYy90eXBlcy5qcycpLlByb21pc2VLaXQ8VD59XG4gKi9cbmZ1bmN0aW9uICAgICAgICBtYWtlUHJvbWlzZUtpdCgpe1xuY29uc3R7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9PW1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpO1xuXG5jb25zdCBwcm9taXNlPW5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxucmV0dXJuIGhhcmRlbih7cHJvbWlzZSxyZXNvbHZlLHJlamVjdH0pO1xuIH1cbmhhcmRlbihtYWtlUHJvbWlzZUtpdCk7XG5cbi8qIE5COiBBbm90aGVyIGltcGxlbWVudGF0aW9uIGZvciBQcm9taXNlLnJhY2Ugd291bGQgYmUgdG8gdXNlIHRoZSByZWxlYXNpbmcgZXhlY3V0b3IsKi9cbi8qIEhvd2V2ZXIgd2hpbGUgaXQgd291bGQgbm8gbG9uZ2VyIGxlYWsgdGhlIHJhY2VkIHByb21pc2Ugb2JqZWN0cyB0aGVtc2VsdmVzLCBpdCB3b3VsZCovXG4vKiBzdGlsbCBsZWFrIHJlYWN0aW9ucyBvbiB0aGUgbm9uLXJlc29sdmVkIHByb21pc2VzIGNvbnRlbmRpbmcgZm9yIHRoZSByYWNlLiovXG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gICAgICAgIHJhY2VQcm9taXNlcyh2YWx1ZXMpe1xucmV0dXJuIGhhcmRlbihtZW1vUmFjZS5jYWxsKEJlc3RQaXBlbGluYWJsZVByb21pc2UsdmFsdWVzKSk7XG4gfVxuaGFyZGVuKHJhY2VQcm9taXNlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACIfYGs3wIAAN8CAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzUHJvbWlzZSwgJ25hbWUnLCB7dmFsdWU6IFwiaXNQcm9taXNlXCJ9KTskaOKAjV9vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOyAgIC8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBtYXliZVByb21pc2UgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHttYXliZVByb21pc2UgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuZnVuY3Rpb24gICAgICAgIGlzUHJvbWlzZShtYXliZVByb21pc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpPT09bWF5YmVQcm9taXNlO1xuIH1cbmhhcmRlbihpc1Byb21pc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHadN674SAAC+EgAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBJbml0aWFsIHZlcnNpb24gYXV0aG9yZWQgYnkgQnJpYW4gS2ltOlxuaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8xNzQ2OSNpc3N1ZWNvbW1lbnQtNjg1MjE2Nzc3XG4gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbiBBbnlvbmUgaXMgZnJlZSB0byBjb3B5LCBtb2RpZnksIHB1Ymxpc2gsIHVzZSwgY29tcGlsZSwgc2VsbCwgb3JcbmRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgZWl0aGVyIGluIHNvdXJjZSBjb2RlIGZvcm0gb3IgYXMgYSBjb21waWxlZFxuYmluYXJ5LCBmb3IgYW55IHB1cnBvc2UsIGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwsIGFuZCBieSBhbnlcbm1lYW5zLlxuIEluIGp1cmlzZGljdGlvbnMgdGhhdCByZWNvZ25pemUgY29weXJpZ2h0IGxhd3MsIHRoZSBhdXRob3Igb3IgYXV0aG9yc1xub2YgdGhpcyBzb2Z0d2FyZSBkZWRpY2F0ZSBhbnkgYW5kIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlXG5zb2Z0d2FyZSB0byB0aGUgcHVibGljIGRvbWFpbi4gV2UgbWFrZSB0aGlzIGRlZGljYXRpb24gZm9yIHRoZSBiZW5lZml0XG5vZiB0aGUgcHVibGljIGF0IGxhcmdlIGFuZCB0byB0aGUgZGV0cmltZW50IG9mIG91ciBoZWlycyBhbmRcbnN1Y2Nlc3NvcnMuIFdlIGludGVuZCB0aGlzIGRlZGljYXRpb24gdG8gYmUgYW4gb3ZlcnQgYWN0IG9mXG5yZWxpbnF1aXNobWVudCBpbiBwZXJwZXR1aXR5IG9mIGFsbCBwcmVzZW50IGFuZCBmdXR1cmUgcmlnaHRzIHRvIHRoaXNcbnNvZnR3YXJlIHVuZGVyIGNvcHlyaWdodCBsYXcuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxuSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Jcbk9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLFxuQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SXG5PVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byA8aHR0cDovL3VubGljZW5zZS5vcmcvPlxuKi9cblxuXG5cblxuXG5cblxuY29uc3QgaXNPYmplY3Q9KHZhbHVlKT0+T2JqZWN0KHZhbHVlKT09PXZhbHVlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWZlcnJlZFxuICogQHByb3BlcnR5IHsodmFsdWU/OiBYaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FUmVmPFQ+ICkgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHByb3BlcnR5IHsoZXJyPzogYW55ICkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IG5ldmVyXG4gKiAgfCB7c2V0dGxlZDogZmFsc2UsIGRlZmVycmVkczogU2V0PERlZmVycmVkPn1cbiAqICB8IHtzZXR0bGVkOiB0cnVlLCBkZWZlcnJlZHM/OiB1bmRlZmluZWR9XG4gKiB9IFByb21pc2VNZW1vUmVjb3JkXG4gKi9cblxuLyogS2V5cyBhcmUgdGhlIHZhbHVlcyBwYXNzZWQgdG8gcmFjZSwgdmFsdWVzIGFyZSBhIHJlY29yZCBvZiBkYXRhIGNvbnRhaW5pbmcgYSovXG4vKiBzZXQgb2YgZGVmZXJyZWRzIGFuZCB3aGV0aGVyIHRoZSB2YWx1ZSBoYXMgc2V0dGxlZC4qL1xuLyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgUHJvbWlzZU1lbW9SZWNvcmQ+fSAqL1xuY29uc3Qga25vd25Qcm9taXNlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZU1lbW9SZWNvcmQgfCB1bmRlZmluZWR9IHJlY29yZFxuICogQHJldHVybnMge1NldDxEZWZlcnJlZD59XG4gKi9cbmNvbnN0IG1hcmtTZXR0bGVkPShyZWNvcmQpPT57XG5pZighcmVjb3JkfHxyZWNvcmQuc2V0dGxlZCl7XG5yZXR1cm4gbmV3IFNldCgpO1xuIH1cblxuY29uc3R7ZGVmZXJyZWRzfT1yZWNvcmQ7XG5PYmplY3QuYXNzaWduKHJlY29yZCx7XG5kZWZlcnJlZHM6dW5kZWZpbmVkLFxuc2V0dGxlZDp0cnVlfSk7XG5cbk9iamVjdC5mcmVlemUocmVjb3JkKTtcbnJldHVybiBkZWZlcnJlZHM7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7UHJvbWlzZU1lbW9SZWNvcmR9XG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQ9KHZhbHVlKT0+e1xuaWYoIWlzT2JqZWN0KHZhbHVlKSl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIGEgcHJpbWl0aXZlLCBhdHRlbXB0aW5nIHRvIHVzZSBpdCBhcyBhIGtleSBpbiB0aGUqL1xuLyogd2Vha21hcCB3b3VsZCB0aHJvdyBhbiBlcnJvci4gTHVja2lseSwgaXQgaXMgc2FmZSB0byBjYWxsKi9cbi8qIGBQcm9taXNlLnJlc29sdmUoY29udGVuZGVyKS50aGVuYCBvbiBhIHByaW1pdGl2ZSB2YWx1ZSBtdWx0aXBsZSB0aW1lcyovXG4vKiBiZWNhdXNlIHRoZSBwcm9taXNlIGZ1bGZpbGxzIGltbWVkaWF0ZWx5LiBTbyB3ZSBmYWtlIGEgc2V0dGxlZCByZWNvcmQuKi9cbnJldHVybiBoYXJkZW4oe3NldHRsZWQ6dHJ1ZX0pO1xuIH1cblxubGV0IHJlY29yZD1rbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbmlmKCFyZWNvcmQpe1xucmVjb3JkPXtkZWZlcnJlZHM6bmV3IFNldCgpLHNldHRsZWQ6ZmFsc2V9O1xua25vd25Qcm9taXNlcy5zZXQodmFsdWUscmVjb3JkKTtcbi8qIFRoaXMgY2FsbCB0byBgdGhlbmAgaGFwcGVucyBvbmNlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHZhbHVlLiovXG5Qcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oXG4odmFsKT0+e1xuZm9yKGNvbnN0e3Jlc29sdmV9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZXNvbHZlKHZhbCk7XG4gfVxuIH0sXG4oZXJyKT0+e1xuZm9yKGNvbnN0e3JlamVjdH1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlamVjdChlcnIpO1xuIH1cbiB9KTtcblxuIH1cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3R7cmFjZX09e1xuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSBbUD1Qcm9taXNlQ29uc3RydWN0b3JdXG4gKiBAdGhpcyB7UH1cbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5yYWNlKHZhbHVlcyl7XG5sZXQgZGVmZXJyZWQ7XG4vKiogQHR5cGUge1RbXX0gKi9cbmNvbnN0IGNhY2hlZFZhbHVlcz1bXTtcbmNvbnN0IEM9dGhpcztcbmNvbnN0IHJlc3VsdD1uZXcgQygocmVzb2x2ZSxyZWplY3QpPT57XG5kZWZlcnJlZD17cmVzb2x2ZSxyZWplY3R9O1xuZm9yKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyl7XG5jYWNoZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG5jb25zdHtzZXR0bGVkLGRlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihzZXR0bGVkKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgc2V0dGxlZCAoaW5jbHVkaW5nIHByaW1pdGl2ZXMpLCBpdCBpcyBzYWZlKi9cbi8qIHRvIGNhbGwgYFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbmAgb24gaXQuKi9cbkMucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLHJlamVjdCk7XG4gfWVsc2V7XG5kZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuXG4vKiBUaGUgZmluYWxseSBjYWxsYmFjayBleGVjdXRlcyB3aGVuIGFueSB2YWx1ZSBzZXR0bGVzLCBwcmV2ZW50aW5nIGFueSBvZiovXG4vKiB0aGUgdW5yZXNvbHZlZCB2YWx1ZXMgZnJvbSByZXRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIHJlc29sdmVkIHZhbHVlLiovXG5yZXR1cm4gcmVzdWx0LmZpbmFsbHkoKCk9PntcbmZvcihjb25zdCB2YWx1ZSBvZiBjYWNoZWRWYWx1ZXMpe1xuY29uc3R7ZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKGRlZmVycmVkcyl7XG5kZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuIH19OyRo4oCNX29uY2UucmFjZShyYWNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANNDsO5pBwAAaQcAADUAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIFByb21pc2VFeGVjdXRvciBUaGUgcHJvbWlzZSBleGVjdXRvclxuICogQHBhcmFtIHsodmFsdWU6IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKSBidWlsZHMgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIHdoaWNoIGRyb3AgcmVmZXJlbmNlc1xuICogdG8gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBnYXRoZXJlZCBmcm9tIGFuIGV4ZWN1dG9yIHRvIGJlIHVzZWQgd2l0aCBhXG4gKiBwcm9taXNlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UGljazxYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPiwgJ3Jlc29sdmUnIHwgJ3JlamVjdCc+ICYgeyBleGVjdXRvcjogUHJvbWlzZUV4ZWN1dG9yPFQ+fX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKCh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVzb2x2ZTtcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgocmVhc29uOiB1bmtub3duKSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlamVjdDtcblxuLyoqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD59IHZhbHVlICovXG5jb25zdCByZXNvbHZlPSh2YWx1ZSk9PntcbmlmKGludGVybmFsUmVzb2x2ZSl7XG5pbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PW51bGwpO1xuIH1cbiB9O1xuXG4vKiogQHBhcmFtIHt1bmtub3dufSByZWFzb24gKi9cbmNvbnN0IHJlamVjdD0ocmVhc29uKT0+e1xuaWYoaW50ZXJuYWxSZWplY3Qpe1xuaW50ZXJuYWxSZWplY3QocmVhc29uKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlamVjdD09PW51bGwpO1xuIH1cbiB9O1xuXG5jb25zdCBleGVjdXRvcj0ocmVzLHJlaik9PntcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT11bmRlZmluZWQmJmludGVybmFsUmVqZWN0PT09dW5kZWZpbmVkKTtcbmludGVybmFsUmVzb2x2ZT1yZXM7XG5pbnRlcm5hbFJlamVjdD1yZWo7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9KTtcbiB9OyRo4oCNX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACYAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAMriXk9BgAAPQYAAAdAAAAQGVuZG8vc3RyZWFtLXYwLjMuMjUvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZVBpcGUiLCJtYWtlUXVldWUiLCJtYWtlU3RyZWFtIiwibWFwUmVhZGVyIiwibWFwV3JpdGVyIiwicHJpbWUiLCJwdW1wIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsbWFrZVByb21pc2VLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZXNvbHZlKHZhbHVlPzogVCB8IFByb21pc2U8VD4pOiB2b2lkLFxuICogICByZWplY3QoZXJyb3I6IEVycm9yKTogdm9pZCxcbiAqICAgcHJvbWlzZTogUHJvbWlzZTxUPlxuICogfX0gUHJvbWlzZUtpdFxuICovXG5cbi8qIFR5cGVTY3JpcHQgUmVhZE9ubHkgc2VtYW50aWNzIGFyZSBub3Qgc3VmZmljaWVudGx5IGV4cHJlc3NpdmUgdG8gZGlzdGluZ3Vpc2gqL1xuLyogYSB2YWx1ZSBvbmUgcHJvbWlzZXMgbm90IHRvIGFsdGVyIGZyb20gYSB2YWx1ZSBvbmUgbXVzdCBub3QgYWx0ZXIsKi9cbi8qIG1ha2luZyBpdCB1c2VsZXNzLiovXG5jb25zdCBmcmVlemU9LyoqIEB0eXBlIHs8VD4odjogVCB8IFJlYWRvbmx5PFQ+KSA9PiBUfSAqL09iamVjdC5mcmVlemU7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXN5bmNRdWV1ZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VRdWV1ZT0oKT0+e1xubGV0e3Byb21pc2U6dGFpbFByb21pc2UscmVzb2x2ZTp0YWlsUmVzb2x2ZX09bWFrZVByb21pc2VLaXQoKTtcbnJldHVybntcbnB1dCh2YWx1ZSl7XG5jb25zdHtyZXNvbHZlLHByb21pc2V9PW1ha2VQcm9taXNlS2l0KCk7XG50YWlsUmVzb2x2ZShmcmVlemUoe3ZhbHVlLHByb21pc2V9KSk7XG50YWlsUmVzb2x2ZT1yZXNvbHZlO1xuIH0sXG5nZXQoKXtcbmNvbnN0IHByb21pc2U9dGFpbFByb21pc2UudGhlbigobmV4dCk9Pm5leHQudmFsdWUpO1xudGFpbFByb21pc2U9dGFpbFByb21pc2UudGhlbigobmV4dCk9Pm5leHQucHJvbWlzZSk7XG5yZXR1cm4gaGFyZGVuKHByb21pc2UpO1xuIH19O1xuXG4gfTskaOKAjV9vbmNlLm1ha2VRdWV1ZShtYWtlUXVldWUpO1xuaGFyZGVuKG1ha2VRdWV1ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRSZWFkXG4gKiBAdGVtcGxhdGUgVFdyaXRlXG4gKiBAdGVtcGxhdGUgVFJlYWRSZXR1cm5cbiAqIEB0ZW1wbGF0ZSBUV3JpdGVSZXR1cm5cbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkFzeW5jUXVldWU8SXRlcmF0b3JSZXN1bHQ8VFJlYWQsIFRSZWFkUmV0dXJuPj59IGFja3NcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkFzeW5jUXVldWU8SXRlcmF0b3JSZXN1bHQ8VFdyaXRlLCBUV3JpdGVSZXR1cm4+Pn0gZGF0YVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0cmVhbT0oYWNrcyxkYXRhKT0+e1xuY29uc3Qgc3RyZWFtPWhhcmRlbih7XG4vKipcbiAqIEBwYXJhbSB7VFdyaXRlfSB2YWx1ZVxuICovXG5uZXh0KHZhbHVlKXtcbi8qIE5vdGUgdGhlIHNoYWxsb3cgZnJlZXplIHNpbmNlIHZhbHVlIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGZyZWV6YWJsZSovXG4vKiAodHlwZWQgYXJyYXlzIGFyZSBub3QpLiovXG5kYXRhLnB1dChmcmVlemUoe3ZhbHVlLGRvbmU6ZmFsc2V9KSk7XG5yZXR1cm4gYWNrcy5nZXQoKTtcbiB9LFxuLyoqXG4gKiBAcGFyYW0ge1RXcml0ZVJldHVybn0gdmFsdWVcbiAqL1xucmV0dXJuKHZhbHVlKXtcbmRhdGEucHV0KGZyZWV6ZSh7dmFsdWUsZG9uZTp0cnVlfSkpO1xucmV0dXJuIGFja3MuZ2V0KCk7XG4gfSxcbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqL1xudGhyb3coZXJyb3Ipe1xuZGF0YS5wdXQoaGFyZGVuKFByb21pc2UucmVqZWN0KGVycm9yKSkpO1xucmV0dXJuIGFja3MuZ2V0KCk7XG4gfSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtcbnJldHVybiBzdHJlYW07XG4gfX0pO1xuXG5yZXR1cm4gc3RyZWFtO1xuIH07JGjigI1fb25jZS5tYWtlU3RyZWFtKG1ha2VTdHJlYW0pO1xuaGFyZGVuKG1ha2VTdHJlYW0pO1xuXG4vKiBKU0RvYyBUeXBlU2NyaXB0IHNlZW1zIHVuYWJsZSB0byBleHByZXNzIHRoaXMgcGFydGljdWxhciBmdW5jdGlvbidzKi9cbi8qIGVudGFuZ2xlbWVudCBvZiBxdWV1ZXMsIGJ1dCB0aGUgZGVmaW5pdGlvbiBpbiB0eXBlcy5kLnRzIHdvcmtzIGZvciB0aGUgZW5kKi9cbi8qIHVzZXIuKi9cbmNvbnN0ICAgICAgICBtYWtlUGlwZT0oKT0+e1xuY29uc3QgZGF0YT1tYWtlUXVldWUoKTtcbmNvbnN0IGFja3M9bWFrZVF1ZXVlKCk7XG5jb25zdCByZWFkZXI9bWFrZVN0cmVhbShhY2tzLGRhdGEpO1xuY29uc3Qgd3JpdGVyPW1ha2VTdHJlYW0oZGF0YSxhY2tzKTtcbnJldHVybiBoYXJkZW4oW3dyaXRlcixyZWFkZXJdKTtcbiB9OyRo4oCNX29uY2UubWFrZVBpcGUobWFrZVBpcGUpO1xuaGFyZGVuKG1ha2VQaXBlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmVhZFJldHVyblxuICogQHRlbXBsYXRlIFRXcml0ZVJldHVyblxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU3RyZWFtPFRXcml0ZSwgVFJlYWQsIFRXcml0ZVJldHVybiwgVFJlYWRSZXR1cm4+fSB3cml0ZXJcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlN0cmVhbTxUUmVhZCwgVFdyaXRlLCBUUmVhZFJldHVybiwgVFdyaXRlUmV0dXJuPn0gcmVhZGVyXG4gKiBAcGFyYW0ge1RXcml0ZX0gcHJpbWVyXG4gKi9cbmNvbnN0ICAgICAgICBwdW1wPWFzeW5jKHdyaXRlcixyZWFkZXIscHJpbWVyKT0+e1xuLyoqIEBwYXJhbSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUUmVhZCwgVFJlYWRSZXR1cm4+Pn0gcHJvbWlzZSAqL1xuY29uc3QgdGljaz0ocHJvbWlzZSk9PlxuRS53aGVuKFxucHJvbWlzZSxcbihyZXN1bHQpPT57XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gd3JpdGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuIH1lbHNle1xuLyogQmVob2xkOiBtdXR1YWwgcmVjdXJzaW9uLiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIHRvY2sod3JpdGVyLm5leHQocmVzdWx0LnZhbHVlKSk7XG4gfVxuIH0sXG4oLyoqIEB0eXBlIHtFcnJvcn0gKi9lcnJvcik9PntcbnJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuIH0pO1xuXG4vKiogQHBhcmFtIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRXcml0ZSwgVFdyaXRlUmV0dXJuPj59IHByb21pc2UgKi9cbmNvbnN0IHRvY2s9KHByb21pc2UpPT5cbkUud2hlbihcbnByb21pc2UsXG4ocmVzdWx0KT0+e1xuaWYocmVzdWx0LmRvbmUpe1xucmV0dXJuIHJlYWRlci5yZXR1cm4ocmVzdWx0LnZhbHVlKTtcbiB9ZWxzZXtcbnJldHVybiB0aWNrKHJlYWRlci5uZXh0KHJlc3VsdC52YWx1ZSkpO1xuIH1cbiB9LFxuKC8qKiBAdHlwZSB7RXJyb3J9ICovZXJyb3IpPT57XG5yZXR1cm4gcmVhZGVyLnRocm93KGVycm9yKTtcbiB9KTtcblxuYXdhaXQgdGljayhyZWFkZXIubmV4dChwcmltZXIpKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfTskaOKAjV9vbmNlLnB1bXAocHVtcCk7XG5oYXJkZW4ocHVtcCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRSZWFkXG4gKiBAdGVtcGxhdGUgVFdyaXRlXG4gKiBAdGVtcGxhdGUgVFJldHVyblxuICogQHBhcmFtIHtBc3luY0dlbmVyYXRvcjxUUmVhZCwgVFJldHVybiwgVFdyaXRlPn0gZ2VuZXJhdG9yXG4gKiBAcGFyYW0ge1RXcml0ZX0gcHJpbWVyXG4gKi9cbmNvbnN0ICAgICAgICBwcmltZT0oZ2VuZXJhdG9yLHByaW1lcik9Pntcbi8qIFdlIGNhcHR1cmUgdGhlIGZpcnN0IHJldHVybmVkIHByb21pc2UuKi9cbmNvbnN0IGZpcnN0PWdlbmVyYXRvci5uZXh0KHByaW1lcik7XG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmV0dXJuPj19ICovXG5sZXQgcmVzdWx0O1xuY29uc3QgcHJpbWVkPWhhcmRlbih7XG4vKiogQHBhcmFtIHtUV3JpdGV9IHZhbHVlICovXG4gICAgICBhc3luYyBuZXh0KHZhbHVlKXtcbmlmKHJlc3VsdD09PXVuZGVmaW5lZCl7XG5yZXN1bHQ9YXdhaXQgZmlyc3Q7XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5yZXR1cm4gZ2VuZXJhdG9yLm5leHQodmFsdWUpO1xuIH0sXG4vKiogQHBhcmFtIHtUUmV0dXJufSB2YWx1ZSAqL1xuICAgICAgYXN5bmMgcmV0dXJuKHZhbHVlKXtcbmlmKHJlc3VsdD09PXVuZGVmaW5lZCl7XG5yZXN1bHQ9YXdhaXQgZmlyc3Q7XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5yZXR1cm4gZ2VuZXJhdG9yLnJldHVybih2YWx1ZSk7XG4gfSxcbi8qKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAqL1xuICAgICAgYXN5bmMgdGhyb3coZXJyb3Ipe1xuaWYocmVzdWx0PT09dW5kZWZpbmVkKXtcbnJlc3VsdD1hd2FpdCBmaXJzdDtcbmlmKHJlc3VsdC5kb25lKXtcbnRocm93IGVycm9yO1xuIH1cbiB9XG5yZXR1cm4gZ2VuZXJhdG9yLnRocm93KGVycm9yKTtcbiB9fSk7XG5cbnJldHVybiBwcmltZWQ7XG4gfTskaOKAjV9vbmNlLnByaW1lKHByaW1lKTtcbmhhcmRlbihwcmltZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRJblxuICogQHRlbXBsYXRlIFRPdXRcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlYWRlcjxUSW4+fSByZWFkZXJcbiAqIEBwYXJhbSB7KHZhbHVlOiBUSW4pID0+IFRPdXR9IHRyYW5zZm9ybVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZWFkZXI8VE91dD59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBSZWFkZXI9KHJlYWRlcix0cmFuc2Zvcm0pPT57XG5hc3luYyBmdW5jdGlvbip0cmFuc2Zvcm1HZW5lcmF0b3IoKXtcbmZvciBhd2FpdChjb25zdCB2YWx1ZSBvZiByZWFkZXIpe1xueWllbGQgdHJhbnNmb3JtKHZhbHVlKTtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBoYXJkZW4odHJhbnNmb3JtR2VuZXJhdG9yKCkpO1xuIH07JGjigI1fb25jZS5tYXBSZWFkZXIobWFwUmVhZGVyKTtcbmhhcmRlbihtYXBSZWFkZXIpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUSW5cbiAqIEB0ZW1wbGF0ZSBUT3V0XG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Xcml0ZXI8VE91dD59IHdyaXRlclxuICogQHBhcmFtIHsodmFsdWU6IFRJbikgPT4gVE91dH0gdHJhbnNmb3JtXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi90eXBlcy5qcycpLldyaXRlcjxUSW4+fVxuICovXG5jb25zdCAgICAgICAgbWFwV3JpdGVyPSh3cml0ZXIsdHJhbnNmb3JtKT0+e1xuY29uc3QgdHJhbnNmb3JtZWRXcml0ZXI9aGFyZGVuKHtcbi8qKlxuICogQHBhcmFtIHtUSW59IHZhbHVlXG4gKi9cbiAgICAgIGFzeW5jIG5leHQodmFsdWUpe1xucmV0dXJuIHdyaXRlci5uZXh0KHRyYW5zZm9ybSh2YWx1ZSkpO1xuIH0sXG4vKipcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKi9cbiAgICAgIGFzeW5jIHRocm93KGVycm9yKXtcbnJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuIH0sXG4vKipcbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSB2YWx1ZVxuICovXG4gICAgICBhc3luYyByZXR1cm4odmFsdWUpe1xucmV0dXJuIHdyaXRlci5yZXR1cm4odmFsdWUpO1xuIH0sXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7XG5yZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG4gfX0pO1xuXG5yZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG4gfTskaOKAjV9vbmNlLm1hcFdyaXRlcihtYXBXcml0ZXIpO1xuaGFyZGVuKG1hcFdyaXRlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVF1ZXVlIjpbIm1ha2VRdWV1ZSJdLCJtYWtlU3RyZWFtIjpbIm1ha2VTdHJlYW0iXSwibWFrZVBpcGUiOlsibWFrZVBpcGUiXSwicHVtcCI6WyJwdW1wIl0sInByaW1lIjpbInByaW1lIl0sIm1hcFJlYWRlciI6WyJtYXBSZWFkZXIiXSwibWFwV3JpdGVyIjpbIm1hcFdyaXRlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACLuoeSrQEAAK0BAAAcAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvbWFpbi5qc3siaW1wb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3JpbmcwL21haW4uanNcIiwgW11dLFtcIi4vcmluZzEvbWFpbi5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnc8TiV0BAABdAQAAHwAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL0UuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiQGVuZG8vZmFyIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD4tMm/qQMAAKkDAAAsAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzeW5jR2VuZXJhdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIFJldHVybiBhbiBhc3luYyBpdGVyYWJsZSB0aGF0IHByb2R1Y2VzIGl0ZXJhdG9yIHJlc3VsdHMgdmlhIGBuZXh0YC5cbiAqXG4gKiBUaGlzIHdvcmtzIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBTeW1ib2wuXG4gKlxuICogQHRlbXBsYXRlIFQsVFJldHVyblxuICogQHBhcmFtIHsoKSA9PiBJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPiB8XG4gKiAgICAgICAgICAgICAgIFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+XG4gKiB9IG5leHQgcHJvZHVjZSBhIHNpbmdsZS1zdGVwIGl0ZXJhdG9yIHJlc3VsdFxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBhc3luY0dlbmVyYXRlPShuZXh0KT0+e1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6YXN5bmMoKT0+aGFyZGVuKG5leHQoKSl9KTtcblxuIH19KTtcblxuIH07JGjigI1fb25jZS5hc3luY0dlbmVyYXRlKGFzeW5jR2VuZXJhdGUpO1xuaGFyZGVuKGFzeW5jR2VuZXJhdGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jR2VuZXJhdGUiOlsiYXN5bmNHZW5lcmF0ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACX11Tt0AEAANABAAAiAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFpbi5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIiwiLi9tYWtlcnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL0UuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIiwiLi9tYWtlcnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL0UuanNcIiwgW11dLFtcIi4vbWFrZXJzLmpzXCIsIFtdXSxbXCIuL2FzeW5jLWdlbmVyYXRlLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABvm3ti4wgAAOMIAAAkAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFrZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlTWFwIiwibWFrZVByb21pc2UiLCJtYWtlU2V0IiwibWFrZVdlYWtNYXAiLCJtYWtlV2Vha1NldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBUaGVzZSB3b3JrIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBgbmV3YC4qL1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIiAvPiovXG5cbi8qKiBAdHlwZSB7PFQ+KGV4ZWN1dG9yOiAocmVzb2x2ZTogKHZhbHVlOiBUKSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+XG4gKiB2b2lkKSA9PiB2b2lkKSA9PiBQcm9taXNlPFQ+fSAqL1xuY29uc3QgICAgICAgIG1ha2VQcm9taXNlPShleGVjdXRvcik9PmhhcmRlbihuZXcgUHJvbWlzZShleGVjdXRvcikpOyRo4oCNX29uY2UubWFrZVByb21pc2UobWFrZVByb21pc2UpO1xuaGFyZGVuKG1ha2VQcm9taXNlKTtcblxuLyoqIEB0eXBlZGVmIHs8SywgVj4oZW50cmllcz86IHJlYWRvbmx5IChyZWFkb25seSBbSywgVl0pW10pID0+IE1hcDxLLCBWPn0gTWFwRnJvbUVudHJpZXMgKi9cbi8qKiBAdHlwZWRlZiB7PEssIFY+KGl0ZXJhYmxlOiBJdGVyYWJsZTxyZWFkb25seSBbSywgVl0+KSA9PiBNYXA8SywgVj59IE1hcEZyb21JdGVyYWJsZSAqL1xuXG4vKiogQHR5cGUge01hcEZyb21FbnRyaWVzICYgTWFwRnJvbUl0ZXJhYmxlfSAqL1xuY29uc3QgICAgICAgIG1ha2VNYXA9KGVudHJpZXNPckl0ZXJhYmxlKT0+aGFyZGVuKG5ldyBNYXAoZW50cmllc09ySXRlcmFibGUpKTskaOKAjV9vbmNlLm1ha2VNYXAobWFrZU1hcCk7XG5oYXJkZW4obWFrZU1hcCk7XG5cbi8qKiBAdHlwZWRlZiB7PFQ+KHZhbHVlcz86IHJlYWRvbmx5IFRbXSkgPT4gU2V0PFQ+fSBTZXRGcm9tVmFsdWVzICovXG4vKiogQHR5cGVkZWYgezxUPihpdGVyYWJsZTogSXRlcmFibGU8VD4pID0+IFNldDxUPn0gU2V0RnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1NldEZyb21WYWx1ZXMgJiBTZXRGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZVNldD0odmFsdWVzKT0+aGFyZGVuKG5ldyBTZXQodmFsdWVzKSk7JGjigI1fb25jZS5tYWtlU2V0KG1ha2VTZXQpO1xuaGFyZGVuKG1ha2VTZXQpO1xuXG4vKiogQHR5cGVkZWYgezxLIGV4dGVuZHMge30sIFYgPSBhbnk+KGVudHJpZXM/OiByZWFkb25seSBbSywgVl1bXSB8IG51bGwpID0+IFdlYWtNYXA8SywgVj59IFdlYWtNYXBGcm9tRW50cmllcyAqL1xuLyoqIEB0eXBlZGVmIHs8SyBleHRlbmRzIHt9LCBWPihpdGVyYWJsZTogSXRlcmFibGU8W0ssIFZdPikgPT4gV2Vha01hcDxLLCBWPn0gV2Vha01hcEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtXZWFrTWFwRnJvbUVudHJpZXMgJiBXZWFrTWFwRnJvbUl0ZXJhYmxlfSAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrTWFwPShlbnRyaWVzKT0+aGFyZGVuKG5ldyBXZWFrTWFwKGVudHJpZXMpKTskaOKAjV9vbmNlLm1ha2VXZWFrTWFwKG1ha2VXZWFrTWFwKTtcbmhhcmRlbihtYWtlV2Vha01hcCk7XG5cbi8qKiBAdHlwZWRlZiB7PFQgZXh0ZW5kcyB7fT4odmFsdWVzPzogcmVhZG9ubHkgVFtdKSA9PiBXZWFrU2V0PFQ+fSBXZWFrU2V0RnJvbVZhbHVlcyAqL1xuLyoqIEB0eXBlZGVmIHs8VCBleHRlbmRzIHt9PihpdGVyYWJsZTogSXRlcmFibGU8VD4pID0+IFdlYWtTZXQ8VD59IFdlYWtTZXRGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7V2Vha1NldEZyb21WYWx1ZXMgJiBXZWFrU2V0RnJvbUl0ZXJhYmxlfSAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrU2V0PSh2YWx1ZXMpPT5oYXJkZW4obmV3IFdlYWtTZXQodmFsdWVzKSk7JGjigI1fb25jZS5tYWtlV2Vha1NldChtYWtlV2Vha1NldCk7XG5oYXJkZW4obWFrZVdlYWtTZXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlIjpbIm1ha2VQcm9taXNlIl0sIm1ha2VNYXAiOlsibWFrZU1hcCJdLCJtYWtlU2V0IjpbIm1ha2VTZXQiXSwibWFrZVdlYWtNYXAiOlsibWFrZVdlYWtNYXAiXSwibWFrZVdlYWtTZXQiOlsibWFrZVdlYWtTZXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtCz1mP4EAAD+BAAAKQAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzeyJpbXBvcnRzIjpbIi4uL3JpbmcwL21haW4uanMiXSwiZXhwb3J0cyI6WyJhc3luY0RvV2hpbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVByb21pc2U7JGjigI1faW1wb3J0cyhbW1wiLi4vcmluZzAvbWFpbi5qc1wiLCBbW1wibWFrZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIFJlc29sdmUgcmV0dXJuZWQgcHJvbWlzZSB3aXRoIHVuZGVmaW5lZCB3aGVuIGBib2R5YCByZXR1cm5zIGZhbHN5LlxuICpcbiAqIFRoaXMgd29ya3MgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIGBhd2FpdGAgbm90IGF0IHRoZSBmdW5jdGlvbi1sZXZlbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUIHwgUHJvbWlzZTxUPn0gYm9keSBwZXJmb3JtIHNpZGUtZWZmZWN0cywgYW5kIHJldHVybiB0cnV0aHkgaWZcbiAqIHdlIHNob3VsZCBydW4gYWdhaW5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5jb25zdCAgICAgICAgYXN5bmNEb1doaWxlPShib2R5KT0+e1xuY29uc3QgbG9vcD1hc3luYyhyZXNvbHZlLHJlamVjdCk9PntcbmNvbnN0IGRvQ29udGludWU9YXdhaXQgYm9keSgpO1xuaWYoIWRvQ29udGludWUpe1xuLyogUmVzb2x2ZSB0aGUgb3V0ZXJtb3N0IHByb21pc2UuKi9cbnJlc29sdmUodW5kZWZpbmVkKTtcbnJldHVybjtcbiB9XG5cbi8qIERvIHRoZSBsb29wIGFnYWluLiAgV2UgYXJlIGNhcmVmdWwgbm90IHRvIGF3YWl0IHNvIHRoYXQgd2UgZG9uJ3QgY3JlYXRlIGEqL1xuLyogcHJvbWlzZSBjaGFpbi4qL1xubG9vcChyZXNvbHZlLHJlamVjdCkuY2F0Y2gocmVqZWN0KTtcbiB9O1xuXG5yZXR1cm4gbWFrZVByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+bG9vcChyZXNvbHZlLHJlamVjdCkuY2F0Y2gocmVqZWN0KSk7XG4gfTskaOKAjV9vbmNlLmFzeW5jRG9XaGlsZShhc3luY0RvV2hpbGUpO1xuaGFyZGVuKGFzeW5jRG9XaGlsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNEb1doaWxlIjpbImFzeW5jRG9XaGlsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACWE0KycgEAAHIBAAAiAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvbWFpbi5qc3siaW1wb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vYXN5bmMtdG9vbHMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAAW7le8gTtAAAE7QAAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAOYpWAjsLAAA7CwAAIwAAAAAAAAAAAAAApIE27QAAQGFnb3JpYy9hc3NlcnQtdjAuNi4wL3NyYy9hc3NlcnQuanNQSwECHgMKAAAAAAAAAAAABbmH7NouAADaLgAAIgAAAAAAAAAAAAAApIGy+AAAQGFnb3JpYy9hc3NlcnQtdjAuNi4wL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABT9YW/RjcAAEY3AAAmAAAAAAAAAAAAAACkgcwnAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50TWF0aC5qc1BLAQIeAwoAAAAAAAAAAABKlADt1QUAANUFAAAnAAAAAAAAAAAAAACkgVZfAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvZGlzcGxheUluZm8uanNQSwECHgMKAAAAAAAAAAAAQzB73OgBAADoAQAAIQAAAAAAAAAAAAAApIFwZQEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAADVdwSiYIAAAmCAAACUAAAAAAAAAAAAAAKSBl2cBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pc3N1ZXJLaXQuanNQSwECHgMKAAAAAAAAAAAAk7H0N40WAACNFgAAMgAAAAAAAAAAAAAApIFyiAEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2xlZ2FjeS1wYXltZW50LWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAgMhu7rMFAACzBQAAOgAAAAAAAAAAAAAApIFPnwEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABx52I9xwUAAMcFAAA6AAAAAAAAAAAAAACkgVqlAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAP/csPsqBgAAKgYAADYAAAAAAAAAAAAAAKSBeasBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAmmZgvnwcAAJ8HAAA2AAAAAAAAAAAAAACkgfexAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAsDioH6UEAAClBAAAIwAAAAAAAAAAAAAApIHquQEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanNQSwECHgMKAAAAAAAAAAAAD9fo7usxAADrMQAAKQAAAAAAAAAAAAAApIHQvgEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanNQSwECHgMKAAAAAAAAAAAAokVFQsAPAADADwAAIQAAAAAAAAAAAAAApIEC8QEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3B1cnNlLmpzUEsBAh4DCgAAAAAAAAAAAC5JY6kUBgAAFAYAAC0AAAAAAAAAAAAAAKSBAQECAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAAo7p4+EicAABInAAAmAAAAAAAAAAAAAACkgWAHAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAAAsz6lRcD8AAHA/AAApAAAAAAAAAAAAAACkgbYuAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAABFrthqSi0AAEotAAA0AAAAAAAAAAAAAACkgW1uAgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjAvc3JjL2ZlZURpc3RyaWJ1dG9yLmpzUEsBAh4DCgAAAAAAAAAAAG3bYQpeKAAAXigAACcAAAAAAAAAAAAAAKSBCZwCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jYWxsYmFjay5qc1BLAQIeAwoAAAAAAAAAAACqj91GIgYAACIGAAAlAAAAAAAAAAAAAACkgazEAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY29uZmlnLmpzUEsBAh4DCgAAAAAAAAAAABfJM4DIBAAAyAQAACQAAAAAAAAAAAAAAKSBEcsCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9kZWJ1Zy5qc1BLAQIeAwoAAAAAAAAAAABuFZifQwIAAEMCAAAkAAAAAAAAAAAAAACkgRvQAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAbco46wkuAAAJLgAALwAAAAAAAAAAAAAApIGg0gIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNQSwECHgMKAAAAAAAAAAAAafLEQCcPAAAnDwAAKwAAAAAAAAAAAAAApIH2AAMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21ldGhvZC10b29scy5qc1BLAQIeAwoAAAAAAAAAAABUOfoRLQIAAC0CAAApAAAAAAAAAAAAAACkgWYQAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAADexqKMKwcAACsHAAAqAAAAAAAAAAAAAACkgdoSAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdXBncmFkZS1hcGkuanNQSwECHgMKAAAAAAAAAAAAoumxkuM8AADjPAAAJAAAAAAAAAAAAAAApIFNGgMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAGfQxYrVEgAA1RIAADMAAAAAAAAAAAAAAKSBclcDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1BLAQIeAwoAAAAAAAAAAACwvi9PHAcAABwHAAAkAAAAAAAAAAAAAACkgZhqAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA8rAIZVoYAABaGAAAJwAAAAAAAAAAAAAApIH2cQMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL25vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAFZ/h0h+OAAAfjgAACoAAAAAAAAAAAAAAKSBlYoDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9wdWJsaXNoLWtpdC5qc1BLAQIeAwoAAAAAAAAAAAC+ATAkgwoAAIMKAAAuAAAAAAAAAAAAAACkgVvDAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAOs+VGqwIgAAsCIAACcAAAAAAAAAAAAAAKSBKs4DAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc1BLAQIeAwoAAAAAAAAAAAB1YuMobiQAAG4kAAAoAAAAAAAAAAAAAACkgR/xAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlLmpzUEsBAh4DCgAAAAAAAAAAACeyOyPFCwAAxQsAACkAAAAAAAAAAAAAAKSB0xUEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmVyLmpzUEsBAh4DCgAAAAAAAAAAACGBFnIMBgAADAYAACQAAAAAAAAAAAAAAKSB3yEEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90b3BpYy5qc1BLAQIeAwoAAAAAAAAAAAD4UQ8TPzAAAD8wAAAsAAAAAAAAAAAAAACkgS0oBABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAAA+Ylw2XAEAAFwBAAAgAAAAAAAAAAAAAACkgbZYBABAYWdvcmljL3N0b3JlLXYwLjkuMi9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAABqgKjv3AsAANwLAAAhAAAAAAAAAAAAAACkgVBaBABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA4q+AfUYLAABGCwAALAAAAAAAAAAAAAAApIFrZgQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanNQSwECHgMKAAAAAAAAAAAApoNNtMIGAADCBgAAMAAAAAAAAAAAAAAApIH7cQQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzUEsBAh4DCgAAAAAAAAAAAJoDutcWFgAAFhYAADEAAAAAAAAAAAAAAKSBC3kEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAAnQOWIEEPAABBDwAAMQAAAAAAAAAAAAAApIFwjwQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAAZQWnY4xIAAOMSAAA1AAAAAAAAAAAAAACkgQCfBABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABtrD+9hA4AAIQOAAA1AAAAAAAAAAAAAACkgTayBABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAACy12MInRkAAJ0ZAAAuAAAAAAAAAAAAAACkgQ3BBABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAMUArIJYKgAAWCoAACEAAAAAAAAAAAAAAKSB9toEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAhmCHYvwEAAL8BAAAcAAAAAAAAAAAAAACkgY0FBQBAYWdvcmljL3RpbWUtdjAuMy4yL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAMBAN+aoIgAAqCIAACMAAAAAAAAAAAAAAKSBhgcFAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3RpbWVNYXRoLmpzUEsBAh4DCgAAAAAAAAAAAG6zHqqnBwAApwcAACUAAAAAAAAAAAAAAKSBbyoFAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAvtREY2MoAABjKAAAKAAAAAAAAAAAAAAApIFZMgUAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2V4by11dGlscy5qc1BLAQIeAwoAAAAAAAAAAAA74z2IkggAAJIIAAAkAAAAAAAAAAAAAACkgQJbBQBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA3vSPIFMoAABTKAAAMAAAAAAAAAAAAAAApIHWYwUAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzUEsBAh4DCgAAAAAAAAAAAOWxCczbQwAA20MAACUAAAAAAAAAAAAAAKSBd4wFAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAt8K8e+IGAADiBgAAHwAAAAAAAAAAAAAApIGV0AUAQGFnb3JpYy96b25lLXYwLjIuMi9zcmMvaGVhcC5qc1BLAQIeAwoAAAAAAAAAAADY9BkwjwkAAI8JAAAgAAAAAAAAAAAAAACkgbTXBQBAYWdvcmljL3pvbmUtdjAuMi4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAB+JG4t0hEAANIRAAAkAAAAAAAAAAAAAACkgYHhBQBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAANwvtTx8CAAAfAgAAKgAAAAAAAAAAAAAApIGV8wUAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yL3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAAKFYIz+PEAAAjxAAAC4AAAAAAAAAAAAAAKSB/PUFAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAAOlKtTRwCAAAcAgAAGQAAAAAAAAAAAAAApIHXBgYAQGVuZG8vZXhvLXYwLjIuMi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADGt+tWYxgAAGMYAAAiAAAAAAAAAAAAAACkgSoJBgBAZW5kby9leG8tdjAuMi4yL3NyYy9leG8tbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAADGwrfJxJgAAcSYAACEAAAAAAAAAAAAAAKSBzSEGAEBlbmRvL2V4by12MC4yLjIvc3JjL2V4by10b29scy5qc1BLAQIeAwoAAAAAAAAAAABBDDOUQAIAAEACAAAeAAAAAAAAAAAAAACkgX1IBgBAZW5kby9mYXItdjAuMi4xOC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAApY8690oHAABKBwAAHQAAAAAAAAAAAAAApIH5SgYAQGVuZG8vbWFyc2hhbC12MC44LjUvaW5kZXguanNQSwECHgMKAAAAAAAAAAAADQgme5QNAACUDQAAKwAAAAAAAAAAAAAApIF+UgYAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1BLAQIeAwoAAAAAAAAAAAA7cs+A5D8AAOQ/AAAqAAAAAAAAAAAAAACkgVtgBgBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlUGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAxFOn8Pw/AAD8PwAAKwAAAAAAAAAAAAAApIGHoAYAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1BLAQIeAwoAAAAAAAAAAACzXvdrxTsAAMU7AAAtAAAAAAAAAAAAAACkgczgBgBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanNQSwECHgMKAAAAAAAAAAAACEKS/awqAACsKgAAKgAAAAAAAAAAAAAApIHcHAcAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL21hcnNoYWwtanVzdGluLmpzUEsBAh4DCgAAAAAAAAAAABPT1RvcBgAA3AYAAC0AAAAAAAAAAAAAAKSB0EcHAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1BLAQIeAwoAAAAAAAAAAAC+nmlK7DIAAOwyAAAjAAAAAAAAAAAAAACkgfdOBwBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvbWFyc2hhbC5qc1BLAQIeAwoAAAAAAAAAAABXRGQKfkAAAH5AAAAlAAAAAAAAAAAAAACkgSSCBwBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAAJgZO7M0AQAANAEAACEAAAAAAAAAAAAAAKSB5cIHAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAlHpu9zwsAAM8LAAAeAAAAAAAAAAAAAACkgVjEBwBAZW5kby9uYXQtdjQuMS4yNy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAZfKMGnwIAAB8CAAAIAAAAAAAAAAAAAAApIFj0AcAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA3ka2qpMHAACTBwAAKAAAAAAAAAAAAAAApIEd2QcAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAACD9dsszwcAAM8HAAApAAAAAAAAAAAAAACkgfbgBwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAADToDhxnREAAJ0RAAAkAAAAAAAAAAAAAACkgQzpBwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvZXJyb3IuanNQSwECHgMKAAAAAAAAAAAASjtmg1UIAABVCAAAKwAAAAAAAAAAAAAApIHr+gcAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABiTWcDThoAAE4aAAAnAAAAAAAAAAAAAACkgYkDCABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvbWFrZS1mYXIuanNQSwECHgMKAAAAAAAAAAAAApF75R0EAAAdBAAAKQAAAAAAAAAAAAAApIEcHggAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL21ha2VUYWdnZWQuanNQSwECHgMKAAAAAAAAAAAAGUAoxvUZAAD1GQAAMAAAAAAAAAAAAAAApIGAIggAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAC5usQ2DGwAAgxsAACoAAAAAAAAAAAAAAKSBwzwIAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9wYXNzU3R5bGVPZi5qc1BLAQIeAwoAAAAAAAAAAAAUsaJ9wyEAAMMhAAAoAAAAAAAAAAAAAACkgY5YCABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcmVtb3RhYmxlLmpzUEsBAh4DCgAAAAAAAAAAADXiToqaDwAAmg8AACsAAAAAAAAAAAAAAKSBl3oIAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9zYWZlLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAxx/VUEcSAABHEgAAJQAAAAAAAAAAAAAApIF6iggAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAAAlvFz7/QcAAP0HAAAlAAAAAAAAAAAAAACkgQSdCABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAHqgfmgSDQAAEg0AACkAAAAAAAAAAAAAAKSBRKUIAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAJgZO7M0AQAANAEAACQAAAAAAAAAAAAAAKSBnbIIAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACwnEJ+4goAAOIKAAAeAAAAAAAAAAAAAACkgRO0CABAZW5kby9wYXR0ZXJucy12MC4yLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAyxcZ4KRGAACkRgAAKgAAAAAAAAAAAAAApIExvwgAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL2NoZWNrS2V5LmpzUEsBAh4DCgAAAAAAAAAAAPfmwlF3GgAAdxoAAC0AAAAAAAAAAAAAAKSBHQYJAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1BLAQIeAwoAAAAAAAAAAABVIML9KhQAACoUAAApAAAAAAAAAAAAAACkgd8gCQBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY29weUJhZy5qc1BLAQIeAwoAAAAAAAAAAAAKHf6/oxAAAKMQAAApAAAAAAAAAAAAAACkgVA1CQBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY29weVNldC5qc1BLAQIeAwoAAAAAAAAAAAALKJ5teSUAAHklAAA1AAAAAAAAAAAAAACkgTpGCQBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAAAi9nVSnigAAJ4oAAA1AAAAAAAAAAAAAACkgQZsCQBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAACJDDsFM8MAADPDAAA1AAAAAAAAAAAAAACkgfeUCQBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAiAAAAAAAAAAAAAACkgX1YCgBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAJYe98fqGgAA6hoAACIAAAAAAAAAAAAAAKSB8VkKAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAClK+n3AJAABwCQAAIgAAAAAAAAAAAAAApIEbdQoAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACIfYGs3wIAAN8CAAArAAAAAAAAAAAAAACkgct+CgBAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAB2nTeu+EgAAvhIAACoAAAAAAAAAAAAAAKSB84EKAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAADTQ7DuaQcAAGkHAAA1AAAAAAAAAAAAAACkgfmUCgBAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAmAAAAAAAAAAAAAACkgbWcCgBAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAMriXk9BgAAPQYAAAdAAAAAAAAAAAAAACkgS2eCgBAZW5kby9zdHJlYW0tdjAuMy4yNS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACLuoeSrQEAAK0BAAAcAAAAAAAAAAAAAACkgVy3CgBqZXNzaWUuanMtdjAuMy4yL3NyYy9tYWluLmpzUEsBAh4DCgAAAAAAAAAAAJ3PE4ldAQAAXQEAAB8AAAAAAAAAAAAAAKSBQ7kKAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL0UuanNQSwECHgMKAAAAAAAAAAAA+LTJv6kDAACpAwAALAAAAAAAAAAAAAAApIHdugoAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanNQSwECHgMKAAAAAAAAAAAAl9dU7dABAADQAQAAIgAAAAAAAAAAAAAApIHQvgoAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAABvm3ti4wgAAOMIAAAkAAAAAAAAAAAAAACkgeDACgBqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAtCz1mP4EAAD+BAAAKQAAAAAAAAAAAAAApIEFygoAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAlhNCsnIBAAByAQAAIgAAAAAAAAAAAAAApIFKzwoAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvbWFpbi5qc1BLBQYAAAAAcQBxAOslAAD80AoAAAA=","endoZipBase64Sha512":"ec3fe85bc79538c2d1c97f963beabd0833cc41d30d3ded77c07c9d481bfdc4e8bfb52fc83f2b393e5955ad425ba72d8f42bf662aecc1ca6583eb943fe4a591c3"};
|