@agoric/builders 0.3.0-u23.0 → 0.3.0-u23.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/package.json +17 -17
- package/scripts/bundles/bundle-binaryVoteCounter-js-meta.json +0 -790
- package/scripts/bundles/bundle-binaryVoteCounter.js +0 -1
- package/scripts/bundles/bundle-committee-js-meta.json +0 -810
- package/scripts/bundles/bundle-committee.js +0 -1
- package/scripts/bundles/bundle-contractGovernor-js-meta.json +0 -805
- package/scripts/bundles/bundle-contractGovernor.js +0 -1
- package/scripts/bundles/bundle-econCommitteeCharter-js-meta.json +0 -765
- package/scripts/bundles/bundle-econCommitteeCharter.js +0 -1
- package/scripts/bundles/bundle-feeDistributor-js-meta.json +0 -770
- package/scripts/bundles/bundle-feeDistributor.js +0 -1
- package/scripts/bundles/bundle-fluxAggregatorKit-js-meta.json +0 -960
- package/scripts/bundles/bundle-fluxAggregatorKit.js +0 -1
- package/scripts/bundles/bundle-mintHolder-js-meta.json +0 -740
- package/scripts/bundles/bundle-mintHolder.js +0 -1
- package/scripts/bundles/bundle-priceAggregator-js-meta.json +0 -990
- package/scripts/bundles/bundle-priceAggregator.js +0 -1
- package/scripts/bundles/bundle-provisionPool-js-meta.json +0 -915
- package/scripts/bundles/bundle-provisionPool.js +0 -1
- package/scripts/bundles/bundle-psm-js-meta.json +0 -980
- package/scripts/bundles/bundle-psm.js +0 -1
- package/scripts/bundles/bundle-reserve-js-meta.json +0 -975
- package/scripts/bundles/bundle-reserve.js +0 -1
- package/scripts/bundles/bundle-scaledPriceAuthority-js-meta.json +0 -880
- package/scripts/bundles/bundle-scaledPriceAuthority.js +0 -1
- package/scripts/bundles/bundle-vaultFactory-js-meta.json +0 -1045
- package/scripts/bundles/bundle-vaultFactory.js +0 -1
- package/scripts/bundles/bundle-walletFactory-js-meta.json +0 -990
- package/scripts/bundles/bundle-walletFactory.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAABUcIrpCSwBAAksAQAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIiwKICAgICJtb2R1bGUiOiAiLi9zcmMvcmVzZXJ2ZS9hc3NldFJlc2VydmUuanMiCiAgfSwKICAiY29tcGFydG1lbnRzIjogewogICAgIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9iYXNlLXpvbmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYxLjUuMTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9oZWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImhlYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMmZjOTZhZTJmZTA4NjZlNjdkN2EyODZiNTIzNDMxOTU4ZWRkYTY2ZTYwMGIyYmM0YzQ1Y2ZjMWQyYzYyMWY2NDQwM2ZhMDJhYjU1YWY2NzcwODdmMjI2MGQyYjRlNmQ2NWQzNjZmOTg3OGFkZTU5NjdlOWUwOWE1ZjY2MjhkYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVhcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVhcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUyZjZhODY4NjRjYjUxN2Y5ZWU1ZTBlOTczNWUzZGIxOGM3MmFiNTEyNTg0OGZiOGZiNWZiYjI3NDZkMmFhMjQ1MjNhZGRhMjkyNGNhY2UxNWU3NmViMzEyOWYyMDc1NjFlYWE0YjhmODFiMDhhODI5OTFmNWM5MzFjMDk0Mjk4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ1YmE3OTE1M2RiODgzZGVhMDgwOGE5MDYzNmQ3MTZkZjAzNGE3MDZiN2Y4NWRhZDM3NzczMjg1MDlhYzZmZGY5ZTk1NGFjZjk5OTk5MzA5NTc0ZjEzYzNmN2FjYzk2MTAzOWI5NDQ5YjgzNTg0M2RkOWQ5OTQ1NTNhZDc3MDIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg3ODE4MzdlNGFhNWUxMmYyYmZlOTJhYzIyZmNkN2ZjYmNiY2JhNDk0YzJjMzBjNTI1NTYyOWM3ODM2MDQzMDFmZGNmN2FhYTdlMmFlOWE2NWFhOTgxMmY5Y2M0ZWRkMjQ0OTRiM2JmNDJmMDU1NjdiY2ZjNzM5Y2JlMWU2YTMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNDFjZDYxZTQzOWE0YTczNzFkZTNlM2UxZmMzZjFhMmJmNDM4YWQ5MDFhYzJjYmQ0YzFjZTBiYmUyZjFiNDJlMmVkNDdlYjBmMWI1OGQyNWUzMjYxZmU1ZGE2OWE2NjI2NjA5MGMwOTE4ZjdjNDE5YzBmMDQ2OGYyNWRkMDRjMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLW9uY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2Utb25jZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdmZTIxNDMyYmFiZjlhMzg1MjNiZmNjMjczZDlhNGFhNzUzNTI0MzJkOTBmMzdlOGIyYTY0YWJlM2UwYmYwOGJiODNkZGMyOTRkNmM5NTY3MDMxOGQ1NTQwNTNlYTQ4ZTY0N2U5NjllYThjMzAxZTY0MjQzNzdkZDIzNDkzNTdkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ByZXBhcmUtYXR0ZW51YXRvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJlcGFyZS1hdHRlbnVhdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjZiNGFiMzFlYjI5MzIyYTdhNzIyMzk1YmJiNmJkOTRhNDAxMDVkMjJlODUyOGEwNjQ0MDkwYTQ5ZWViM2JlNjg4MzgwYjY2Y2ZhMmFlNTFiMDU2YjhkMTIyYTMyNWRmNTYxOWM2MGYyZmVhYTg1MDhhNWIyYmYzZGZlMjNmMzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJlcGFyZS1yZXZvY2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGVmZmQxY2E3MzVmNWQ4MTQxNzRhMzA3ZTM3YWFhY2Y1NDU3NjY0MjU0YWNmODRlMWUzYTZkMTMwZmY4ZTQ4ZjYwNmJmZTk4MDMxODljNGQ4OGJkZmQ5M2MyYzFhYWFjNzU4ZTIyYzFlODRiYmI3OWZiOTlmYzYxODYzNTIzMjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvd2F0Y2gtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvd2F0Y2gtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE0ZDg5OGU4NTdlZTlkOGY2NzBlNzJkYzkwYzg2ZGFhNmE0ZDk1YjAwMWMyMTA3OWY3ZTA0NjkwNjA0Y2I5YmY2OWU2YjI3YzE0ZGY3YzZkNDgyOGU3YTE4NDhiZDkzYzIwNWM2MjY4YmM1ZDdkM2I3MjZjZDhmMmQ4MzgwNmQ4IgogICAgICAgIH0sCiAgICAgICAgIi4vem9uZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInpvbmUtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkxZmI5NTdhYjIzNmY3YzkzYzM5OWQ2Yjg5ODM2OWZmMTIzMGFhMDdhMDlmZWZlYWE0NTQ5N2Y0YzY3N2I5N2JiZWY0MTBkYzg4OTVhMDNmY2JhNjViNGJjNTE2M2VmNDJhMzI3OGY3NzBmMjY3MGE1NmU4OTNmNGVmYmUzOWVkIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50TWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYW1vdW50TWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUyMWY4Y2E1YTJkYmQ0YWU1NmVhMDk3MTNiMzdkOWE1MTUzNjcyZjg4ZDFiMWFiOTkxNGNhMmI5OTI4YTQ0N2NhZDZhMmNkZTQ5MjUxMmFiNWU4YjAxY2Y4NGE5MDk3Zjc1N2E2ZjVmYmNiNTViNTM2ODBkNTk1ZmEwZmM5NmU2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Ftb3VudFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hbW91bnRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVmNTk5NTE5MzNjNTYyZGVkZGIzOTU0ODllNTc5OTI2M2U2MDA1NGI0YTc2YTViODY5YzY0NTIxODhhMDQ5ZmExMzg4N2JmYTgzNjgyNjY5YzM0MmM0YWJmNzIxYjZjOGQ0ZjdmYzBmZjE1Y2Y3MTg3OGE5NmNkMmQ5NzQ0ZThiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Rpc3BsYXlJbmZvLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kaXNwbGF5SW5mby5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE4YzU2MWUyOTQ2YTI3MmE2OWEzYWYwNjNmMjU5NTMyODA4MDJjN2I0MTQwZGI2YzNmMTlmOGYyZWUzM2E5YzI1ZGMwODFiYTAzZTkyMDNhMTgwOWQ3NmFlYjczNjMxM2Q3YzNmYTE4YmRjODFkMGEyZWUwZDVjZmRkYjI5NGNlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZhZTQ2MWUwNmFhNzk0MTBlYWE3MGUxNjVjMzU0MTY3ZWRhZTc1MzRiZTkyNzBhYzQ1NmZkNzkyNzBiZjdkOGNiMjA2MTQwMTJjNTI4MzM1MmM4MjQyZGExN2VjNWFhNzdmZTAyZWRkNzdmOWY5YjE1OTE5NTE5ZGFjZmQ0OWE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzc3VlcktpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXNzdWVyS2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWQ2ODllMWZlZjRiOTUzMGYzMmI5YjkxMWMxNWVmYzE2NTZmNDRhYTBkNDViMTJhMWQyNGQ4MDllNzAzYTNjZTQxYTAyNWI2M2I4OWYzYjdmNGU5Y2FmNzVkMzhhN2VjNjNmZDU5ODUzMGJkZTUxYzZmNjRjNTZjNWJjNTcxMDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYjVkZDU2NTFmOTQyZWZmYTBhNmZjOTZiNGQ3NDM3Mzg1OGMwMGMzM2RjMTZjZTUzMzM0ZDMyMDZkM2U5OTE1ZTM1MmMwZjZkN2E0OGU5YTc2NDdjYThlMDc4MDczYTVkN2RmYzVmMzY1OTgyOGIxYjQwMTVjMmVlMzg2YjViYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNkZWVmOWIwMDU3OWYxYWE2YmM2YmI5MGE2YTNlNjI5ZWY3OWE3ZGI4MDVjYzUxMmFkOWQ1YWViMDU2MDc4YmNlMGU0NWNlZGVhMjFhYjBiZTc4YjBlNjBjMDFiZjUxMDNkNGY5YjExMTA2Yjc1ZWRmZDE4MWUzMjI4ZWFjMTc0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2MjQ3NjQzM2E1NDdiN2Q2OWMxOWFiMGQwMTIwODU4MWQ4OGZkYjVkYTI2MTk5MDFlNjEzYjE1N2JiMjQwNWY5ZmVlOWRlYWY5MWI3YWNkYjE4NmQ0MjY4MTc0MzU3MzQ2MGUwZWM2NGJjMTQ5ZjcyNGNkNzNlNDZlOGUwY2I3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY2ODdmZDM5MWYzNTc4NTE3YThhYWEzMjJiYzU4NDRiNjBlNWFkOWNlMTMxMTFiZjA2OWJhZWExNjAxZjg4ODY5Y2Y3OTJkOGI3MGUzZmUxNjVlZGUxMWE3OWVlNWU0NDZkYTZiOWRjMWIxYzRhMjA1NThjNGU3ZWE1NGU1NDM4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NjMxMjA5ZGUzODZlYmUzM2Y0ZTA2YThjOGIxYjlmMjNmMGU0ZWY4NTA4ZjRkYWUyNGYwOWZiMTkxMTYwNjM4NDU2Yzg1YjRhNTllZTcyM2FmODcyMmM3OWVmOWRjNjJmOTU4ZDdlODUzYjA1OGM2YjY0NDQxY2JmZmFmMjY0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50TGVkZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50TGVkZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmE1YjEyNDFjYTA1NDU2MDBiZTc0YTAyMDFmOTg3MzIyNjY1ZjM1ZTA2ZjdiYWRkYzIyMGNkY2E0Nzk0M2M2YzBmY2VjMWE2MjlhZDE2OWM2MjU0YTE4MWNhNzI2YzMwMGE4OWEwNWU0Yzg2MDcwZmZmMGVkZTdkNzYzYmE2NzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVyc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1cnNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2VmNTc4Nzk0MTVkNzhiODgzMzYwZmU5MWJkYjc0NTExYTI3MzQxYjQ4YzM5ZmZiZjk2MWIxZTc4Njc5NDJlNDVjYTU4OTE5NDQ1YjU4YjA3MGNmNGVhN2VjMzNlYTAzNDVjYTBlZTkxNTE0MmMyODhjOTA2MWM0M2Y0MjE1NjIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmF0aW8uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhdGlvLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTg0MzI5NDU5ZWNiNjU5NmZkYjk1ZTMzNGMzMWI2ODNmZjQ1NWIzZTg4ZjlmZGNhNDczNTZlNDhkZDY2OTZlOTFmNDM3ZGVlZDFhMjZhMDZlMDdmZDg4NWQ5NDI3OTRhOTQ3M2U5ZmE3NTg3YmZiYzM4MjZlNTEyZDA2MTdmMTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2FmZU1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmVNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzE5NjYyMTE4MTdjMDMzYWQ2NTYzZjQ0YTExZmFhMzNhNWE4MTdkMGQzNDFjNTViNWUwNmViYjU5NWViODJiMTlhZThlZmJmMWIwY2E5ZGM4MmQxOTRhYzEzMGI5NWIzMmM4ZmJlNzM2MDI2M2ZmM2U0Y2E5Njk2MDMyYzJjNjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjBmNjRhZDNkZDY4YjNhZDRhYWY3MWJlYjkwNWFhNzE5NjM2MGM3NDU5NWI2ZGY0YjY0ZTk3ZjFhODkxODc5M2JkYjYyOGVmMzc2YWVlZGEyOTFlYjEyODA4ODhiODI3OGI0MDFjNmFlMTg2YmMwZWQ2NTc5MmYyNmNiNDM2NTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0MDQ3ZjU4MzI0NzAxYTliMjIyYzc5ODhiODc0NzAwNGIxN2U4YzI2NWE2N2ZlYzU0MGFhZjU1OGYxMDUzMTQ0OTFhMzMzMzQzOTg3ZjU5NDYwMzM1ODBiNTIwMWUyZGNhMDY3NWJmNTc5YjA3MDM4YmZmZmI3MmFmZjY3MDJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cC9zcmMvcmF0aW8uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9yYXRpby5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jbGVhblByb3Bvc2FsLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jbGVhblByb3Bvc2FsLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL21ha2VIYW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21ha2VIYW5kbGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3R5cGVHdWFyZHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnN0YW50cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29uc3RhbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGUwOGMzNDU1NTUyNTk1NjQ3MWNhOWU0ZmJmMTIwMWQwNmZhOWRiOWJlOWUxMWI4NDNlZTZjMGRkOWYyNjNlNDQ3NzVhYmY4OTg4ZGRkNTE0ZTEzNWY1YWEyNjc3ZWYwNDgzMGQ1NmEwM2UyNTZlNzY4MTkyNWFiZmZhYTY2MjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2Fzc2VydGlvbnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJuYW5jZS9hc3NlcnRpb25zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDM4YWIwNTUyNjE4NzdkMDZhMmVlNDcwNjI4YjZkZjFhYTk5ZjJlOTM3OWU1ZjA3NDQ1NWFhZjUzYTNmYmU4Y2VlZmZmMDk4YmM4YTRjY2U2NTJjMzdmODgyMWQ4NDE3NWM3ZmE3MGM5MzkxYjQ3NzkyYmQyNjZlZmI1ZjY2NWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk5ZWUwYjBlMzQ0ZmI1NDQ0NzFjYjAxODYzMjU3MzM5MTk5N2ZjYmY2ZTgzN2Y3MjQ1NWZjNDdmMTc4NjA2Y2YzNGQzMWI1MDg4NjNjY2Q2N2Q2OGFiMTgyMjU3OTFkYjRhZDNjN2E2Mzk5MWFhNzFhYTRkOTRkZjdlY2U2OGUxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5GaWx0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5GaWx0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1Mjc0ZmVmMTQ3OTQ1MTc4ZWM4NTcwZDczNjYwMWFkYmEzZDc4NzM4ZTUzZDJhMmNkMDk1Nzg3MjEzZWFlNmZmM2JjMDFhYzI4MDZjMzdlYTRhNWYwMDVjYWZlMmYxOWVkOTgyNTc4MTUzNmJkMzM3NzUwMmI0ZGY2NTYyNTE1ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJiNTM4ZGFmMzY3OGQ1Y2JhMTc0ZGZhMjM5YjZjMjMyZTkxMDYxNWVjZGFjMDcxNTY1NDM5YjIyM2ZjOGU2MTcwMGUzZTZlMjg4ZjNlYzIyYzljNGMwM2RlOTg2OGQzZmZmMDBmZmQ1M2ZkOGI2M2RkNmZhYWI5ZjA3Mzk0NzFiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ODIxOWVmNGIzODJkYTI0NDM0OTJjY2MxODdmNmYwMDRkMzlmN2FhMDA1MWM0ZDJkMmRlNmY5MTY1ZDIxZDYzZjg1NmE4NjkxY2E1MTU5MDc3MGY1OTE3ZjAxZmU0YTkwOTIyN2VlZDIzMGM4NzkxNWNjOGRiYTdhMWZiZGE2MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1MWJiOTZjZjFmYjc2YmE4OTY0ZDc0YTlhNzA1YTcyNTI1ZTM5N2U2YmNmYTllYjA4YTcxZjdkMGM4MmJkZWQ4YmQ0MGI5NzliNGUyNDNkZDM2YWE3MjM2MzA1YjFhODRmOWQ5MDY5YThkYzgzODU1ZWYzOWM1ZjU3YzQ4ZjRhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJub3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJub3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNDk5NDE5OTA2NzAxMmE3ZTRlMWYxYWM1MDRkMjYwYjU0YmIxZmFiYTY5YWMxYjU0MDRiYjEyMTNhZGExMzFmZTAxMjhhZTA3ZDcyNmRkMjhmNzU4NTVlMjAxZjM3Njc3MTZiMjI3NGQyNjYxZWE4ODZiZTZlZDc4NzU1YTg2ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybm9yS2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybm9yS2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzBkYzMyMzhhYjE0MjI2YWVmMTFlZDA1OTliNTY0ZGFkYTg2ZDNhMDgzZmNlYWI3YWQzNDY2NGZkMDM4NDczYjg2ZDdlMDUyOWJjMmJlNGQ3YTdmYmQ1M2E1N2JiZmQwYTUwMjIzMTVhOTUwMzVjOTU3MGJmZmJlZTEwMTY2ZWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RIZWxwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0SGVscGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmRlNjE2MTJhOWRjNmRjYzk3NDQ0M2NlM2Y4MzVmYjFkOTVhOGJjN2NhZTRjNDNmZTRmOWRjZGFiYWExOGFjMzIwYmQ2NmEyZjFiMTQ1ZTBjOTcxNDFlOWMwYWFkNzFjMTk0OTAxNmMwZDIzNzM0ZmNhNjYzNTE3ZTM1ZDg2NWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTNiNTQxZGM1NjA2ZjFhMDc0MWVkYWNiM2JlOTBjNWRjMzlmOTJjMTdiZDU4NzU5NzNiM2QyZDFhOTFkNmQyODk0MzU5MzY1ODUwNjU5MGMzMGJhMGMwM2Y5NjE5MTZmOGM2MzYzYTA3OTdhODJhNmZlMDNkOWJjYzQ0MTdkODMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcXVlc3Rpb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3F1ZXN0aW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmRkMGExOGM4MGNmNjUxNjc2ODdhOWQzZjU1ZDU4YTlmZGU2MDNlZDIyMDIzMTY1MDMzYTkxMzY3NmMxMTJhMGEyN2M5NzU4ODEyY2Y0ZmIwMWNkMzNkMzNjYzc5MmZiNTA2Mjc4YmQwNWY3NTgwMDhmYTZjYzhjYmRkMmU1YjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFhM2M4OGI2NTE3MTU3YTE0YTdhNDdjMmZhZjAzZTdiZTFlMmVkYTgzYTBlY2YyMjQ5MzVlYjM2MWY0NzY1ZTQxNWRiZDg2ODU1ODY2Y2VkY2QzNmZhMDQ2MjkzMDkyYzYxMGNkODRkODMwNzU5OTg0NjM5YzhlMjZlNzdlOGNiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhbGlkYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhbGlkYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1OTdlYTY2MGY0OGRlZTkwY2FkZGEyNWIyMDVlOWQ4OWE5MzRmMGU0MThlYTFhZTg5MzUzYjU3OThmMjM1MmMwZjAyMDQ4MGNmZGZjZGMxZmI0MGFiMDEyYmZkNzEzZWIzNzcxN2QxZGM1NTU5Mjk2ODdmODIwMTgwOTQxMjMwMyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9iYXNlLXpvbmUvem9uZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vem9uZS1oZWxwZXJzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZ292ZXJuYW5jZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy90eXBlR3VhcmRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2F0b21pY1RyYW5zZmVyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy90eXBlR3VhcmRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZXNlcnZlL2Fzc2V0UmVzZXJ2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVzZXJ2ZS9hc3NldFJlc2VydmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZjE3M2JhZDlhMjQ0MjI2NmUxM2ExMzBmOWM0NGUxZTZkYmNkZWQxMDViNWZiM2I4MTgwNzBkNzkwMmU0MDdmNTY5ODNhOTc5ZTBlZjUzMDdmYmJmZGU0MTFjZGVmYzE5ZDIwMTMxNTdlNmI0NjAyNDFmYzQwODVlYjc0MTYwYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZXNlcnZlL2Fzc2V0UmVzZXJ2ZUtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVzZXJ2ZS9hc3NldFJlc2VydmVLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNGQwMjk4OGYwMGYwM2RmOTdmZTkwOThkOThmZDgyMTZkMjJmMDdjYzhhMDIxOGVjYTQyMjM4ZTRmYzJlOGNlNzJkNGEzYzFlYTNjY2NlYjZkZmFjNGU2ZTc5YTBlMzg5MzBjNjI4MDI3YTlhMDQ1YTEzOGZjNDk1MjNkZjEyNSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXJuYWwiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2hlYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2FjaGUtbWFwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NhY2hlLW1hcC12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tZXRhLW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdHJlYW0iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RyZWFtLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFpbi5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jYWxsYmFjay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2FsbGJhY2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMGVkMjZkMzg2YzRlNjZjYjZlM2I5MDcxNWM5N2FlNmQwZGE2ZWMzMzJmMzY4NDg5ZTYzNTBiNjkzNzdjMGJkYTYwZTAxMGM2NDFjMWRmNzhiYmYxZmFlOGRiYzFlMzkyZGE3MzJmYmEzYzNhN2IzNmY4YjVkNjEyNjNjZTcxMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jbGktdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NsaS11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIzMjI4MWRmYjJjODQxNGY1MTY4OGEzZGZkOTYxYzYyN2U4OTdjOWQ3ZWYwNDVjYzZkM2NlNDU3MTBiZDA3MWNiOGU1NmVkNWNkOWMwM2NiODA3NzY0OWU5NTM3NDk5ZWJjODlkZGY1NjdmMTY0NDU0ZWM2ZWY0ZTFmZjAzMDVkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbmZpZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29uZmlnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjBiMTBiN2E1YWYyNDFhYTBhZTJkNmNjOTFiMGNhMGZkMWQyYmU1ZjNlYjZmNGJjY2E0Njk2ZmI5NDllYTAwZTAzOWNjMzAwMDEzYTY0NTVkY2Q1ODUyYTExNzBmNTJmMzgyMDc2MTdkYmIxMzJmNzQzODg0MGY5N2Y4ZjVlMWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVidWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlYnVnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTJkZjM0ODE5YmViOGZmNzIyYzc4YWYxYjc5MWVmODA5MWU1ODMwODlhYWI3NDZhZjQ5ZmVkYTgwNGQ4ZGM2ZTJlZTIwZDU4YzI2YWYyNjI2NzE0Y2RjMmVjNTMxMGE2NDEwODdjNjI4NTI5MDliNTNhZTQ5YjEwY2QxNGY1NTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lcnJvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNDIyNGI1OWY4ZDY1ZTdhZDIzMzUzMDM2ODRiMWE4MWY1MzBhZDc1MzhiNTEzZDNiMDRhMTVmOGRkZmRkMzYxYTk3N2E1N2RlOGIyNzE2OWUyZTcyNDk5NTc5Njg3YzI4MmQ1M2EzMWU3YTNlODU1M2EzNmQxZGQ1MGQyYTRjNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MmFkNDdjNjYzMjVhNmM1MDAyOTgwMTEyODlmMjMyMTcyNWM2ZjY2YzRmZWZlNzljNjg2Zjg1ZjdjYjY1NjMyYzI1MjQ0NWE0MjFkYzU5Y2FmNTI3MjRhZDJiMTc0OTUxY2NkMWVlY2M3NzBlM2U2YmFjNjlmZjE5ZjQyZTE1MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qcy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvanMtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1Y2EyNTQwMGNlNzJjYTgxMDkwNDljMzhjZDk3NGE4MjgyNDAwMTg3OTA3NzgyNmRhZGQyZGRjNmVhMzRlNmEwNWQ2Nzg3OGVmZWFiNGZkY2I0NzY2Mjg3NTZmNGIyOThkZWQ4MGI4YTQ5ODNkNTY1MjA4YWM4NDA1NjU1ZjQ5MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlNaXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleU1pcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc3MmNkZWY4MjMwNGNhNGVhNjQwNmZmMzRiYTFlNzNmYTc0NzI3MDA5ZmJiMGQwN2YwMzBkMWQ2ZWM3ZGMzNzI2ODU3MGIxNTc3YmJlNWNjZGI4YjhkNzgwYzc2NmMyYTViMGViZDY3ODkzOGYwNTJmMzM1NmQ2YTE3ZDE3ZWEzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxZjIyMGExYzlkOGJiOTAyOTQ2ZDI5NGQzYmM3OGYxY2FmZWE2ZTc3Zjc5Y2MwNjcwMzc5MzgxZTE4OTZiNGQxNjA3MDljNWRjMGUyOGM2OWViN2ZiZGNjZTg2ZDIwZDg3ZjQyM2E3NDI3ODhjN2Y0YTViMTAyNzc0YzMwMzU3NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsL2luYWNjZXNzaWJsZS12YWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwvaW5hY2Nlc3NpYmxlLXZhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY3MGQ2OGRhNmJmNzY5YmY5MGE4NDI0YjgyNGNhOGYxYzFhYTFmNDYwNDBmNjQ1NmJkNDc1ODE2ODI3MzZiNDU5NmIxNWJmODYzMTIwYmY4MjhhYzk3YWY5YTFhM2ZmNTc5YjcxZjBlYTlkNDFhZmM3MTE2ZTFjMmVjYjlhNDgyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwvcHVyZS1kYXRhLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsL3B1cmUtZGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE0MGEzOWZlZTJmZGZkNmJlMjU5NzMzOTlhYmM2NjlmNmMxOTBlNzY3ZGIxN2I2NDMxZmJjY2Q3MzdjZGFjOTJlZmFmOWJlMDQ2NDYzNzY2MzQxM2UxNjMzYWJhYjRhMjUzZTk2Y2ZhNTg4MjBiY2E3ZTg1ZDUxY2RlZmVjOGViIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVlNWYwM2YzNWYyOWRlOGFlMjNmOWNhZTMzMmFmMjg5ZTY3ODQzZDRjYzljMzMxNjNjMzgzM2FmMTNjMWI3N2Y1NGNiZTVmNGY2YTBmMzMyODc3YjIwYzcxMzBmODNkNGFlZmI2ZjFmMGEwYzQ5NTQwZDJiOTM5YWY1NDBjMDBjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ldGhvZC10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWV0aG9kLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzQyZmM2MjRkODk4MDU2ZmQ2YTQ1NmZiYTYwZjA0M2FhZGRlOTRhMGZjOTM2ZWQ3ZmFjNzZjYTdhYWJlMDZjNjY4MGQ5ODBjNzU0MTZlYjlkNzQwOGQzYTIwYWE0YzczZDE3ZjQwMjZiOGE2YzI3YWQ5OWQ0NzU5NGI1NzIyZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWV0cmljcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWV0cmljcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmM2FhYWVhNzM1MmY0YjIzZTI2ZDEyMDk4Y2Y1M2Y3YmUwNWU5NzMxYTkzOTY0Mzg2YzU5NmUyMmMwMmFiYzU5OGVkMWQ0MmU0NDFjNjRiYjFkMTA3ZjlkNDA1OTY5YWI1YTViYjZjOGRmMDU0ODIwNmIxNDRkNTIyMjViIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25hdHVyYWwtc29ydC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbmF0dXJhbC1zb3J0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2IxNGUxMzBiN2E0NzE1YjgxOTI3NmJiZDVlMzg2OTNiYTMwNzYwODU4ZTY4YzBmMzU4ZmNlOTAyNTljZjY2MTNlZWY5YTg3ODgyNDc4YWM0YTQyYTgzYWQ3NjY0NzVkMWY1NzYwMjQ4MGZjOGVhY2VkMjUzZGU1YjMwNGJiMGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2VzLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zZXMtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MGM3OWVkYjJkZDE4N2EzNTFhMjk5M2VmOGE5YTU5ZmZkNTM1YTJkMzZiOTYzZTdmM2ZlZGRiZDBmYmMwOGY5OWRlNzkyMTJhMTdjYjVkYWZhMWIzNmU2YzIyZDBmMmU2NDkwNDJjMTRiNzJhZTc5MGY2ZmE0NWYwZjJkYmNiMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90ZXN0aW5nLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGY0NWFmN2Q0N2U3YmU1OTRmYjI0MGVjOWJhZDllMWM4OTUxMDNhNzljNGY2MTU2ZjU2M2I5NDY3MjYzZGZlN2Q3MGE2NzNiMWMyMWQ3ODIxMTMzMDQ1OTQ0OWVhMTIyZDU3YTUwMmI5ZjNkNzMyYzZkZDZmZjQ5Mjk1YmUxMzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdG1wRGlyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90bXBEaXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZjU1YzE1ZjdmYWZkNmZhZWM5MmQwM2YzN2NmMjQ2MzczN2NlNDFkYzlhMDczZTY0YTg1YzBlOTk5NWU2ZjBiMDRmMGQyZGIyMjc2NTQ0ZGExNDBjYzNjNjM1OTgwOTk2NDQ3Zjg4MjQ1Mzc1M2UxZDgwYTZhMTYwZmFhZmM4ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlQ2hlY2suanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVDaGVjay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlmM2JjN2QyNDA4MDIzM2M1MTc5NmM1ZDA5NDc2YzI5Y2U3MjFjN2ZiMjE2MTVlYmU5MzIzYjdiYWQ5NWMxMDkzMjQ0ZGFjMjYwNWI4ZjFiZDhiZTdmZTEwMjU3ZWY0YmJmYzcyN2QzNDQwMGI2MjY1YzdiMjQzZDBiZDA2MjJlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYmI0ZjI2ZDY0MzUxYmE2NmFhMzI3OGQ1MDYwOTAxYWM5YmMwNmFiZDliNTAyYTU2YzJiY2U4MzE1ODdhYWFmOTg5YWJjOTA3ZGFjMDM5NmY1NTAwNTY4NTBiNWQ1MDEzMzIxMDQ0YzNlOTEzMjJhYWM0ZGUwZmE0ZDUzYWMwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy91cGdyYWRlLWFwaS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdXBncmFkZS1hcGkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNTI4ZWYwNDU1Y2UzNzczYjY1MDc5NzRkNjRlNDMzNGY5NjE0OGM5ZjExMzc0OTNhYzI5NGUxZjBjODRjNDk5NDg2MjNmYTA3M2Y2N2NkMjkyODY5OGI1NzJjODM0NWJkMDQ4MWU0M2I2ZmEyZGZjMGI0YmM4ZTAxYTVhOTJiNiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvbm90aWZpZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy90ZXN0aW5nLXV0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdXBncmFkZS1hcGkuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTFjMGVkYTBlNmJjNDMyMTA5ZWU2NTAxMmE2NThlZjlmMTM1ODJmOTE2Zjg5YjNmY2VhMzczNjMzMjBiYjVlOTZhZDQyNGY4MTJmZTY2MGQ0MDVmYWJmMDdhMzdiMTNiNjQxMDgwYTlmZjMzNDY5YmYwOTAyYzU3OGQ2NDAwMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MjdkZWRhNDFmNGVmZmQ0MWQyYzljZWJiN2VmOTE0NzE2ZTgwMzkyNTBhM2ZjNjRlMzJhZmRhNjVmY2QyZWIxNTNiYzJlZjg3NDY1Zjg5MGQzMWE5Zjk0MGMwZDQwMDdkZDg4NTY4NmQ1ZmMyNWJjMGNjZTcxZDFlMmY3MGVkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YWFjZWIxN2M3YjRiZjAwMTMwMjgyZTlhYzQ3OTRhYmI1ZDUxOTUyMjY3MzNiNzg2YjZmZGY2MDUwNTUwZGRhMWFlZDIzZDZlMTYzMGUzMDBmM2Q4NTc4YWFkOTNmYTNkODY3ZjQ5MDA4MGE3ZWZlYjI0N2YyNmE4YzMzMzA1NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wdWJsaXNoLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHVibGlzaC1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MzAxODA0ZGZjNGMzNTA2ODY2ZjgwOTMzZmYzZmZhNmQ3NDNlM2NlMDUyZGJjYzM3OTQ3ZjY0ZGM2Nzk0ZWM3ZjU4MzcyYWE3OTc5YjYwOWQ3NjYxYmNhZjI5Y2Q5OWMxNjNjZDlkNTgzYjQwNGUyNDdmNTY1YjBlMThkYjE0NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZWQtbm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3JlZC1ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM1ZGIwZDE1OTM3MDQxODhiYzY3OWVkNGQ1MjE2ZWZhMjM4OGI4NzNhZGFhYmUzZTYzNTRhYjM1NWNjODQ3ZjY0NDVkOThhNWUwOGE3NTZmM2U5OGMyZDIxNDczODk2ODNlZDUxMTI0M2JjMDFmODlhNTViZjRjMDViYTFjZGU3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlc3ViLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXN1Yi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRiMjc4ZTQ1MTY5MTQ1NWNjYTFiYmM5YTgzYjNkMzc4NWE4NDJiZmNhY2MwNTAzOTc5YTA0NGUzZDVjNjFjNmRjMDlkM2EwMTg3ZmY5NTE5MmI0MGE0ODcyZjk4YzFhODFjNzc0OTM1YWQxMmQzNzRlYWQyZmM5OGFkOTBhZjIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3Vic2NyaWJlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjU0YWYxN2RlMGMwMWJjZGYxMzZhZWI2MDYxMjJmNThjOWQ2MzRmZWYxMzU3ZDZkZjhjZGRjZDA1MjdmNzdlOTUxMGU3ZGIyZTdiMTQ4YzI3MmE5YTIxOTZkYWQ2MGZiZmIxMzljMzJlMWJjOTA3ZGJiYjI3YTdkMzgxM2EwOWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3Vic2NyaWJlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyNzkyNjJiNGM3OWM3MGM0ODI4ZjE5YjA5ZjQ1ZmNhYWRhYzU4MWQ2YTFkNTQwNTBkZWUxMTI2MjRiNjA1Yjk0YTcyZmU2NWI4ZDE0NjFmYjBhNWI3ZDc0NTI4YTU0OWYwMDdkODQyNmJmMzU5Mzc1OGVjM2YyZGJhNGMxOTJjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RvcGljLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90b3BpYy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJlODdkMmUxMjQ2OTU0ZTVjNDE0NGU1OGRjNzY2ZTU2MDAxOWI3YzcxMDRhYTM3MjE0ODI0YTJkOGNhZjA4MDdiMGJlYTQ3NThkNThhZWI1NzVmYzdmZmNhYWI2MTgyMWM4ZWU2MDU4MTBmNjRlNmU5YmEzNjExMThhNjI1ZWRmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInRvb2xzL3Rlc3RTdXBwb3J0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZlZDg0MTJjOTJlYmE4MDRkNjk3MTRiYjI1ZDQ5MTYxYjYxZDMyOTdhZmIyODUwYTkwZWI3NDU1ODc3MzYxNDhkYWU0MDZkMjY2ZmFmNTY1NjI1NGVjY2E3NmY1NDExNGFlOThhOWNlYTg3OGMyM2U2MDJlYzZhZGM5N2Q0YzgxIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3N0b3JlLXYwLjkuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9zdG9yZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4byI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjEuNS4xMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NThjNzk2YTY3ZDc5NDI4NzlmZDcyY2JmZDgwOWI4ZTYwMTI2MWY1ZTg0MjZkMGQwMzMzY2JkMDM0OTVhY2ZkMmQ4MWY5NDZjMDljZDI3MGI2YzZhYWY5ZGVkZjk3OWM0ZWI4ZjJjYjU0M2Q3MjQ3ZGI5YmRiMjNiNDExMjZiMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGMwM2Q1YTgwZjczOWQ0ZWFmNmYyNjg0NTAxNmEyNDIwZDYyZDI0ZGE3NzI5YjgwOWQ3MDI0ZmI2OGQxNDg0NDllNWIxNWU3ODAyZTg0NmJlNTk1ZTYwY2Q5NTE0NzgzMzY4NjRkYWM2ZGIzZDIyMmQ3MTMyNzBjYmFhNzBlYzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGM3ZTNiMjk3MTk0YTAwNTExM2ExYTYzZjU4NmM2MzE3YWUyNDRiMDZkNDk5Yjc1ZGJmMTM5MWJhODU2MTdjZGUyMjNlODc1YWE0NTEyZGZhNGMyYzRkYzQ0MTNlMjVhOTY4N2MwZGQ1NTE3MTY3ZGEzODQ4NDNmZTIxNGE1NzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMzE0YzRlYTQyNDgwYjUwYTQ5ODFkYzhjNmI0ODkyM2QwODk5NTQ4NTVjNzNmNmEzOGM4YTRkNjNiNWRkNTI5YTI2OGRkODM3ZGQwYWUxNzU5OWNjZWMxMDgzZjIwMjllMDg3MjMyYmQzMmQ3NmY3MjcyMjljMjJiODEzODNlNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNlZTk5ZmRhZDE1ZGFhOTRiZDMxODUxMzI2OWI3OTJlYWZhZWNhNzBlNjQ0ODU3OWEyNDZmM2MzNTVkMGJlMDAyNWZmMjkwZDc2Y2Q4ZGRmZDNjMzFhMjRiZmMzN2Y3ZWU1YTNjODhkNTdkYmFhNTJmMWY2NzU2MGEzMzQzMTA0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MjRmNDlmMmY0MDQzNDM0YjgzNzk5NmQ0NTY4YTJhNjA2NTNlNmUzYjE1MTU1YzBhZjgyYjEzZDQyMGIyMDU3OWU5MWNlMDJlMjJmMTQwYTRkNTI1OTg0N2MxOWU3MjhiM2ZmMjRlOGEwZGJkNzdhYzdjN2JkNDQxNzYzZWJhNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjMwZGU4Y2U5MzljZTIwMGQwYzEwNjE0NmRiZjE5ZTNmY2Q4YWVhYTFhZWRkM2IxM2VkMDM5NzgyZTk5ZjY3ZmUwYWJkMjZmYzQxYWMyMzgxMTI5MTcyNjM0ZDkwYTRmNjU0ZmQxODA1OGUzM2E3YjIwNTdlZDIwM2U2NWMzZGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyN2NmZWRjMjJjZTk0ODI4YzRlOGQ5MDdhYjdkNDBlMTgyMmJlZWY4NTU5ZTMxNmJjMDg4M2UwNmJkODNhYmUwZTFlMmNkNzVhMjdhMjgwNTg3YTEyMTBlMWQxYjI2YmVkNzU0OWE1ZDJmNTdkMGE2Y2FkNWVlOWFkMGQ1YjZkZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy90aW1lLXYwLjMuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy90aW1lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAwYmM0YjIxYTI4YzNhNWI3NmY0N2ZhZGE0ZWMxNzYxZTExNTljNDFlMWZlYmJmMDk1ZWFlZDYxMThlMTczNmU1OTQ2MDNjMThlZjAyNGFjNTZmNmE1YWIzZjNjZjA4NmM1ZjViNTQ0ZWRlMTAwMzAxZmIzNTgyOWM1MWFiMjdmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RpbWVNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90aW1lTWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ3MDVhNDhhOTMyNzZjYjIzMTZlM2M2YjgwZmMxYmQ0MzlmNmZlYzU3NmI1MmE4NDVkYzk4OGI2ZTJiZTk0YTFlZGU5MjI2YzZhMjJjNmZiODgwODdhZmQxYTIzNWFjODBhY2JjMmExOWQyOWFlOTkxODJmZDFkOGNlYjA2OGNlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNjFiMDYwMjRjMmRkMzJmN2NlMWM4NGMzZmVjM2NmYjU3YWY4ZDI5MmYyMWU3YjhmMjQwMTUzNzFjMTdmMjMxYzFhZTJkNGQxN2EwZDM0ODY2YTFjNmY4MDczMjhjZWZhZjI4OWFhZTljYWI1YmIxYWMwYmU2MjQyYjkzYjkxOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdmF0LWRhdGEiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NjliYjE1NzI4MjQ5OTZlOGNjNjk3Y2ViYWI1NGEyMGFjYzE5Y2JlYWQwZmJlYTA1MzhlNjQ2MTYzMmJmMjkxN2RjYTRlNzQzOWFkYTRjMmQ4YjYzZjAxZTc5MmJhNzQwNTk3NTk3ZGMzN2U3YzM2YTQyYmE3ZTc2NGU5NTVjNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNzJmZTNhNjgzODgzZTg1Y2M0ZGQzYjg2YThiNWZjMWYyYmExZjY3N2ViODAzMzE5OTBmZDU0NTA1NmY4ZjFhMzFiZDRlNjkzNThlYmExM2NlOTBkMWEyYzVjYzFjMzJmZjk1OTBkMjkwZjRjZDg3NDU5OGU4N2QwMjc5NzM5MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MzQ0ZjFkYWQ4ZjJhNjUwNTNkN2FlZWEwYjk2Y2VjMGZmZDAyYjk5YTYxYWM3MjE3NTBiZmJjZmNhY2M0Y2JjY2QwY2NkYWVjZDgzNDg0MzVjM2FmNzFjZTM4NmM2ODBhMzBjMzQyOGY3NGJhMTVmMzEwOTc3NzYyNjY0OGM1MyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy96b2UtdjAuMjYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy96b2UiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYmFzZS16b25lL3pvbmUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3pvbmUtaGVscGVycy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvcmF0aW8uanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwL3NyYy9zYWZlTWF0aC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3NhZmVNYXRoLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jbGVhblByb3Bvc2FsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jbGVhblByb3Bvc2FsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDA5MzMyOTZhN2I0MTNmNjA5MzU4ZmQxOTA3ZmFiNGQyZTQxMDE0ZGY1OWY1Y2NkZWRiYmE0ZWQ0OWE3MWQ0OTFlOGQyMDc3MmJmZGU4NzgwZDE3YTBkZmRlNWM3MDBhMWQ4MmI1YTZiZDg0NTI3OTU0ODYxODUwYWNhYzM2ZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ1N2M1NjYzNmViMWU3NTEzMGE4MWJkMDNlMWM3ZWIxYWVlNzAyZmExMzJkZWFmMTMzOWFmZDU0ZDJjNDA1MGJiNDIyY2M0MzE3YzdmNDZkNTZlMGE3N2ExNGY2MTgxNDEyZDFjNmYyZjcyZWFkZWExNWIxYzQ4YWFjMmMxNDZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2F0b21pY1RyYW5zZmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDU0Yzk1MWFmZGE3NjlmZmYwY2RjMjUzMjhlOGQzNzUzYTNiZjM2NGU5OGU2NGEwMDAwYTJiOGUxZWU5ZDA5NDkzMzVkNWQ0YzQ3NDAyZTgzYjZmNDVmY2VmYmI5YTBlNjhiN2QzNjc3NmI1NzI3OWYyMjEwM2ZjZTY5OWVmMDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9ib25kaW5nQ3VydmVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjcyM2Q1YzY4Njc1ODI4MjkzOTMxNGM4MTlkYzU4Y2FlNDUwYzYxYzQ4OWM1OGQxM2Y0YTg2YTczMDRiMTk1ZDVkZTIwMTRiNzZlNGY3YWU5ZWIyYmUzNjE5MmJmZTU5ZmJkODkyNjJmOTk1YmU2MDU0YzFkZjRlNzNmZmU1YjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTVmOTIwMGY3MTBmNzk3MjEyOWU3NzczNGM1NWZmOTgzMjlhZjVkZmU3MTMwNDI4OTg3MmI4ZWViZTk0NDk3NzQ4MTlkN2Q3MjEwNTZlMDg3ZTUxOTMwY2MyNjE5MzBjZGRlZTNkNWZhNGUzZWMyMDFlY2MyMGZlOGEzNmEzYWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjOGE4YjRiNmU1YWY2ODJhNTJkYTg1YzU5MWIzYzJjNWYyMjlhOWM0NGY0YWE0YjQ5NWNlOGYyNmIzN2VlMjIyZjdhZjRkOGVjZGY3ZGNhMWVjMzMwNjA5MWQ2NTgwMTFlOWZkYTJkNTJlNDJhOWUyZmJlYzM5MTkyMzMxOGVlZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcHJlcGFyZS1vd25hYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcHJlcGFyZS1vd25hYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWFiNDRjNzBjOWQzNzE3ZDJlYjA3MzQxNGQxOGFkZWI0OGViOTM3MDE0OWZjZWIyYmI3MmY4NjQzNzYwNjQ4MTE3NjViY2FhYjRlNzA4OTFlZjY4YzJkMjQ1MGMxMDBmNjJmMmRjNzZhMDIxZDQxNTk5YmQxNTM5MDIyYmUzZmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNjg1NmFiN2EyZTIwN2JiNzE4YzkzNzZkN2JkMjMwODk3ZWE1NDI5YzU0MGUzNjAxYzRlNjljYWZiYzc3Yjk5OGUxMTQwOGU1Yjc2ZjI1MTMyMjFhMTlhZTIzN2ZmZGVmOWIwMmEyZmJjMGQzNTE4NmY0MGMzY2I1MWVmN2UwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZDIzMGQwMWJmMTRhOGNmYTM1NjA5N2VmNTkzNjY5MzNmN2ZiMGYxMmYxMzA0YzI3ZmMyZTcwODg4MDRlN2FhMjZlYmM0ZDBjY2VjMzA2MGZkMzMyODE5OWI1ODA3MjFkZjc3NThlMjk5ZGIyZTFkN2E0Yzc3ZWZhYjU4MzMzOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdjZGM1OThiMzA3NTE2ZmEwMzgyYjU1MWI2Mjg3MzdjNWRlNzFhYWM0ZTMyMzFlNzhjYWFmYjQ0OGNiMzdkZWQ3NDllOWEwNTMxYjg1OGNlNDNjMDA5ZmU0MTcyODliNTcwZGI0MzViZjE3OTQ3MWEzMDJmZTQ1MDdkMzliNjRmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NGJhZmUwZWM3ZjJlZDQyYTNhN2U4OTkwNTAyNDgzMDFhYTRhZDE3Y2UwNTRkN2RmNDZlYmFlYzQzMzEzODZkZjc1YTcwYjdjNWYxNzk1ZmQwOGQ4NDkxNmQwZTU2MDk3Nzk3ZTgyMzYyZDliZTQ2NjkzYmJkNTc2MGY2YTBlNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZjI5NjUzMzczMTY0N2NiMzkzM2FiYTkzZDIxZjYwNDBlMzUwZjU1NjI5MDA0ZTczY2ZhZjZjNDZlOWFlNzJjYTM0MWEwM2VjNmVhZjZlYTgwNmU2MTg4ZTUwMGU3NDIwOTM3NjZmMzE5YmZiNjU0Nzc3NGNmMmJjOGJmMWRjMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWQxY2U0OTgzMzkxYTg5YmYxOTgzZTg1Y2Q5NzVlMmMyODVjZmEwZWI0ZmVlMmQ2MzAzNGNlZjk5YWEzOWZhZjc5ZTVjOWRlM2E5YjkxMDZkNDg1ZjVlM2VkMTdhY2EyYjZkOGQ2ZWJiN2ViYWUzYmJiZWZkMGNkODU5MjlhYTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODc5Yjg1MGFmOGFiZjI2ZjVmODkwMDhlMDVmZmQ0MGRmNzEyYjBkZTI1M2UwYTM4NDcxYjA3YjY1NDQ5ZjMxZmRmNzczMjYwYzIzMWZiNjdkYWMwYmVhNGUwY2Q2YTNlNjI4YTFjYTZkMmM2NjUxMDZjMWM2ZjFlM2JjMDQ5NmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZUhhbmRsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZUhhbmRsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ3YzVkNWZmZDY0NmIwMDEwZGI4Mzk1YTAxZDlhM2RhMjg5M2ZmMDY3ZWFiYWFkZWI0MzZhOWRkZjc1NmE0ODdjM2U3YjFhMDYzODlkOTU3MWQ2ZGIyNWIwZmQwZGYyMzViYWE0MmUxOWZmZWIyZGEwZDhhYzY3YjI4YzNjZjFmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NTA2MDljN2Y4YzU3ODY2ODM4YWUwYzQyMDVlMzc3ZTczNjEyNzkzYzE1ODJmMmY4NzA0MjFiY2Y3M2EwZWFkMTk3MDY2NGMzZTM0ODFkNmI0MDQ0NjE1ZDc2MDEzODllYjViMzZlNzE5MTYyYzg2MjYxMjA4NjM3MGNlNjJmNSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy96b25lLXYwLjIuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy96b25lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZHVyYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIyMDhkZWY4ZGYxY2JlMTQxODY2OWRlZGY4MGJkZjU5NTM1OGY1MzY2ZDExODhhYzA0ZmU0YTJjYjljNTNjYTg4NGQ4NTIxNWM5MGYxYjg3Zjk0OWJiMDQ4YTc5NmVlNWI2ZmRhMTNkNTFhMjU5ZTI1NzQ0NjQ4MTlkNjIyY2QzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2R1cmFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTMwMTUyZWY0MWUwMzUwMDU0ZDUwNjlhNWY0MzdlMWYyYTE0M2ZiNmY4ZGU2YWNiNDdmMDk0ZDE3OTNiMWQzYzNkYjA3MTAwODg4ZGY3NTU5YjRkYjdjMzdlNzYzZmI5ODhiOTM0ZWUxOGJmMDQyYjZjY2EwMjkzZDI5N2QzNyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vY2FjaGUtbWFwLXYxLjEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY2FjaGUtbWFwIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NhY2hlLW1hcC12MS4xLjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vY2FjaGUtbWFwLXYxLjEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTQ5YWVmNGY1ODFlODEwMmY5OGNhNDlhZTQyZWUzYjFiNWFjN2IyMTA1N2QzYjE3ZjA5YmYwODgzZDBjMTViYTEzNWQ0M2NjMzAzMzUzN2Q2Mjc3NTRhYmZlZDEzZTVlOTU2NTYwMTUyYzM4YjU5NTg1NWQ4NzFlNzc0YTExMjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2FjaGVtYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NhY2hlbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjQyMjNlN2IzYTM2ZGYzOWM1Y2VjNzIwYzk0YzM3NGJlZDc1YjQxNTJhMTQwMjZhNjk1Y2VmNmJkYWYzOGRkMjY2MjE1MzdlODA0M2Y4MzRmZjkwNzIxNjgwNWY0ODVjYmVhYmI0MmE4OGUzOTQ0MWRkMTRmZmZmZjBkMzk3MjAiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2NvbW1vbi12MS4yLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9jb21tb24iLAogICAgICAibGFiZWwiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImFwcGx5LWxhYmVsaW5nLWVycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDk3NDljZDM3ODU4ODdjZGVlNmZjNmRiODBmZWI5ZmNlZjcxZjUyZGYzNWIzMjc0YTljNzRiYjI4ZWUzNmM4MzBlNWU3OTI0YTEyZTk3M2YzZmE0YjZiMjYwYjVhZDlkNTE0M2RlOGY4M2VlZmIxOWEwYTI4ZTMxM2I3ZDQwYjciCiAgICAgICAgfSwKICAgICAgICAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImZyb20tdW5pcXVlLWVudHJpZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNWYyZTU1NjVjYTQxYzhiMmYxYTBiMjFmNzMzNTcyYmIwZTZmOTc1NTAzZjdjMjZkN2MxODE3NWNhNTk2YjE5YmJiZTI4MTMzNDA3YmI3NjNmODBmNDQ4NWMwNjNhMDI0ZWU1Y2ZkOWUwODE2OWQ3NTYwZGM0ODk5YzY3YWI1ZSIKICAgICAgICB9LAogICAgICAgICIuL2lkZW50LWNoZWNrZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaWRlbnQtY2hlY2tlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM5OTA0MDI4ZjFjNTYxMTZhNDY3MzVjNzU0ZTU2YmYzOTFmNThhMmZhMmQzMGI1MTU3YThkOWM5ZDU4NTE3MjNkNjcxZmJmNTIyN2RjMmNiZjNjMWJiNTc2NDQ3YWNmMGQ0ZDkwOWFlZWIxZjgxYWMyNDkyNzhhNTY2MGZiZjJiIgogICAgICAgIH0sCiAgICAgICAgIi4vbGlzdC1kaWZmZXJlbmNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImxpc3QtZGlmZmVyZW5jZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM3N2MwZWZhOTlmMjhhYzc3ZjRjMDk0OWM4NDQ4MzliMTZlYWIyMzZjYjkxOWU4ZWE0OGI2NDljNDhkNzkxOGJlZGRjZDBjMmNkOGFhNDAxNzgyNTRjNGM2MDFkYmZlYTE2NzlhZjgxZTI2NjJhNzliNmMxMzA5ODQ2OTY0MmJiIgogICAgICAgIH0sCiAgICAgICAgIi4vbWFrZS1hcnJheS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJtYWtlLWFycmF5LWl0ZXJhdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTU5ZWUzYWU5OTJhYWE4ODhiYmU0MWIzMzAyYjIwNGQxZmRmMzYwMGZjZGU3ZDg2ZTQ0Zjk0YmZhNTM0MTQyMzQ5ODhiMjkyNDlmMjdhNjQ2ODk5YjNlZmE5YzFhYmExY2FiOTQwMzM4OWE2YjlmNDU4OTg5NGFmMjgwNDllOTgiCiAgICAgICAgfSwKICAgICAgICAiLi9tYWtlLWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm1ha2UtaXRlcmF0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MDkyZGQ4MThlOGUwY2JjNmVhMWI2YWYwYzIxZGY1YTJlODZlZDE4OTZlMWU3YjcxMmE3OWJkYjEwODRiZTA2OTg5ZGIxYmJiOTg0ZWE5NDQzNTViOTFmYjY2NGU0MWExNjdkMzNhYjUwY2ExZWEwMjgxOGZkOTI0ZjcxNWUzMyIKICAgICAgICB9LAogICAgICAgICIuL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAib2JqZWN0LW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdkZjU5MmNhYzcxYzg1YzMxZWI5NzVjOTIxNzY2ZjBmYzFhYzAyNTExMTI4YzlhZjM1ZjIxNTU4M2Y2OTQ4YTg1OGI3OWI4ZmZlYzMxZDRlOTg4MGEzNWVmOWJhYjdiMmMyZTA2YjEzOGEwNjMyYjExOGY1ODhmMTE4NzIzYzNjIgogICAgICAgIH0sCiAgICAgICAgIi4vb2JqZWN0LW1ldGEtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm9iamVjdC1tZXRhLW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU3ODAzZTkwODVmMTZjYTAxYmNhZjU1MDZiNGU1NWI5ZWIxNGY3N2ZkOWEzMDc1OWEyOTg4MjJjYmM0OGYxMjU1OTkzYmE2MWZkZjIxMTNiYTE5OWMxMGMwZjUzNDgzMTgxYzdiN2FhM2VjZjhlMTdiMWYzZjgwYWE1MzA3ZDVlIgogICAgICAgIH0sCiAgICAgICAgIi4vdGhyb3ctbGFiZWxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ0aHJvdy1sYWJlbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDdhMTA1NThjNjU2YTk4YjVmOWQwMzg0Yzc5Zjk0ZGY5ODIxMTgwZDAwZTljMjY5NzdiMDFmOWFiYjY4YzUxOTZiZGU1MWMzMGYxMjYxNWZkYzk1N2E1MDgwNTc1OTMzZDA5M2IyN2ZlMzk1ZDIwMDEyMGUzNGFiM2Q4OWJkMDIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vudi1vcHRpb25zIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJhY2E3NmVkN2M2YjY1NjcxZjcwYjI2NDZmNjg5NDM1NzI0ZDhiOTkzMGE1ZmYyOWQxZmIzMjdlZDk2ZmQ0MTQ0Njk1MjU4OTYyZGFmYjk4Mjg2MmEyZWZjMWIwM2QwYWQ5NmIzM2MyY2FlNWJlYmZhMzcyNjg4NmEwNmY2NjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW52LW9wdGlvbnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vudi1vcHRpb25zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGM4MzEzOTE2N2ZiNTI0NjY4MGNmM2I2MDg5YWU2ZmUyMmNlMmFkODE2ODVjNjNmZGM2M2ViNjljNjUyMjk4MTRhN2Y4YmQ1YmFiYTE2MGMyNjViZGI0NTk1MmEzMTUzOTFkYzUzN2JlMzAzOTU2NWVhN2YwMWM4ODk2ZGRiY2YiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Vycm9ycy12MS4yLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9lcnJvcnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMwZDdmZjE3YjNkMjJiNWUzY2Q5MjljYWIyYmZhMWE1MWM3NzEyMzcwMjA1NmZkYzY2NGU3N2ZkNjA4MTUzMzM2MzA2MDcwOTgwN2Q5OTE0YWEwZWQ4Y2E4ZWE4MjQ5ZjAxYzU4MTQ1YTQyZDI3YmRhZjdjM2Q3MTFkOGQzMTgyIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDkyNDlhYTcyYWJlMDVhMTIwMTJkOTNmZTUyNWUwZGZmZTQzOWU3NzZlYmNmZWIxOWMyMjFhZGQ2NzliYTJkOGNmZTBjMTUxN2ZlMjdmODMwZTFhZGE5NjkwNWFhNmJhODYxNDBjNWQ5MGIyOWM5ZTU2YjRhMzRkNjJkNDg5ZmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhwb3J0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xvY2FsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sb2NhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY4ZjgzMjc1ZmM3NWYxODEwOGZhZTQ4NjA3ZGEwYmQzOWYyNWE4MGQxYzI1OTIzZDM2NjJlNjJkYjRmZmVhMjAwZThiNWFkODU5NzM2YWExZjRhMWJmY2YxMGY1NjE2NzU4MzI1MWY5ZjE4ZjBkOWJlZDE5ZDI3NTJlMDM2YmUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMDJlYzNkY2RjNjE3MzQ5YWY5ZjJlMjVjYWRlMDljOGRlMjhhMmExMGJiMzZhOWYzM2UxYTc4NGU4ZDFiZDc0YWRlOGEwMjI4YzcyYjBlNTUxMGViZGU4YWFmZmU4NzY2ZjdkZTI5NzE4ZDFkNzU4ZTUzZWUxNjAxZWU2ZGYyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uby1zaGltLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uby1zaGltLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNThiMzE1OTA1OTRkOWU3NTY0YzlkNjE1NTRlNTY3MGUzNTAwNWUyYWRmMjBjMTQwNTM1MzQyNGUwMDlkZTE3NDYyMjdlMTJjZmViMDc1OWM4MTgzOTEwY2QyYWMxMGY4MjAxYWUwYmI3ZTBiMzg0OGZlNjcyNzYwYjYzYWRhNGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhY2stdHVybnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYWNrLXR1cm5zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGQ4MjMxMDk5ZGMzNTUzMDE4NWIzZTYzNjI5NjNjYzllMjI4NWM0NDQ4NzVjOTk3ZDUwN2FhMTMxM2E4NjlmN2U1NWM5NmNlN2Q2MWYxODE4NjFiMTY4YjI2NzE1ZGNhZDg3MDg2MTE3MWUyNjNiOThkM2ZlNTM2NzczODU0MTEiCiAgICAgICAgfSwKICAgICAgICAiLi91dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ1dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ2MDcxMjM4YjI1ZDMwNzY2ZjQ0NzNiMzYwNzVkYjA1MDA0YTMwOTViN2JhNmFkZDA0NGQ5ODY2NWM3ZTBjM2MzMDlkMDRkNDM1OGFhZDhiMDVkZDhmY2YwMGY3ZGYyOTYxNTVjNWY4MjliMmY4YmYzOGRkYmVmYjEwZDU4MzQ5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9leG8tdjEuNS4xMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXhvIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V4by12MS41LjEyIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V4by12MS41LjEyIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpc3QtZGlmZmVyZW5jZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM5NDE0NzNjMzA1YmU1N2U3NzgzMWI4NDZiNWRkNzJmMDViMDNlOTc3MDY5ODQxNzRhY2QxZjNhMTNmZjhjY2E0NmMyZDUxMDBmMzVmY2E3ZDhmMDcxNGE1ZGJkOTNkZDA5YjdlNmRiNmRiNGM2MDg5Mzk5YzI0NGVjNDZjY2I3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by1tYWtlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by1tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NDQ3NGY3MWY2N2M3NzgzYzc3YmFlMjYzOWRhOTY0MDFjYWI3ZmJkZjZlNTA2MDcyNjEyNTkwNjcxNjYwOWU3Zjg3MGY5MjFjMjJmYThjMzQ5YmRiZGI0Yjg0MzNkMTg4ZTJlYWY5N2Y5ZWYyMDQyOTA1NDIyYjUwN2FhZDdkZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI5ZWU5YmFjMmZhNjNlODNkNWVlN2I5NmQxY2Y5MDZkOWNhMmYyZjVhODJiY2E4NGZmYzYzNmNiYzA5ODUyZjAyYjJiYjllOGM1ZDkyZTU4NTIyNzIxMzU2YTdmZGNlZDVkY2RlMDQ4MTVkNGYzODI1ZjJhYzNjYjU4MzI0ODk3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2dldC1pbnRlcmZhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2dldC1pbnRlcmZhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNmJhY2NlYmIzYjZjZjRlNTY0YzIwNmEyNWQ5ZjM4NzFjNjVkZTZmNzI3NDY4ZjRlN2QwYjRlMTAxMmRhYTM3NmNhOGU5MzYwNTBjNWEyYmI5ZDQ4YWEyOGFjMTFhZjFjMjBmNzZmY2VhYjQwMTVlMGVmZWYyODI4MTc1MzZlMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZmFyLXYxLjEuMTQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ZhciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGFiY2U1YjA1ODQ2MDFhYjU1MDY5OTA0MmQxNmU2NmQwNzRjMjU1YjA0MTkzNmQyYjA3ODczMmE2NDkyN2MzNTE1YTNkNGY5NTBlZTk2MDk5ZWEwNGVkMWRjMTZlNGY0YTg4YWViMGQ4MTFiNGVlYjRkOTdhNDkyZGY1MDRkM2IiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjEuOC4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzg4NDMwZmNiNzg2YjU2MWNmMDNlY2Y2NTlkYTg4MGZjOGM0YTZiZTIxZWM2YTI1NmZkODg0M2M5MmJjNjZjMWYxMGY5ODM3MWNjODVjMzY3MGVhN2NjZjc0NDAwYWIxMTJlNGQxMGJjYzM5YjY1Y2UwNWI0ODc1MmEyOGQyY2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDhkNDAwMTMyZTFlMzVjMWE5ZjI2MzAxZDA4ODE4YjJkZDIwYmU2YTg5ZTg3NDkzN2IzYmM5MWQ3NmI5MDg2YTEwM2MzYjdiYmFiMmI1MzI1NzY1YTAxMjg1YmFkMmNkNjIzOWNiMzA5OWQzOTgzN2YzNzQ2Y2ZiN2E1NDkyYTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb0NhcERhdGEuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYzhiNDI2OTdkYmVlMDIzMjk5NDI0OWViYjA5ZDJhN2QyOWQzYzg3OWExYTM5YzA2MjhjMDcyMGRkMmFlNWI1OGExNTdmNDYyMTFmOTUzOWYxNmRjMmM2MTI1OWJiYmFjNWYzMDQyMDI2MjJkN2ZhZDc1NzA4ZGIwMDQ5YWY3NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNDRhMjk2NTNkZDEyNTI0YmI3ODFlYzZlNzk0ZWQwZjU1NGUyMWI4MWMzZTk3YjM5YjZlYzViMzk5N2RkYWFjMDVhZTVjNzY3N2NiM2JmMzAzNGM4NzZlOTFiMDhlZjIxNjE5ZDU1NWJlMWViZGVlMDMwNmNhZDc0ZGE1NzRkNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1qdXN0aW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkODZhZTlmM2ZmZjllYzA4ZTA0YzEzMjYwYjhhNzM2NzBkOGZjZjU3ZTZiZWU5NzQ0YzYyNzJkMWEwNjA3MDdjZTM0ZmU0ZDVkNDk5MDc2NGVmNGZmMTRjOTkyMzM3NjViNTc3NTY0NDEzOGJjZTEzMjU2MDc4ZWNmYWZjMTczMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMjI4OTFlNGMwNjQzMWI1Nzg0MTBkMzc2YzI5ZWUxNzU2Mzg5ZDllNjcyNTE1OTAyY2ZhYTA3ZmNhZThkYjI0NmY0ZjQ0MGRkZjA1OWI3OWY0ZWI2MmYxYzc1Nzc3ZmRkNWJmYThmY2NkNWFhZjQxODE2NzQyZWRhNzYzY2I3MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzgwY2I1ZjA2N2NlMjJhNzEzMzQwMmQyNzIwYjczZjQxODNhNTc4MWYyMjhkYWMyMGE2YTQzNTQ4ODcyZWVkNWIzYzI0ZTBmYjUzOGUzYWEyZDM4MzkxZmViOGNlZDg0NjA0MGM4NzZhODJmY2M2OGE3NGQzYTc0NTk2YjU3NWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmFua09yZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yYW5rT3JkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNzA1MjllYjQxZWU0ODg0MDEyN2JjMmRkN2FiN2Y4YTIyNDRkZTNmMWZhMzM0ZTRmNThlZWE0MjFjYzMwNWY1NDJmMmU3YTNhMTc3ODZjODdmYzkwNDMwMTdlN2Q3YzYzNzVkYTRlNTE0YzE2NjBiYjgzMDMwMGVlNmQzOGExYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbmF0LXY1LjEuMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ODcwYjExZTBkOTU4NDY5MTU2ZWIwNzExY2YxYTBhOGE4ZGY0MDc5N2IyMjI1ZjE0YjZiNGFlNzZjOTk4NWMyNzQyMjQwNmIwNzk2MTA5NDIzNDYwMzM5NmIwYjVjYWE4YWJhNzZhOTJjZGU2YmU0MmQ4NWIxODZmODQ3YzAwZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Bhc3Mtc3R5bGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2lkZW50LWNoZWNrZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWUyNDRkOTQwOGNlZGI1ZjA4ZDAyYjExZWJjM2Q5MjA1MzQ1MjA2ZGE4YTJlMDhkNmUxYjZhZjUwZWM5OGZhMDRkMDJhN2MwODUxYzllZTA1MmMxZTdmMmRjMDg2ZjQ5ZDU4ZjgwY2ZjYzRiZDk2YTI5MzhkODFkNGQ5MmFjMjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnl0ZUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ieXRlQXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZjdhZGY5NGRkMWIxNjliMDM3MGI5NGFhYzRjYjljODZhNDA4YWNmYTIwNGE2OWVmNjRmMTRjNDZlZDA0MmY4NDgwM2MzOWI0ZDgxNTU3OTEwYzFkNmU5M2QzMDRhMjIxNDk2YmQ3MGVmOGFiODhiM2U3YmQxYzllOTRhNGJlNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZjNGYxYzY2Y2NkY2YxMDI1ZDU1ZTI0MWQ1NTk5ZDNhOGE5OGIwMDI2YWIxMmZhY2E1NGEwMTVjNDE4MWZkMzZlMWYyZGVhNjQ4ODliYjZkOTcxYmZmYjJjNTA2Yjc5MDI4MmY1Yjc0ZGVlNmY2YzQyNTA3NmNkYWE1M2ZlYzJjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNmI0NjAxMmNiODBmNTFkZjZkNmQ2MjAwMzJlMzU5NzFiZGEzYjk1MTA1MmI4MDJkN2E1NTM3M2JjMGE2NWVkZjgxYzdiMmRkYzM3OTkyN2YxMmVlYmFmMWRjNGM5MGJkNzRlNDE0OTZjNDlmYmUzZTM4ZjQ0OWIzMDEzMGUyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3Mjk3MjRlMTAzZDMxN2ExNjZiNjM4NGVhYmZlMGE0MWRmNzIyZWU4OGUwOGZjYjAyZWExNzNmZDE2NzZjYzdlYzQ1NzczNWU3YmYwMmM5NTI0MGE2NWRjOTViOTEyMWQ1NGEyMDcxZDQ4YWFlYWJiZjRkNDQzYWVhNTFmNThhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRkMjJjYmRmOTlkNDUyMWQyZTE3YmI5ZDVjMWNmZTBkNTllNzU0YjE1ZDFhODU5YThhYjliZTEyZTFjZmMyMzMwMDQ4MzhjZDM2OTllYTQwNzZmNzJlOWYyODRjZDlhYmNkOTY2YjdhZDgyZjA4N2QzY2FjMjhkNmIxMzJmYTFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2l0ZXItaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXRlci1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGE1ZGYwNjZkODAyNjY1Y2JjZmM4MTA3MGZjZGFiZmQxM2M3MzA5YWE1NDk0ZTU4ZTVhYzlkMjAzYzYwMWM3ZGU1ZjEwMmE0Y2M2N2EyYzM0MGY3MDBiNmQ0Y2NkYWYwMTlhNGEyY2NjOWNmYTFmZDg3NGQyNTJjOGI0N2ExZTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZS1mYXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2UtZmFyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTIyMDBhYzU5MGM2ZGZiMWMxMzJhYjg0NWNkZDQzYTM2MDIwZjA4MmQ3YjFjOWI3NGMxY2IzZjVhYjQ1YWM1YTE0NTVjMDZlOTg0OWEzZmQ0ZTYyMjAxNGEyOTk0MTNjNTc1N2FjMDYyMGE3YmIzOGQzNzlhYzc4NzIyMWQzMTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZVRhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjZDUyYjA4NGMyMmFhMTk3MWVlMDRmYmVhZDI4NWQ3YWI0M2M4MDZmYTUzZGU5YjJiZGM4ODhlNzU3Njg4NTQ3NDVlNWE3MDE3ZGM0NDQzZjNhYTM4NDc4Y2QzZmIzYzFhZGIzMTlkZDM4MTdmMjEzYjliZTcyNzJjYTAyNzdmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNlNWVlMjJmOTUxNzA5NWM5ODZiNDRkZTk3ZTM3N2FlZGU1MWY2YjYyNWQ5OTBjYzg0MWYxMjkwZTU3OTEyZjhjMWExNGJlNGMwYzZhZGJiM2Q5NjYyMGZmZmZlMWEyYTg3NzI4YWY2ZGQ4MDc4ZTRiMzk4OTgwMmU4NTk4NGIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGVPZi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFhODI0M2RhZDc1OTRmMzMxM2FjZDMyODM0MGY2NzZjM2NiYjg1OGZmYjViNmZkNDk0NGViN2M0NjI5MmZmNjI1NDY2OWZiZTU3NzUxMzYxMzI3NzM2MWJmNTY4ODlmMDE0NTBkNThhZTI1MjA3ZDM3NjNhOTg4YTg2Y2EwZTJhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlbW90YWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVtb3RhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjk4YTgyMDJmOTFjNDdmZmE4YWZhODMwMTE2YjgwMWE0YzBiMzJhYmM5ODYxNDI2ZjQzYjlkMmFmOTgzNDIwMzgwMjgxZjdmYWFhNGRmZjNkYzE3MGI5Y2YwNDk5MTE1MzgxOGI0YWQ4YWIwY2Q5MGQ3ZmE0ZjIzZThjYjhhNTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2FmZS1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zYWZlLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YTcwZjIxM2RjMjI1MTFmZjM1ZWE0NDhlNDBkMmExZjI4MTMxODY4MDUwYzMxZWQzNDJmNzY1MmMxOTIxNGFiNzY4NGFmZGFiN2EwMGRhZjQ3MTA5OGUxMjkzZDY2NTFiZTg4NTYyYTBkMWI5NDFlNzg5OGQ5NTM3NThmNzJmZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdHJpbmcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0cmluZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNhYjkyNjA4ZTUxNGFlMDcyNDdiNDU3YTI4NmI1NTkxY2JhYjQyYWE3YjRhMzA5NjZiY2I1ODc3ODI5NjBlNzM1ODE4NDVmNDY5ODQ0ZGVlNDZkYzcxYmU5OTMxYWQ5YmY1NzM5NzE3MDY1YWMzMjY3Yjk1YmY3ZDMyYmFiNmVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGQyZjFmOGM0ODY3MWQ2OTRhMzkzN2NiNzA1ODcwNmZjOTNiZDY2MTZmYTk2NmNjY2M0NTJhYWMzOTRlOWNlMDIyZmNjNDgwMzRiMzc0NjU5OTc0MjQyOTE5NzAyMWY1ZmE4YWJiNTNlOWMwZjk3ZGFmMjZmOGY4OTBjN2Q4YWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNTgzZGVkMTgwODE1MzlmNDFhODExOTcxNTdjYzA1YWU4ZGMxYmFlOTVjMmE2Nzg3NjhhODJhY2UxMTg5NTQyNzIzMWEzNmU5YjJhYWE3OWFkYmU1ZWQ1OGMzZWM1ODAyNmIyZTdmZjU4NTY2NjA2MTc4ZmI4OTFiZWI1NzVhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2IxOGUzYmJkMWY2YTBkMjMwYjA0MjBlZTEyNjZmNjdmMWNiNTNhMWEyNmJjMWYxNDk2NGQ2YWVkNDE5OTk2YTJhY2JlNDQ1ZTA4MmZhYTczNGFmZDg3NjIxOTFlOTI1ZTJkMWQ1ODE1MjQxYzgyOTBlNWJkMTliN2M5ZTdjMjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGF0dGVybnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pZGVudC1jaGVja2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpc3QtZGlmZmVyZW5jZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vbWFrZS1hcnJheS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1hcnJheS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YzliN2FiYTMyNWIzYTk0MDhiYjk3NzNkMmI4MjM0OGUwZWM1YzhhOGVmZGQ0N2ZjY2NlNTFkNGM1MmFiZjJmZDUwMjBmZGFiOWVhZjBkMGQwNTI4Yjc5MTcwYmYwM2ZjMjkwNmMzMjYyY2NkMDJiMTFlZmEzMmVlMjIzN2M3MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NoZWNrS2V5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2JiYTNhZDM1MmJjNWQ0MzlmMDdmMjk4YTRiOWE5MjZmMWQwYmM1MzM3YWFiODhlODYwOWQ1YzQ2NTE2MjUxNjVlMTQ3YjQ3OTdiMTE3NTRiOWFlMTA0MmI2YmUwODk3YzE3OGE5ZDZmYjNkZmExMzdhODk2YjliM2I4MjM1YzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb21wYXJlS2V5cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ3OThhMDcwNDlkZTllODcxNjJiYTUzMmIyMzAwN2FhYTE3ODJjZTI5YTg3OTc0OTJhNDM4MDM4NDI0N2I4YWM0OWNmMWRlYTJhZDMwNTQ2NTQyMDY5N2YyM2VlYTQ1ZjY0N2E5ZDIyZWQ0MmEyZmEwMDk5MDgyODVjNTY5MjJjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29weUJhZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb3B5QmFnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2JjNGNmOGM0MTM1ZTFkMmUxODc2MmRlOGI2N2FhYzMxYzk2ZTNhYTMxY2M0YWI0ZDYxMTk4N2UzN2RmODY4YzJiZDkyZDBjYzczYmI0Nzc0YmRiMzFjYjZiYWIxMWJhYWE4ODI2Y2MyMWU4Y2E3MWNmYzdmOTQ1NzYxMTAyNTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5U2V0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlTZXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMTdmODNmNTNmOTEyYWE5M2U4ZGVkOGU5NzY2Y2RjM2EyNjcxNzNlZWQzNWQ1MWYwNTQ4MmFjNWQ3NjEwMmM2Y2Q0MDM1ZmU5OTljYjhmNTAzYmNhZDI4ODUyYmM3YjQwODE0OGEzOTdmZjc0ZjkyNWIyOWMzODU5NWNhODBkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmQxY2VkNWYxMzc1NGNjZmY0OWRjMGY4MTBjOGU2ZDUyNzI3YmYyYzRlYzc3YThkZDlhNWZmNTc3NDk1YzRhZmNmNGRhMmI4YWY0MzZjODQzMzZhZjk5YTcxYzFjY2I3NDkwZjZiYTI5N2VjMTk1ZjNmMzdjYzc4MDFlYWRmNmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZTA5NWY3YzQ1ODU3MmI1MTBmYTMzNjAzYzIwNzNkMzEyOTE1MmRmM2Y3NGQzZTYyN2IzOTMxOTE5ZjY2OTRhNTZmZWI4NDk3OWY4YWU5NTQwZGQ0NjJjMDY4NGI2ZTViYjg5YmJkMGE4N2RlZjIyZWE5Mzc1M2RlZjc5MzRhMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYzNDFkOGY1NjVkZDZhYTAzMDgyYTM2ZTEyNWFjOThjNTBjZGVhOWMzMjNhNjMzZGE4Y2M0MmU2YmNlOTBmNGQwMDYwN2Q0NTE2NDk0MTEwZTFiZmVkYTRjZjNiMjIxZTAzYjNlZWNmNDY5NmVjYTlkYmE2ZDZlOThhMjI0ZDhmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MzVhNmQwYjMwYWM3OGVlYzM4MjdhYTBmOTE5ZTk2ZTkyZjUzZDE2YTc1MzlmYmE2ODJmNzM5ZTE2ZGYxY2YzYjcyMDg2ZmQ2NzU0MmY3OTAwMmJiNzc2YjZhMGY0ODk4N2Y0YzA5NDVlNWM2ZDM5ZWMwOWNhNjE5NzgzM2VlNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU4MzlmOTMzNjZmNjhmMDhkM2U1OTYxYjk0NTE4NWMwOTQxMDFiN2I3MzA3YjVkZmY3ZjM0NTg4ODg2OTQ0OGQxNzIwNmQ2MTg4OTc0NTgwYTE3ODlkNzRhN2M4NDlkZmU3NjVlNDNlNDQ1NTMzNmFlZDEzN2I4YjBjZjlkNDRmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZkYjMyNDAwMzRjOTFhZjFjMGI0ZDU5Y2U1YzA5Y2Q4ZmIyMjNmYzUxYjE1NzAxMmVlZmUyZDMzMmJkZjdhNDM5MjA1NDZmZTU3MTMyZjBjNTEzNjMyYTkwOTUzZmYzNzEwMDQyOTQ5NmI3YjFjMGMwOWM1Nzc0NWUzM2Y3YWZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3N2UzNTJmZGM1ZmNhMzc3YjQwMWFjMTRhMDM0NjhlMTQ2ZTM1NzJhMDA5MTRhZjIwMjkzMWU1OGZmYjllMWE0MzI0NjA2ZmJiZDFmMjE0ZDNmNTc2ODE5NWRjZGNjOTRiNzIxZTEwZmVhZmRhMzBhMzc4NThlMmYzNDE0NzdjMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZiYWM0NzYwMTU2OTMyMTkzYjEwZTFlNTFiZDVhODE1YTNhNzExMDgxMDdiNWVjZTMyZDU4ZGYyZDE0ODI2ZjBiZjg1YWU3ODgxOWM2Mzc0Nzk3Njc0MDQ4OGJmYWM4NDg1Y2IwZjJhNGQ5Nzc1ZTZhMjViZjNmZWIzMWM0MTYwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMxMTc4NmEwYTVjYTgwOWNjYWMxZjE5ODA3YTNiNjEwYzQxMTMwMTgxNzk2YWVkMmUzN2RjYmUxY2Q4ZTQ1NzhiZDIwNTUxMmE1ZmM5ZmIzMTBmNGZjZDU5NDVkOTYyZWYyNDkzYzMxMjM0MTU3YTkzNGM1ZDVhYzM0NWJlN2E3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9zdHJlYW0tdjEuMi4xMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vc3RyZWFtIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3N0cmVhbS12MS4yLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3N0cmVhbS12MS4yLjEzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTAxZGYxNjA5OGI3OGE2YTMxY2MzNmFkMDc2ZjkzZmUyNWQ5NDYxNjFkNzYzNWI4OTg1NDZlNmMwZmY5ZDk4OGZjOTcxOGU5ZDQ4ZWJmN2IzZWRkODllNGYyNzM0Yjg4YzA5NGQ4MTc4OGYwNTQ3YzkzZmE4YWEzN2M5NzFiNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiamVzc2llLmpzLXYwLjMuNCI6IHsKICAgICAgIm5hbWUiOiAiamVzc2llLmpzIiwKICAgICAgImxhYmVsIjogImplc3NpZS5qcy12MC4zLjQiLAogICAgICAibG9jYXRpb24iOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGFmMTA5OTcyOTAxZWVjM2U3ZDljMDFkYWUyNmFlZDY3OWZmMTBjNmI4YzJlYWI5ZjdiODUwMmEyN2Q5MTVmNGZjMGQ4OGNmZjI1ZjE1YjY5ODVmNGUxY2UyYmQ0NTNiNzgzMTBiZjZjM2M2YTI1ODMzYzUxYjA3MDY1YjAzMjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3ZGU2Y2JiNTFlMTZhMmRkNTIwZjdlNTY2MGFkZmEzZDM2YjlkMjBlZWJhN2NkM2QwMzZhMGQ1YmZkNmQxNGFkODVmNTYzOTAwZjE2YzZhMDdiYzU3MmZmODQzNmMzZmQxYWZkYzc1Njc3MjM3MDk4Mzc0M2U2ZDI0ZDc0N2MxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1N2U4Y2E5ZjUwNDAzZTBkNDY5NjJmYzg0NTM5NThlZmRjNTMwMzVhZDg5YmIwZjQ2Y2YxMjYzNjdkNzY5MjllOWIzYmUxM2VmOTVjNDUyNzZmY2I4NDYwNzlhNjQxNWQ3M2JkMzUzOTFmYTY2MGRmMTYyMDc5YmE3MTliMmRmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4ZmQ1MmVmMzAyYzFmMTRjNjIwZmRkZDQzNzI3ZDgyMzI0MDNiOWJkMzU2MWUxZjEyM2RjZTlkNGU5YTEzYjU1YTJkMWVlNGFkODA3MDJmMjUxMTE5ZTlkNDkyYThjN2EzNDVmZTU3MWE0NzlkMzkxZTJiNzgxZmZiMTM4YzAwNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWtlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL21ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE4ZDNjNWRjN2Q0MmJhNzJmZmM2ZmViMmQ5OTEzMWE3OTNjMzQxOTJjNTkxNzgzMzA5ZTBkYTkxZDEwMjkyMWQ4ZWQ1MDZkOTc5NWNmM2JlZmM2YTc5M2ZjNmFiMTgwMzFmZjJiYmFkZGJkYjQ3NjRjNmY0OWZmOGU5MDNiYmUyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9hc3luYy10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyMmNkMjMwZGMyMWY2YTkxNzQyNzQ1YzU4ZGY1OTI4MDZhZGU4ZjEzYjg3ZjI5MGYwODY4OWJjY2NjNGU2MTQ3NDRjZGY0M2Y4ZDlmM2VlNmExYzU2ZDkxMDgzMWUzOTdiNjY2YmNiODA5OGExMTI2MjAwMjUzODQwZmU2NTAwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcxL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcxL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NDZiNmFiYmNlYTcwYjUxMjBhMDU0MjYzOWE5ODVkODk4YTI1ZjI1YTIzOTQwZWNjMGZhMjZlNmVmYzhkNjUyYTVkYjlhZTVhNzVlYzI3OGY3OWM0NGQ4ODAwZDk3YTdiZGVlYmZlNjU3MzNiM2FiNjY0YmIyMzUzYzQ2NTVlZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn1QSwMECgAAAAAAAAAAADGASPiNAQAAjQEAACAAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvaGVhcC5qc3siaW1wb3J0cyI6WyIuL3NyYy9oZWFwLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaGVhcC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9oZWFwLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEzMFkfMLAADzCwAAJAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaGVhcC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXhvIiwiQGFnb3JpYy9zdG9yZSIsIi4vbWFrZS1vbmNlLmpzIiwiLi9rZXlzLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sImV4cG9ydHMiOlsibWFrZUhlYXBab25lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyLGlzUGFzc2FibGUsbWFrZUV4byxkZWZpbmVFeG9DbGFzcyxkZWZpbmVFeG9DbGFzc0tpdCxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhclNldFN0b3JlLG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxtYWtlT25jZUtpdCxrZXlzLHdhdGNoUHJvbWlzZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJpc1Bhc3NhYmxlXCIsWyRozY9fYSA9PiAoaXNQYXNzYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V4b1wiLCBbW1wibWFrZUV4b1wiLFskaM2PX2EgPT4gKG1ha2VFeG8gPSAkaM2PX2EpXV0sW1wiZGVmaW5lRXhvQ2xhc3NcIixbJGjNj19hID0+IChkZWZpbmVFeG9DbGFzcyA9ICRozY9fYSldXSxbXCJkZWZpbmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKGRlZmluZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJTZXRTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJTZXRTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9ICRozY9fYSldXV1dLFtcIi4vbWFrZS1vbmNlLmpzXCIsIFtbXCJtYWtlT25jZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VPbmNlS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9rZXlzLmpzXCIsIFtbXCJhZ29yaWNWYXREYXRhS2V5c1wiLFskaM2PX2EgPT4gKGtleXMgPSAkaM2PX2EpXV1dXSxbXCIuL3dhdGNoLXByb21pc2UuanNcIiwgW1tcIndhdGNoUHJvbWlzZVwiLFskaM2PX2EgPT4gKHdhdGNoUHJvbWlzZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1N0b3Jlc30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtTdG9yZXN9XG4gKi9cbmNvbnN0IGRldGFjaGVkSGVhcFN0b3JlcyA9IEZhcignaGVhcFN0b3JlcycsIHtcbiAgZGV0YWNoZWQ6ICgpID0+IGRldGFjaGVkSGVhcFN0b3JlcyxcbiAgaXNTdG9yYWJsZTogaXNQYXNzYWJsZSxcblxuICBzZXRTdG9yZTogbWFrZVNjYWxhclNldFN0b3JlLFxuICBtYXBTdG9yZTogbWFrZVNjYWxhck1hcFN0b3JlLFxuICB3ZWFrTWFwU3RvcmU6IG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsXG4gIHdlYWtTZXRTdG9yZTogbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxcbn0pO1xuXG4vKipcbiAqIENyZWF0ZSBhIGhlYXAgKGluLW1lbW9yeSkgem9uZSB0aGF0IHVzZXMgdGhlIGRlZmF1bHQgZXhvIGFuZCBzdG9yZSBpbXBsZW1lbnRhdGlvbnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtiYXNlTGFiZWxdXG4gKiBAcmV0dXJucyB7Wm9uZX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VIZWFwWm9uZSA9IChiYXNlTGFiZWwgPSAnaGVhcFpvbmUnKSA9PiB7XG4gIGNvbnN0IHsgbWFrZU9uY2UsIHdyYXBQcm92aWRlciB9ID0gbWFrZU9uY2VLaXQoYmFzZUxhYmVsLCBkZXRhY2hlZEhlYXBTdG9yZXMpO1xuXG4gIC8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcGFyYW0ge2FueX0gX29wdGlvbnNcbiAqL1xuICBjb25zdCBtYWtlU3ViWm9uZSA9IChsYWJlbCwgX29wdGlvbnMpID0+XG4gICAgbWFrZUhlYXBab25lKGAke2Jhc2VMYWJlbH0uJHtsYWJlbH1gKTtcblxuICByZXR1cm4gRmFyKCdoZWFwWm9uZScsIHtcbiAgICBleG86IHdyYXBQcm92aWRlcihtYWtlRXhvLCBrZXlzLmV4byksXG4gICAgZXhvQ2xhc3M6IHdyYXBQcm92aWRlcihkZWZpbmVFeG9DbGFzcywga2V5cy5leG9DbGFzcyksXG4gICAgZXhvQ2xhc3NLaXQ6IHdyYXBQcm92aWRlcihkZWZpbmVFeG9DbGFzc0tpdCwga2V5cy5leG9DbGFzc0tpdCksXG4gICAgc3ViWm9uZTogd3JhcFByb3ZpZGVyKG1ha2VTdWJab25lKSxcblxuICAgIG1ha2VPbmNlLFxuICAgIHdhdGNoUHJvbWlzZSxcbiAgICBkZXRhY2hlZDogZGV0YWNoZWRIZWFwU3RvcmVzLmRldGFjaGVkLFxuICAgIGlzU3RvcmFibGU6IGRldGFjaGVkSGVhcFN0b3Jlcy5pc1N0b3JhYmxlLFxuXG4gICAgbWFwU3RvcmU6IHdyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMubWFwU3RvcmUpLFxuICAgIHNldFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLnNldFN0b3JlKSxcbiAgICB3ZWFrTWFwU3RvcmU6IHdyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMud2Vha01hcFN0b3JlKSxcbiAgICB3ZWFrU2V0U3RvcmU6IHdyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMud2Vha1NldFN0b3JlKSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlSGVhcFpvbmUobWFrZUhlYXBab25lKTtcbmhhcmRlbihtYWtlSGVhcFpvbmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUhlYXBab25lIjpbIm1ha2VIZWFwWm9uZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAVbrH6eQIAAHkCAAAlAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2V4cG9ydHMuanMiLCIuL21ha2Utb25jZS5qcyIsIi4va2V5cy5qcyIsIi4vaXMtcGFzc2FibGUuanMiLCIuL3dhdGNoLXByb21pc2UuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiLCIuL2lzLXBhc3NhYmxlLmpzIiwiLi9rZXlzLmpzIiwiLi9tYWtlLW9uY2UuanMiLCIuL3dhdGNoLXByb21pc2UuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9leHBvcnRzLmpzXCIsIFtdXSxbXCIuL21ha2Utb25jZS5qc1wiLCBbXV0sW1wiLi9rZXlzLmpzXCIsIFtdXSxbXCIuL2lzLXBhc3NhYmxlLmpzXCIsIFtdXSxbXCIuL3dhdGNoLXByb21pc2UuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALUzVkSEDAAAhAwAAKwAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaXMtcGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImlzUGFzc2FibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCByZWFsSXNQYXNzYWJsZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImlzUGFzc2FibGVcIixbJGjNj19hID0+IChyZWFsSXNQYXNzYWJsZSA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgSW1wb3J0IGBpc1Bhc3NhYmxlYCBkaXJlY3RseSBmcm9tIGBAZW5kby9wYXNzLXN0eWxlYFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7c3BlY2ltZW4gaXMgUGFzc2FibGV9XG4gKi9cbiAgICAgICBjb25zdCBpc1Bhc3NhYmxlID0gc3BlY2ltZW4gPT4gcmVhbElzUGFzc2FibGUoc3BlY2ltZW4pOyRozY9fb25jZS5pc1Bhc3NhYmxlKGlzUGFzc2FibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZSI6WyJpc1Bhc3NhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGwVpz8iBAAAIgQAACQAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2tleXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFnb3JpY1ZhdERhdGFLZXlzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogQGltcG9ydCB7S2V5TWFrZXJzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKiogQHBhcmFtIHtzdHJpbmd9IGxhYmVsICovXG5jb25zdCBraW5kID0gbGFiZWwgPT4gYCR7bGFiZWx9X2tpbmRIYW5kbGVgO1xuXG4vKiogQHBhcmFtIHtzdHJpbmd9IGxhYmVsICovXG5jb25zdCBzaW5nbGV0b24gPSBsYWJlbCA9PiBgJHtsYWJlbH1fc2luZ2xldG9uYDtcblxuLyoqXG4gKiBLZXlNYWtlcnMgY29tcGF0aWJsZSB3aXRoIGBAYWdvcmljL3ZhdC1kYXRhYC5cbiAqXG4gKiBAdHlwZSB7S2V5TWFrZXJzfVxuICovXG4gICAgICAgY29uc3QgYWdvcmljVmF0RGF0YUtleXMgPSB7XG4gIGV4b0NsYXNzOiBsYWJlbCA9PiBoYXJkZW4oW2tpbmQobGFiZWwpXSksXG4gIGV4b0NsYXNzS2l0OiBsYWJlbCA9PiBoYXJkZW4oW2tpbmQobGFiZWwpXSksXG4gIGV4bzogbGFiZWwgPT4gaGFyZGVuKFtraW5kKGxhYmVsKSwgc2luZ2xldG9uKGxhYmVsKV0pLFxuICBzdG9yZTogbGFiZWwgPT4gaGFyZGVuKFtsYWJlbF0pLFxuICB6b25lOiBsYWJlbCA9PiBoYXJkZW4oW2xhYmVsXSksXG59OyRozY9fb25jZS5hZ29yaWNWYXREYXRhS2V5cyhhZ29yaWNWYXREYXRhS2V5cyk7XG5oYXJkZW4oYWdvcmljVmF0RGF0YUtleXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYWdvcmljVmF0RGF0YUtleXMiOlsiYWdvcmljVmF0RGF0YUtleXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqRuNqvoOAAD6DgAAKQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvbWFrZS1vbmNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VPbmNlS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qKlxuICogQGltcG9ydCB7U3RvcmVzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKi9cblxuLyoqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAqL1xuY29uc3QgZGVmYXVsdExhYmVsVG9LZXlzID0gbGFiZWwgPT4gaGFyZGVuKFtsYWJlbF0pO1xuaGFyZGVuKGRlZmF1bHRMYWJlbFRvS2V5cyk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlYnVnTmFtZSBPbmx5IHVzZWQgaW50ZXJuYWxseSBmb3IgZGlhZ25vc3RpY3MsIG5vdCBhdmFpbGFibGUgdG8gdXNlciBjb2RlXG4gKiBAcGFyYW0ge1N0b3Jlc30gc3RvcmVzXG4gKiBAcGFyYW0ge01hcFN0b3JlPHN0cmluZywgYW55Pn0gW2JhY2tpbmdTdG9yZV1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VPbmNlS2l0ID0gKGRlYnVnTmFtZSwgc3RvcmVzLCBiYWNraW5nU3RvcmUgPSB1bmRlZmluZWQpID0+IHtcbiAgLyogV2UgbmVlZCBhIGRldGFjaGVkIHNldFN0b3JlIHNvIHRoYXQgaXQgaXNuJ3QgcGVyc2lzdGVkIGFzIHBhcnQgb2YgdGhlIHpvbmUuKi9cbiAgLyogVGhhdCB3YXksIG91ciB1c2VkS2V5cyBhcmUgb25seSB0cmFja2VkIGZvciB0aGUgY3VycmVudCBpbmNhcm5hdGlvbiwgd2hpY2gqL1xuICAvKiBpcyB3aGF0IHdlIHdhbnQuICBVc2luZyBgZGVidWdOYW1lYCBpbiB0aGUgbGFiZWwgaXMgZ29vZCBmb3IgZGlhZ25vc3RpY3MsKi9cbiAgLyogYW5kIHNpbmNlIGl0IGlzIG9ubHkgZm9yIGEgZGV0YWNoZWQgc3RvcmUsIGl0IHNob3VsZCBub3QgYmUgdmlzaWJsZSB0byB0aGUqL1xuICAvKiBiYWNraW5nIHN0b3JlLiovXG4gIGNvbnN0IHVzZWRLZXlzID0gc3RvcmVzLmRldGFjaGVkKCkuc2V0U3RvcmUoYCR7ZGVidWdOYW1lfSB1c2VkIGtleXNgKTtcblxuICAvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqL1xuICBjb25zdCBhc3NlcnRPbmx5T25jZSA9IGtleSA9PiB7XG4gICAgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgfHwgRmFpbGBrZXkgJHtrZXl9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICF1c2VkS2V5cy5oYXMoa2V5KSB8fFxuICAgICAgRmFpbGBrZXkgJHtrZXl9IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBpbiB0aGlzIHpvbmUgYW5kIGluY2FybmF0aW9uYDtcblxuICAgIC8qIE1hcmsgdGhpcyBrZXkgYXMgdXNlZC4gIFdlIG1ha2Ugbm8gYXR0ZW1wdCB0byByZWNvdmVyIGZyb20gaW52YWxpZCBtYWtlcnMqL1xuICAgIC8qIG9yIGJhY2tpbmdTdG9yZXMuKi9cbiAgICB1c2VkS2V5cy5hZGQoa2V5KTtcbiAgfTtcblxuICAvKipcbiAqIEVuc3VyZSB0aGUgd3JhcHBlZCBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBvbmNlIHBlciBpbmNhcm5hdGlvbi4gIEl0IGlzXG4gKiBleHBlY3RlZCB0byB1cGRhdGUgdGhlIGJhY2tpbmcgc3RvcmUgZGlyZWN0bHkuXG4gKlxuICogQHRlbXBsYXRlIHsoa2V5OiBzdHJpbmcsIC4uLnJlc3Q6IGFueVtdKSA9PiBhbnl9IFRcbiAqIEBwYXJhbSB7VH0gcHJvdmlkZXJcbiAqIEBwYXJhbSB7KGxhYmVsOiBzdHJpbmcpID0+IHN0cmluZ1tdfSBbbGFiZWxUb0tleXNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuICBjb25zdCB3cmFwUHJvdmlkZXIgPSAocHJvdmlkZXIsIGxhYmVsVG9LZXlzID0gZGVmYXVsdExhYmVsVG9LZXlzKSA9PiB7XG4gICAgLyoqIEB0eXBlIHsoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUmV0dXJuVHlwZTxUPn0gKi9cbiAgICBjb25zdCB3cmFwcGVyID0gKGxhYmVsLCAuLi5yZXN0KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBsYWJlbFRvS2V5cyhsYWJlbCkpIHtcbiAgICAgICAgYXNzZXJ0T25seU9uY2Uoa2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm92aWRlcihsYWJlbCwgLi4ucmVzdCk7XG4gICAgfTtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtUfSAqLyAod3JhcHBlcik7XG4gIH07XG5cbiAgLyoqXG4gKiBUaGUgYmVzdCB3YXkgdG8gdW5kZXJzdGFuZCB0aGUgcHVycG9zZSBvZiBgbWFrZU9uY2VgIGlzIHRvIGZpcnN0IHVuZGVyc3RhbmRcbiAqIHdoYXQgYG1ha2VPbmNlYCBkb2VzIG9uIGEgZHVyYWJsZSB6b25lLiBVc2VkIGNvcnJlY3RseSwgYG1ha2VPbmNlYCBzaG91bGQgb25seVxuICogYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBvbiBhbnkgem9uZSxrZXkgcGFpciBkdXJpbmcgYW55IHZhdCBpbmNhcm5hdGlvbi5cbiAqIEdpdmVuIHRoYXQgY29uc3RyYWludCwgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHZhbHVlIGJvdW5kIHRvIHRoYXRcbiAqIHpvbmUsa2V5IHBhaXIsIGl0IG11c3QgaGF2ZSBiZWVuIGxlZnQgdGhlcmUgYnkgYSBwcmV2aW91cyBpbmNhcm5hdGlvbiBhbmRcbiAqIGBtYWtlT25jZWAgd2lsbCBzaW1wbHkgcmV0dXJuIGl0LiBJZiBub3QsIHRoZW4gYG1ha2VyKGtleSlgIGlzIGNhbGxlZCB0b1xuICogZGV0ZXJtaW5lIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoYXQgc2xvdCwgd2hpY2ggd2lsbCBub3JtYWxseSBiZSBwcmVzZXJ2ZWRcbiAqIGJ5IHNpbWlsYXIgY2FsbHMgdG8gYG1ha2VPbmNlYCBpbiBmdXR1cmUgaW5jYXJuYXRpb25zIC0tLSB0aG91Z2ggdGhhdCB3aWxsIGJlXG4gKiB1cCB0byB0aGVtLlxuICpcbiAqIEFsc28gZW5zdXJlcyB0aGUgbWFrZXIgcmV0dXJucyBhIHN0b3JhYmxlIHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgWm9uZSBzbG90IHRvIHByb3ZpZGUuXG4gKiBAcGFyYW0geyhrZXk6IHN0cmluZykgPT4gVn0gbWFrZXIgQ2FsbGVkIHRvIGNyZWF0ZSBhIGZyZXNoIHZhbHVlIHRvIGZpbGwgYW4gZW1wdHkgc2xvdC5cbiAqIEByZXR1cm5zIHtWfSBUaGUgdmFsdWUgb2YgdGhlIGtleSdzIHNsb3QuXG4gKi9cbiAgY29uc3QgbWFrZU9uY2UgPSAoa2V5LCBtYWtlcikgPT4ge1xuICAgIGFzc2VydE9ubHlPbmNlKGtleSk7XG4gICAgaWYgKGJhY2tpbmdTdG9yZSAmJiBiYWNraW5nU3RvcmUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBiYWNraW5nU3RvcmUuZ2V0KGtleSk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gbWFrZXIoa2V5KTtcbiAgICBzdG9yZXMuaXNTdG9yYWJsZSh2YWx1ZSkgfHxcbiAgICAgIEZhaWxgbWFrZXIgcmV0dXJuIHZhbHVlICR7dmFsdWV9IGlzIG5vdCBzdG9yYWJsZWA7XG4gICAgYmFja2luZ1N0b3JlICYmIGJhY2tpbmdTdG9yZS5pbml0KGtleSwgdmFsdWUpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgbWFrZU9uY2UsIHdyYXBQcm92aWRlciB9KTtcbn07JGjNj19vbmNlLm1ha2VPbmNlS2l0KG1ha2VPbmNlS2l0KTtcbmhhcmRlbihtYWtlT25jZUtpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlT25jZUtpdCI6WyJtYWtlT25jZUtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAACATuUgBoAAIAaAAAyAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9wcmVwYXJlLWF0dGVudWF0b3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiLCJAZW5kby9wYXR0ZXJucyIsIi4vaGVhcC5qcyJdLCJleHBvcnRzIjpbImF0dGVudWF0ZU9uZSIsInByZXBhcmVBdHRlbnVhdG9yTWFrZXIiLCJ3cmFwcGVyTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxmcm9tVW5pcXVlRW50cmllcyxNLG1ha2VIZWFwWm9uZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qc1wiLCBbW1wiZnJvbVVuaXF1ZUVudHJpZXNcIixbJGjNj19hID0+IChmcm9tVW5pcXVlRW50cmllcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIi4vaGVhcC5qc1wiLCBbW1wibWFrZUhlYXBab25lXCIsWyRozY9fYSA9PiAobWFrZUhlYXBab25lID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtNZXRob2RHdWFyZH0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICovXG5cbi8qIFRoaXMgYXR0ZW51YXRvciBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IGEgc2ltcGxpZmljYXRpb24gb2YgdGhlKi9cbi8qIHJldm9jYWJsZSBraXQgaW1wbGVtZW50YXRpb24gaW4gcHJlcGFyZS1yZXZvY2FibGUuanMuIFRoZSByZXZvY2FibGUga2l0Ki9cbi8qIHByb3ZpZGVzIGJvdGggYXR0ZW51YXRpb24gYW5kIHJldm9jYXRpb24sIHNpbmNlIHdlIGNhbiBoYXZlIGJvdGggZm9yIHRoZSovXG4vKiBwcmljZSBvZiBqdXN0IG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbi4gQnV0IGlmIHlvdSBkb24ndCBuZWVkIHJldm9jYXRpb24sKi9cbi8qIHRoZSByZXZvY2FibGUga2l0IGhhcyBtb3JlIEFQSSBjb21wbGV4aXR5IHRoYW4geW91IG5lZWQuKi9cbi8qKi9cbi8qIFdlIGNvdWxkIGhhdmUgYnVpbHQgYHByZXBhcmVBdHRlbnVhdG9yTWFrZXJgIGFzIGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCovXG4vKiBgcHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0YC4gQnV0IHRoZW4gd2UnZCBoYXZlIHRoZSB3ZWlyZCBhcnRpZmFjdCB0aGF0IHRoZSovXG4vKiBgZXh0cmFNZXRob2RzYCB3b3VsZCBzZWUgYSBgeyBzdGF0ZSwgZmFjZXRzOiB7IHJldm9jYWJsZSwgcmV2b2tlciB9fWAgY29udGV4dCovXG4vKiByYXRoZXIgdGhhbiBhIGB7IHN0YXRlLCBzZWxmIH1gIGNvbnRleHQuIFNvIGluc3RlYWQsIHdlIGNvcGllZCBhbmQgZWRpdGVkIGl0Ki9cbi8qIGRvd24uIFBsZWFzZSBjby1tYWludGFpbiB0aGVzZSB0d28gbW9kdWxlcy4qL1xuXG4vKiBCZWNhdXNlIHRoZSBhdHRlbnVhdG9yIGp1c3QgdXNlcyBhbiBleG8gY2xhc3MgcmF0aGVyIHRoYW4gYSBjbGFzcyBraXQsKi9cbi8qIGl0IGNhbm5vdCBzdXBwb3J0IHRoZSBwcml2aWxlZ2Ugc2VwYXJhdGlvbiBvZiBhIGRpc3RpbmN0IHJldm9rZXIgZmFjZXQuKi9cbi8qIEJ1dCBpdCBjYW4gc3RpbGwgc3VwcG9ydCBgc2VsZlJldm9rZWAgYXMgYSBzZXBhcmF0ZSBgZXh0cmFNZXRob2RgLCBhcyBzaG93biovXG4vKiBpbiBhIHRlc3RjYXNlIGF0IGBwcmVwYXJlLWF0dGVudWF0b3IudGVzdC5qc2AqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB3cmFwcGVyS2luZE5hbWVcbiAqIEBwYXJhbSB7UHJvcGVydHlLZXlbXX0gdU1ldGhvZE5hbWVzXG4gKiBAcGFyYW0ge1JlY29yZDxQcm9wZXJ0eUtleSwgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+fSBbZXh0cmFNZXRob2RzXVxuICovXG4gICAgICAgY29uc3Qgd3JhcHBlck1ldGhvZHMgPSAoXG4gIHdyYXBwZXJLaW5kTmFtZSxcbiAgdU1ldGhvZE5hbWVzLFxuICBleHRyYU1ldGhvZHMgPSB7fSxcbikgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5mcm9tVW5pcXVlRW50cmllcyhcbiAgICAgIHVNZXRob2ROYW1lcy5tYXAobmFtZSA9PiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHtcbiAgICAgICAgICAvKiBVc2UgY29uY2lzZSBtZXRob2Qgc3ludGF4IGZvciBleG8gbWV0aG9kcyovXG4gICAgICAgICAgW25hbWVdKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3Igbm9ybWFsIGV4by10aGlzIHR5cGluZyBjb25mdXNpb24qL1xuICAgICAgICAgICAgY29uc3QgeyB1bmRlcmx5aW5nIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgICAgICAgICAvKiBCZWNhdXNlIGF0dGVudWF0b3JzIHN0aWxsIHN1cHBvcnQgc29tZW9uZSBhZGRpbmcgYHNlbGZSZXZva2VgKi9cbiAgICAgICAgICAgIC8qIGFzIGFuIGBleHRyYU1ldGhvZGAsIHRoaXMgdGVzdCBpcyBzdGlsbCB1c2VmdWwuIFNlZSB0aGUqL1xuICAgICAgICAgICAgLyogdGVzdGNhc2UgaW4gYHByZXBhcmUtYXR0ZW51YXRvci50ZXN0LmpzYC4qL1xuICAgICAgICAgICAgdW5kZXJseWluZyAhPT0gdW5kZWZpbmVkIHx8IEZhaWxgJHtxKHdyYXBwZXJLaW5kTmFtZSl9IHJldm9rZWRgO1xuXG4gICAgICAgICAgICByZXR1cm4gdW5kZXJseWluZ1tuYW1lXSguLi5hcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciB1c2luZyBwb3NzaWJsZSBzeW1ib2wgYXMgaW5kZXggdHlwZSovXG4gICAgICAgIH1bbmFtZV0sXG4gICAgICBdKSxcbiAgICApLFxuICAgIC4uLmV4dHJhTWV0aG9kcyxcbiAgfSk7JGjNj19vbmNlLndyYXBwZXJNZXRob2RzKHdyYXBwZXJNZXRob2RzKTtcbmhhcmRlbih3cmFwcGVyTWV0aG9kcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEBjYWxsYmFjayBNYWtlQXR0ZW51YXRvclxuICogQHBhcmFtIHtVfSB1bmRlcmx5aW5nXG4gKiBAcmV0dXJucyB7UGFydGlhbDxVPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVT1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdHRlbnVhdG9yVGhpc1xuICogQHByb3BlcnR5IHtQYXJ0aWFsPFU+fSBzZWxmXG4gKiBAcHJvcGVydHkge3sgdW5kZXJseWluZzogVSB9fSBzdGF0ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF0dGVudWF0b3JPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3VJbnRlcmZhY2VOYW1lXVxuICogICBUaGUgYGludGVyZmFjZU5hbWVgIG9mIHRoZSB1bmRlcmx5aW5nIGludGVyZmFjZSBndWFyZC5cbiAqICAgRGVmYXVsdHMgdG8gdGhlIGB1S2luZE5hbWVgLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8XG4gKiAgIFByb3BlcnR5S2V5LFxuICogICBNZXRob2RHdWFyZFxuICogPn0gW2V4dHJhTWV0aG9kR3VhcmRzXVxuICogRm9yIGd1YXJkaW5nIHRoZSBgZXh0cmFNZXRob2RzYCwgaWYgeW91IGluY2x1ZGUgdGhlbSBiZWxvdy4gVGhlc2UgYXBwZWFyXG4gKiBvbmx5IG9uIHRoZSBzeW50aGVzaXplZCBpbnRlcmZhY2UgZ3VhcmQgZm9yIHRoZSBhdHRlbnVhdG9yLCBhbmRcbiAqIGRvIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIGFueSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcuXG4gKiBAcHJvcGVydHkge1JlY29yZDxcbiAqICAgUHJvcGVydHlLZXksXG4gKiAgICh0aGlzOiBBdHRlbnVhdG9yVGhpczxVPiwgLi4uYXJnczogYW55W10pID0+IGFueVxuICogPn0gW2V4dHJhTWV0aG9kc11cbiAqIEV4dHJhIG1ldGhvZHMgYWRkaW5nIGJlaGF2aW9yIG9ubHkgdG8gdGhlIGF0dGVudWF0b3IsIGFuZFxuICogZG8gbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gYW55IG1ldGhvZHMgb2YgdGhlIHVuZGVybHlpbmcuXG4gKi9cblxuLyoqXG4gKiBNYWtlIGFuIGV4byBjbGFzcyBmb3Igd3JhcHBpbmcgYW4gdW5kZXJseWluZyBleG8gY2xhc3MsXG4gKiB3aGVyZSB0aGUgd3JhcHBlciBpcyBhbiBhdHRlbnVhdG9yIG9mIHRoZSB1bmRlcmx5aW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVT1hbnldXG4gKiBAcGFyYW0ge1pvbmV9IHpvbmVcbiAqIEBwYXJhbSB7c3RyaW5nfSB1S2luZE5hbWVcbiAqICAgVGhlIGBraW5kTmFtZWAgb2YgdGhlIHVuZGVybHlpbmcgZXhvIGNsYXNzXG4gKiBAcGFyYW0geyhrZXlvZiBVKVtdfSB1TWV0aG9kTmFtZXNcbiAqICAgVGhlIG1ldGhvZCBuYW1lcyBvZiB0aGUgdW5kZXJseWluZyBleG8gY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVwcmVzZW50ZWRcbiAqICAgYnkgdHJhbnNwYXJlbnRseS1mb3J3YXJkaW5nIG1ldGhvZHMgb2YgdGhlIGF0dGVudWF0b3IuXG4gKiBAcGFyYW0ge0F0dGVudWF0b3JPcHRpb25zPFU+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtNYWtlQXR0ZW51YXRvcn1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVBdHRlbnVhdG9yTWFrZXIgPSAoXG4gIHpvbmUsXG4gIHVLaW5kTmFtZSxcbiAgdU1ldGhvZE5hbWVzLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgY29uc3Qge1xuICAgIHVJbnRlcmZhY2VOYW1lID0gdUtpbmROYW1lLFxuICAgIGV4dHJhTWV0aG9kR3VhcmRzID0ge30sXG4gICAgZXh0cmFNZXRob2RzID0ge30sXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBBdHRlbnVhdG9ySSA9IE0uaW50ZXJmYWNlKFxuICAgIGAke3VJbnRlcmZhY2VOYW1lfV9hdHRlbnVhdG9yYCxcbiAgICBleHRyYU1ldGhvZEd1YXJkcyxcbiAgICB7IGRlZmF1bHRHdWFyZHM6ICdyYXcnIH0sXG4gICk7XG5cbiAgY29uc3QgYXR0ZW51YXRvcktpbmROYW1lID0gYCR7dUtpbmROYW1lfV9hdHRlbnVhdG9yYDtcblxuICByZXR1cm4gem9uZS5leG9DbGFzcyhcbiAgICBhdHRlbnVhdG9yS2luZE5hbWUsXG4gICAgQXR0ZW51YXRvckksXG4gICAgdW5kZXJseWluZyA9PiAoeyB1bmRlcmx5aW5nIH0pLFxuICAgIHdyYXBwZXJNZXRob2RzKGF0dGVudWF0b3JLaW5kTmFtZSwgdU1ldGhvZE5hbWVzLCBleHRyYU1ldGhvZHMpLFxuICAgIHtcbiAgICAgIHN0YXRlU2hhcGU6IHsgdW5kZXJseWluZzogTS5vcHQoTS5yZW1vdGFibGUoJ3VuZGVybHlpbmcnKSkgfSxcbiAgICB9LFxuICApO1xufTskaM2PX29uY2UucHJlcGFyZUF0dGVudWF0b3JNYWtlcihwcmVwYXJlQXR0ZW51YXRvck1ha2VyKTtcbmhhcmRlbihwcmVwYXJlQXR0ZW51YXRvck1ha2VyKTtcblxuLyogY2YuIGh0dHBzOi8vZW5kb2pzLmdpdGh1Yi5pby9lbmRvL2Z1bmN0aW9ucy9fZW5kb19wYXNzX3N0eWxlLlJlbW90YWJsZS5odG1sKi9cbmNvbnN0IFJlbW90YWJsZVByZWZpeFJFID0gL14oQWxsZWdlZDogfERlYnVnTmFtZTogKS87XG5cbi8qKlxuICogQSBjb252ZW5pZW5jZSBhYm92ZSBgcHJlcGFyZUF0dGVudWF0b3JNYWtlcmAgZm9yIGRvaW5nIGEgc2luZ2xldG9uXG4gKiBlcGhlbWVyYWwgYXR0ZW51YXRvciwgaS5lLiwgYSBuZXcgYXR0ZW51YXRvciBpbnN0YW5jZSAoYW5kIGhpZGRlbiBjbGFzcylcbiAqIHRoYXQgaXMgYWxsb2NhdGVkIGluIHRoZSBoZWFwIHpvbmUsIGFuZCB0aGVyZWZvcmUgZXBoZW1lcmFsLiBUaGUgdW5kZXJseWluZ1xuICogY2FuIGJlIGR1cmFibGUgb3Igbm90LCB3aXRoIG5vIGNvbmZsaWN0IHdpdGggdGhlIGF0dGVudWF0b3IgYmVpbmdcbiAqIGVwaGVtZXJhbC4gVGhlIHByaWNlIG9mIHRoaXMgY29udmVuaWVuY2UgaXMgdGhlIGFsbG9jYXRpb24gb2YgdGhlIGhpZGRlblxuICogY2xhc3MgYW5kIHdyYXBwZXIgbWV0aG9kcyBwZXIgYGF0dGVudWF0ZU9uZWAgY2FsbCwgaS5lLiwgcGVyIGF0dGVudWF0b3JcbiAqIGluc3RhbmNlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7YW55fSBVXG4gKiBAcGFyYW0ge1V9IHVuZGVybHlpbmdcbiAqIEBwYXJhbSB7KGtleW9mIFUpW119IHVNZXRob2ROYW1lc1xuICogQHBhcmFtIHtBdHRlbnVhdG9yT3B0aW9uczxVPn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UGFydGlhbDxVPn1cbiAqL1xuICAgICAgIGNvbnN0IGF0dGVudWF0ZU9uZSA9ICh1bmRlcmx5aW5nLCB1TWV0aG9kTmFtZXMsIG9wdGlvbnMgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgaGVhcFpvbmUgPSBtYWtlSGVhcFpvbmUoKTtcbiAgY29uc3QgdUtpbmROYW1lID0gKHVuZGVybHlpbmdbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCAnVW5kZXJseWluZycpLnJlcGxhY2UoXG4gICAgUmVtb3RhYmxlUHJlZml4UkUsXG4gICAgJycsXG4gICk7XG4gIGNvbnN0IG1ha2VBdHRlbnVhdG9yID0gcHJlcGFyZUF0dGVudWF0b3JNYWtlcihcbiAgICBoZWFwWm9uZSxcbiAgICB1S2luZE5hbWUsXG4gICAgdU1ldGhvZE5hbWVzLFxuICAgIG9wdGlvbnMsXG4gICk7XG4gIHJldHVybiBtYWtlQXR0ZW51YXRvcih1bmRlcmx5aW5nKTtcbn07JGjNj19vbmNlLmF0dGVudWF0ZU9uZShhdHRlbnVhdGVPbmUpO1xuaGFyZGVuKGF0dGVudWF0ZU9uZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cmFwcGVyTWV0aG9kcyI6WyJ3cmFwcGVyTWV0aG9kcyJdLCJwcmVwYXJlQXR0ZW51YXRvck1ha2VyIjpbInByZXBhcmVBdHRlbnVhdG9yTWFrZXIiXSwiYXR0ZW51YXRlT25lIjpbImF0dGVudWF0ZU9uZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAd2z2IchQAAHIUAAAxAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9wcmVwYXJlLXJldm9jYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyIsIi4vcHJlcGFyZS1hdHRlbnVhdG9yLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTSx3cmFwcGVyTWV0aG9kczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIi4vcHJlcGFyZS1hdHRlbnVhdG9yLmpzXCIsIFtbXCJ3cmFwcGVyTWV0aG9kc1wiLFskaM2PX2EgPT4gKHdyYXBwZXJNZXRob2RzID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBpbXBvcnQge0FtcGxpZnl9IGZyb20gJ0BlbmRvL2V4byc7XG4gKiBAaW1wb3J0IHtNZXRob2RHdWFyZH0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICovXG5cbi8qIFRoaXMgcmV2b2NhYmxlIGtpdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBmb3IgYm90aCBhdHRlbnVhdGlvbiBhbmQqL1xuLyogcmV2b2NhdGlvbiwgc2luY2UgYm90aCBjYW4gYmUgcHJvdmlkZWQgYXQgdGhlIGNvc3Qgb2Ygb25lIGxldmVsIG9mKi9cbi8qIGluZGlyZWN0aW9uLiBCdXQgaWYgeW91IGp1c3QgbmVlZCBhdHRlbnVhdGlvbiB3aXRob3V0IHJldm9jYXRpb24sIGJldHRlciB0byovXG4vKiB1c2UgdGhlIGF0dGVudWF0b3IgaW1wbGVtZW50YXRpb24gaW4gcHJlcGFyZS1hdHRlbnVhdG9yLmpzLiovXG4vKiBQbGVhc2UgY28tbWFpbnRhaW4gdGhlc2UgdHdvIG1vZHVsZXMuKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1U9YW55XVxuICogQGNhbGxiYWNrIE1ha2VSZXZvY2FibGVcbiAqIEBwYXJhbSB7VX0gdW5kZXJseWluZ1xuICogQHJldHVybnMge1BhcnRpYWw8VT59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1U9YW55XVxuICogQGNhbGxiYWNrIE1ha2VSZXZvY2FibGVLaXRcbiAqIEBwYXJhbSB7VX0gdW5kZXJseWluZ1xuICogQHJldHVybnMge1Jldm9jYWJsZUtpdDxVPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVT1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZXZvY2FibGVNYWtlcktpdFxuICogQHByb3BlcnR5IHsocmV2b2NhYmxlOiBVKSA9PiBib29sZWFufSByZXZva2VcbiAqIEBwcm9wZXJ0eSB7TWFrZVJldm9jYWJsZTxVPn0gbWFrZVJldm9jYWJsZVxuICogICBGb3J3YXJkcyB0byB0aGUgdW5kZXJseWluZyBleG8gb2JqZWN0LCB1bnRpbCByZXZva2VkXG4gKiBAcHJvcGVydHkge01ha2VSZXZvY2FibGVLaXQ8VT59IG1ha2VSZXZvY2FibGVLaXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJldm9rZXJGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBib29sZWFufSByZXZva2VcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVT1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZXZvY2FibGVLaXRcbiAqIEBwcm9wZXJ0eSB7UmV2b2tlckZhY2V0fSByZXZva2VyXG4gKiBAcHJvcGVydHkge1BhcnRpYWw8VT59IHJldm9jYWJsZVxuICogICBGb3J3YXJkcyB0byB0aGUgdW5kZXJseWluZyBleG8gb2JqZWN0LCB1bnRpbCByZXZva2VkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1U9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gUmV2b2NhYmxlS2l0VGhpc1xuICogQHByb3BlcnR5IHtSZXZvY2FibGVLaXQ8VT59IGZhY2V0c1xuICogQHByb3BlcnR5IHt7IHVuZGVybHlpbmc6IFUgfX0gc3RhdGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVT1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZXZvY2FibGVLaXRPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3VJbnRlcmZhY2VOYW1lXVxuICogICBUaGUgYGludGVyZmFjZU5hbWVgIG9mIHRoZSB1bmRlcmx5aW5nIGludGVyZmFjZSBndWFyZC5cbiAqICAgRGVmYXVsdHMgdG8gdGhlIGB1S2luZE5hbWVgLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8XG4gKiAgIFByb3BlcnR5S2V5LFxuICogICBNZXRob2RHdWFyZFxuICogPn0gW2V4dHJhTWV0aG9kR3VhcmRzXVxuICogRm9yIGd1YXJkaW5nIHRoZSBgZXh0cmFNZXRob2RzYCwgaWYgeW91IGluY2x1ZGUgdGhlbSBiZWxvdy4gVGhlc2UgYXBwZWFyXG4gKiBvbmx5IG9uIHRoZSBzeW50aGVzaXplZCBpbnRlcmZhY2UgZ3VhcmQgZm9yIHRoZSByZXZvY2FibGUgY2FyZXRha2VyLCBhbmRcbiAqIGRvIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIGFueSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcuXG4gKiBAcHJvcGVydHkge1JlY29yZDxcbiAqICAgUHJvcGVydHlLZXksXG4gKiAgICh0aGlzOiBSZXZvY2FibGVLaXRUaGlzPFU+LCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4gKiA+fSBbZXh0cmFNZXRob2RzXVxuICogRXh0cmEgbWV0aG9kcyBhZGRpbmcgYmVoYXZpb3Igb25seSB0byB0aGUgcmV2b2NhYmxlIGNhcmV0YWtlciwgYW5kXG4gKiBkbyBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBhbnkgbWV0aG9kcyBvZiB0aGUgdW5kZXJseWluZy5cbiAqL1xuXG4vKipcbiAqIE1ha2UgYW4gZXhvIGNsYXNzIGtpdCBmb3Igd3JhcHBpbmcgYW4gdW5kZXJseWluZyBleG8gY2xhc3MsXG4gKiB3aGVyZSB0aGUgd3JhcHBlciBpcyBhIHJldm9jYWJsZSBmb3J3YXJkZXIuXG4gKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEBwYXJhbSB7Wm9uZX0gem9uZVxuICogQHBhcmFtIHtzdHJpbmd9IHVLaW5kTmFtZVxuICogICBUaGUgYGtpbmROYW1lYCBvZiB0aGUgdW5kZXJseWluZyBleG8gY2xhc3NcbiAqIEBwYXJhbSB7UHJvcGVydHlLZXlbXX0gdU1ldGhvZE5hbWVzXG4gKiAgIFRoZSBtZXRob2QgbmFtZXMgb2YgdGhlIHVuZGVybHlpbmcgZXhvIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlcHJlc2VudGVkXG4gKiAgIGJ5IHRyYW5zcGFyZW50bHktZm9yd2FyZGluZyBtZXRob2RzIG9mIHRoZSByZXZvY2FibGUgY2FyZXRha2VyLlxuICogQHBhcmFtIHtSZXZvY2FibGVLaXRPcHRpb25zPFU+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtSZXZvY2FibGVNYWtlcktpdDxVPn1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVSZXZvY2FibGVNYWtlcktpdCA9IChcbiAgem9uZSxcbiAgdUtpbmROYW1lLFxuICB1TWV0aG9kTmFtZXMsXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBjb25zdCB7XG4gICAgdUludGVyZmFjZU5hbWUgPSB1S2luZE5hbWUsXG4gICAgZXh0cmFNZXRob2RHdWFyZHMgPSB7fSxcbiAgICBleHRyYU1ldGhvZHMgPSB7fSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IFJldm9jYWJsZUlLaXQgPSBoYXJkZW4oe1xuICAgIHJldm9rZXI6IE0uaW50ZXJmYWNlKGAke3VJbnRlcmZhY2VOYW1lfV9yZXZva2VyYCwge1xuICAgICAgcmV2b2tlOiBNLmNhbGwoKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgICB9KSxcbiAgICByZXZvY2FibGU6IE0uaW50ZXJmYWNlKGAke3VJbnRlcmZhY2VOYW1lfV9yZXZvY2FibGVgLCBleHRyYU1ldGhvZEd1YXJkcywge1xuICAgICAgZGVmYXVsdEd1YXJkczogJ3JhdycsXG4gICAgfSksXG4gIH0pO1xuXG4gIGNvbnN0IHJldm9jYWJsZUtpbmROYW1lID0gYCR7dUtpbmROYW1lfV9jYXJldGFrZXJgO1xuXG4gIC8qKiBAdHlwZSB7QW1wbGlmeTxhbnk+fSAqL1xuICBsZXQgYW1wbGlmaWVyO1xuXG4gIGNvbnN0IG1ha2VSZXZvY2FibGVLaXQgPSB6b25lLmV4b0NsYXNzS2l0KFxuICAgIHJldm9jYWJsZUtpbmROYW1lLFxuICAgIFJldm9jYWJsZUlLaXQsXG4gICAgdW5kZXJseWluZyA9PiAoeyB1bmRlcmx5aW5nIH0pLFxuICAgIHtcbiAgICAgIHJldm9rZXI6IHtcbiAgICAgICAgcmV2b2tlKCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgaWYgKHN0YXRlLnVuZGVybHlpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS51bmRlcmx5aW5nID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJldm9jYWJsZTogd3JhcHBlck1ldGhvZHMocmV2b2NhYmxlS2luZE5hbWUsIHVNZXRob2ROYW1lcywgZXh0cmFNZXRob2RzKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN0YXRlU2hhcGU6IHsgdW5kZXJseWluZzogTS5vcHQoTS5yZW1vdGFibGUoJ3VuZGVybHlpbmcnKSkgfSxcbiAgICAgIHJlY2VpdmVBbXBsaWZpZXI6IGFtcCA9PiB7XG4gICAgICAgIGFtcGxpZmllciA9IGFtcDtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICAvKipcbiAqIEB0eXBlIHtNYWtlUmV2b2NhYmxlfVxuICovXG4gIGNvbnN0IG1ha2VSZXZvY2FibGUgPSB1bmRlcmx5aW5nID0+IG1ha2VSZXZvY2FibGVLaXQodW5kZXJseWluZykucmV2b2NhYmxlO1xuXG4gIC8qKlxuICogQHBhcmFtIHtVfSByZXZvY2FibGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IHJldm9rZSA9IHJldm9jYWJsZSA9PiB7XG4gICAgLyoqIEB0eXBlIHtSZXZvY2FibGVLaXQ8VT59ICovXG4gICAgY29uc3QgZmFjZXRzID0gYW1wbGlmaWVyKHJldm9jYWJsZSk7XG4gICAgaWYgKGZhY2V0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmYWNldHMucmV2b2tlci5yZXZva2UoKTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICByZXZva2UsXG4gICAgbWFrZVJldm9jYWJsZSxcbiAgICAvKiogQHR5cGUge01ha2VSZXZvY2FibGVLaXR9ICovXG4gICAgbWFrZVJldm9jYWJsZUtpdCxcbiAgfSk7XG59OyRozY9fb25jZS5wcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQocHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0KTtcbmhhcmRlbihwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0IjpbInByZXBhcmVSZXZvY2FibGVNYWtlcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABgv9oYqw0AAKsNAAAtAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy93YXRjaC1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3BhdHRlcm5zIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsiUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJIiwiUHJvbWlzZVdhdGNoZXJIYW5kbGVyIiwiUHJvbWlzZVdhdGNoZXJJIiwiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiLCJ3YXRjaFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLE0sRTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBBIFByb21pc2VXYXRjaGVyIG1ldGhvZCBndWFyZCBjYWxsYWJsZSB3aXRoIG9yIG1vcmUgYXJndW1lbnRzLCByZXR1cm5pbmcgdm9pZC5cbiAqL1xuICAgICAgIGNvbnN0IFByb21pc2VXYXRjaGVySGFuZGxlciA9IE0uY2FsbChNLnJhdygpKS5yZXN0KE0ucmF3KCkpLnJldHVybnMoKTtcblxuLyoqXG4gKiBBIFByb21pc2VXYXRjaGVyIGludGVyZmFjZSB0aGF0IGhhcyBib3RoIG9uRnVsZmlsbGVkIGFuZCBvblJlamVjdGVkIGhhbmRsZXJzLlxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVySGFuZGxlcihQcm9taXNlV2F0Y2hlckhhbmRsZXIpO1xuICAgICAgIGNvbnN0IFByb21pc2VXYXRjaGVySSA9IE0uaW50ZXJmYWNlKCdQcm9taXNlV2F0Y2hlcicsIHtcbiAgb25GdWxmaWxsZWQ6IFByb21pc2VXYXRjaGVySGFuZGxlcixcbiAgb25SZWplY3RlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxufSk7XG5cbi8qKlxuICogQSBQcm9taXNlV2F0Y2hlciBpbnRlcmZhY2UgdGhhdCBoYXMgb25seSBhbiBvbkZ1bGZpbGxlZCBoYW5kbGVyLlxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVySShQcm9taXNlV2F0Y2hlckkpO1xuICAgICAgIGNvbnN0IFByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSA9IE0uaW50ZXJmYWNlKCdQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZCcsIHtcbiAgb25GdWxmaWxsZWQ6IFByb21pc2VXYXRjaGVySGFuZGxlcixcbn0pO1xuXG4vKipcbiAqIEEgUHJvbWlzZVdhdGNoZXIgaW50ZXJmYWNlIHRoYXQgaGFzIG9ubHkgYW4gb25SZWplY3RlZCBoYW5kbGVyLlxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSShQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkpO1xuICAgICAgIGNvbnN0IFByb21pc2VXYXRjaGVyUmVqZWN0ZWRJID0gTS5pbnRlcmZhY2UoJ1Byb21pc2VXYXRjaGVyUmVqZWN0ZWQnLCB7XG4gIG9uUmVqZWN0ZWQ6IFByb21pc2VXYXRjaGVySGFuZGxlcixcbn0pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByb21pc2VXYXRjaGVyXG4gKiBAcHJvcGVydHkgeyhmdWxmaWxtZW50OiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWR9IFtvbkZ1bGZpbGxlZF1cbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbjogdW5rbm93biwgLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkfSBbb25SZWplY3RlZF1cbiAqL1xuXG4vKipcbiAqIEFkYXB0IGEgcHJvbWlzZSB3YXRjaGVyIG1ldGhvZCB0byBFLndoZW4uXG4gKiBAcGFyYW0ge1JlY29yZDxQcm9wZXJ0eUtleSwgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bj59IHRoYXRcbiAqIEBwYXJhbSB7UHJvcGVydHlLZXl9IHByb3BcbiAqIEBwYXJhbSB7dW5rbm93bltdfSBwb3N0QXJnc1xuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVyUmVqZWN0ZWRJKFByb21pc2VXYXRjaGVyUmVqZWN0ZWRJKTtcbmNvbnN0IGNhbGxNZU1heWJlID0gKHRoYXQsIHByb3AsIHBvc3RBcmdzKSA9PiB7XG4gIGNvbnN0IGZuID0gdGhhdFtwcm9wXTtcbiAgaWYgKCFmbikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgYXNzZXJ0LnR5cGVvZihmbiwgJ2Z1bmN0aW9uJyk7XG4gIC8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhcmcgdmFsdWUgb3IgcmVhc29uXG4gKi9cbiAgY29uc3Qgd3JhcHBlZCA9IGFyZyA9PiB7XG4gICAgLyogRG9uJ3QgcmV0dXJuIGEgdmFsdWUsIHRvIHByZXZlbnQgRS53aGVuIGZyb20gc3Vic2NyaWJpbmcgdG8gYSByZXN1bHRpbmcqL1xuICAgIC8qIHByb21pc2UuKi9cbiAgICBhcHBseShmbiwgdGhhdCwgW2FyZywgLi4ucG9zdEFyZ3NdKTtcbiAgfTtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59O1xuXG4vKipcbiAqIFNoaW0gdGhlIHByb21pc2Ugd2F0Y2hlciBiZWhhdmlvdXIgd2hlbiBWYXREYXRhLndhdGNoUHJvbWlzZSBpcyBub3QgYXZhaWxhYmxlLlxuICpcbiAqIEBwYXJhbSB7UHJvbWlzZTxhbnk+fSBwXG4gKiBAcGFyYW0ge1Byb21pc2VXYXRjaGVyfSB3YXRjaGVyXG4gKiBAcGFyYW0gey4uLnVua25vd259IHdhdGNoZXJBcmdzXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuICAgICAgIGNvbnN0IHdhdGNoUHJvbWlzZSA9IChwLCB3YXRjaGVyLCAuLi53YXRjaGVyQXJncykgPT4ge1xuICBQcm9taXNlLnJlc29sdmUocCkgPT09IHAgfHwgRmFpbGB3YXRjaFByb21pc2Ugb25seSB3YXRjaGVzIHByb21pc2VzYDtcbiAgY29uc3Qgb25GdWxmaWxsZWQgPSBjYWxsTWVNYXliZSh3YXRjaGVyLCAnb25GdWxmaWxsZWQnLCB3YXRjaGVyQXJncyk7XG4gIGNvbnN0IG9uUmVqZWN0ZWQgPSBjYWxsTWVNYXliZSh3YXRjaGVyLCAnb25SZWplY3RlZCcsIHdhdGNoZXJBcmdzKTtcbiAgb25GdWxmaWxsZWQgfHxcbiAgICBvblJlamVjdGVkIHx8XG4gICAgRmFpbGBwcm9taXNlIHdhdGNoZXIgbXVzdCBpbXBsZW1lbnQgYXQgbGVhc3Qgb25lIGhhbmRsZXIgbWV0aG9kYDtcbiAgdm9pZCBFLndoZW4ocCwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xufTskaM2PX29uY2Uud2F0Y2hQcm9taXNlKHdhdGNoUHJvbWlzZSk7XG5oYXJkZW4od2F0Y2hQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlByb21pc2VXYXRjaGVySGFuZGxlciI6WyJQcm9taXNlV2F0Y2hlckhhbmRsZXIiXSwiUHJvbWlzZVdhdGNoZXJJIjpbIlByb21pc2VXYXRjaGVySSJdLCJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiOlsiUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJIl0sIlByb21pc2VXYXRjaGVyUmVqZWN0ZWRJIjpbIlByb21pc2VXYXRjaGVyUmVqZWN0ZWRJIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbCSwahYCAAAWAgAAKAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC96b25lLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9zcmMvcHJlcGFyZS1yZXZvY2FibGUuanMiLCIuL3NyYy9wcmVwYXJlLWF0dGVudWF0b3IuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9wcmVwYXJlLWF0dGVudWF0b3IuanMiLCIuL3NyYy9wcmVwYXJlLXJldm9jYWJsZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9wcmVwYXJlLXJldm9jYWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvcHJlcGFyZS1hdHRlbnVhdG9yLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOGDnYDnPAAA5zwAACYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50TWF0aC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSIsIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkFtb3VudE1hdGgiLCJBc3NldEtpbmQiLCJhc3NlcnRBc3NldEtpbmQiLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiLCJnZXRBc3NldEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwscGFzc1N0eWxlT2YsYXNzZXJ0UmVtb3RhYmxlLGFzc2VydFJlY29yZCxNLG1hdGNoZXMsbmF0TWF0aEhlbHBlcnMsc2V0TWF0aEhlbHBlcnMsY29weVNldE1hdGhIZWxwZXJzLGNvcHlCYWdNYXRoSGVscGVyczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImFzc2VydFJlbW90YWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFJlbW90YWJsZSA9ICRozY9fYSldXSxbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNcIiwgW1tcIm5hdE1hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAobmF0TWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJzZXRNYXRoSGVscGVyc1wiLFskaM2PX2EgPT4gKHNldE1hdGhIZWxwZXJzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlTZXRNYXRoSGVscGVyc1wiLFskaM2PX2EgPT4gKGNvcHlTZXRNYXRoSGVscGVycyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5QmFnTWF0aEhlbHBlcnNcIixbJGjNj19hID0+IChjb3B5QmFnTWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q29weUJhZywgQ29weVNldH0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7QW1vdW50LCBBbW91bnRWYWx1ZSwgQXNzZXRWYWx1ZUZvcktpbmQsIEJyYW5kLCBDb3B5QmFnQW1vdW50LCBDb3B5U2V0QW1vdW50LCBNYXRoSGVscGVycywgTmF0QW1vdW50LCBOYXRWYWx1ZSwgU2V0QW1vdW50LCBTZXRWYWx1ZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyogTkI6IEFzc2V0S2luZCBpcyBib3RoIGEgY29uc3RhbnQgZm9yIGVudW1lcmF0ZWQgdmFsdWVzIGFuZCBhIHR5cGUgZm9yIHRob3NlIHZhbHVlcy4qL1xuLyoqXG4gKiBDb25zdGFudHMgZm9yIHRoZSBraW5kcyBvZiBhc3NldHMgd2Ugc3VwcG9ydC5cbiAqXG4gKiBAZW51bSB7KHR5cGVvZiBBc3NldEtpbmQpW2tleW9mIHR5cGVvZiBBc3NldEtpbmRdfVxuICovXG4gICAgICAgY29uc3QgQXNzZXRLaW5kID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgTkFUOiAnbmF0JyxcbiAgU0VUOiAnc2V0JyxcbiAgQ09QWV9TRVQ6ICdjb3B5U2V0JyxcbiAgQ09QWV9CQUc6ICdjb3B5QmFnJyxcbn0pOyRozY9fb25jZS5Bc3NldEtpbmQoQXNzZXRLaW5kKTtcbmhhcmRlbihBc3NldEtpbmQpO1xuY29uc3QgYXNzZXRLaW5kTmFtZXMgPSBoYXJkZW4oT2JqZWN0LnZhbHVlcyhBc3NldEtpbmQpLnNvcnQoKSk7XG5cbi8qKiBAcGFyYW0ge0Fzc2V0S2luZH0gYWxsZWdlZEFLICovXG4gICAgICAgY29uc3QgYXNzZXJ0QXNzZXRLaW5kID0gYWxsZWdlZEFLID0+IHtcbiAgYXNzZXRLaW5kTmFtZXMuaW5jbHVkZXMoYWxsZWdlZEFLKSB8fFxuICAgIEZhaWxgVGhlIGFzc2V0S2luZCAke2FsbGVnZWRBS30gbXVzdCBiZSBvbmUgb2YgJHtxKGFzc2V0S2luZE5hbWVzKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0QXNzZXRLaW5kKGFzc2VydEFzc2V0S2luZCk7XG5oYXJkZW4oYXNzZXJ0QXNzZXRLaW5kKTtcblxuLyoqXG4gKiBBbW91bnRzIGRlc2NyaWJlIGRpZ2l0YWwgYXNzZXRzLiBGcm9tIGFuIGFtb3VudCwgeW91IGNhbiBsZWFybiB0aGUgYnJhbmQgb2ZcbiAqIGRpZ2l0YWwgYXNzZXQgYXMgd2VsbCBhcyBcImhvdyBtdWNoXCIgb3IgXCJob3cgbWFueVwiLiBBbW91bnRzIGhhdmUgdHdvIHBhcnRzOiBhXG4gKiBicmFuZCAobG9vc2VseSBzcGVha2luZywgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCkgYW5kIHRoZSB2YWx1ZSAodGhlIGFuc3dlclxuICogdG8gXCJob3cgbXVjaFwiKS4gRm9yIGV4YW1wbGUsIGluIHRoZSBwaHJhc2UgXCI1IGJ1Y2tzXCIsIFwiYnVja3NcIiB0YWtlcyB0aGUgcm9sZVxuICogb2YgdGhlIGJyYW5kIGFuZCB0aGUgdmFsdWUgaXMgNS4gQW1vdW50cyBjYW4gZGVzY3JpYmUgZnVuZ2libGUgYW5kXG4gKiBub24tZnVuZ2libGUgZGlnaXRhbCBhc3NldHMuIEFtb3VudHMgYXJlIHBhc3MtYnktY29weSBhbmQgY2FuIGJlIG1hZGUgYnkgYW5kXG4gKiBzZW50IHRvIGFueW9uZS5cbiAqXG4gKiBUaGUgaXNzdWVyIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBvZiB0aGUgYW1vdW50IGluIHBheW1lbnRzIGFuZCBwdXJzZXMuXG4gKiBUaGUgaXNzdWVyIG11c3QgYmUgYWJsZSB0byBkbyB0aGluZ3Mgc3VjaCBhcyBhZGQgZGlnaXRhbCBhc3NldHMgdG8gYSBwdXJzZVxuICogYW5kIHdpdGhkcmF3IGRpZ2l0YWwgYXNzZXRzIGZyb20gYSBwdXJzZS4gVG8gZG8gc28sIGl0IG11c3Qga25vdyBob3cgdG8gYWRkXG4gKiBhbmQgc3VidHJhY3QgZGlnaXRhbCBhc3NldHMuIFJhdGhlciB0aGFuIGhhcmQtY29kaW5nIGEgcGFydGljdWxhciBzb2x1dGlvbixcbiAqIHdlIGNob3NlIHRvIHBhcmFtZXRlcml6ZSB0aGUgaXNzdWVyIHdpdGggYSBjb2xsZWN0aW9uIG9mIHBvbHltb3JwaGljXG4gKiBmdW5jdGlvbnMsIHdoaWNoIHdlIGNhbGwgYEFtb3VudE1hdGhgLiBUaGVzZSBtYXRoIGZ1bmN0aW9ucyBpbmNsdWRlIGNvbmNlcHRzXG4gKiBsaWtlIGFkZGl0aW9uLCBzdWJ0cmFjdGlvbiwgYW5kIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0by5cbiAqXG4gKiBXZSBhbHNvIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGNvbmZ1c2lvbiBhcyB0byB3aGF0IGtpbmQgb2YgYXNzZXQgd2VcbiAqIGFyZSB1c2luZy4gVGh1cywgQW1vdW50TWF0aCBpbmNsdWRlcyBjaGVja3Mgb2YgdGhlIGBicmFuZGAsIHRoZSB1bmlxdWVcbiAqIGlkZW50aWZpZXIgZm9yIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQuIElmIHRoZSB3cm9uZyBicmFuZCBpcyB1c2VkIGluXG4gKiBBbW91bnRNYXRoLCBhbiBlcnJvciBpcyB0aHJvd24gYW5kIHRoZSBvcGVyYXRpb24gZG9lcyBub3Qgc3VjY2VlZC5cbiAqXG4gKiBBbW91bnRNYXRoIHVzZXMgbWF0aEhlbHBlcnMgdG8gZG8gbW9zdCBvZiB0aGUgd29yaywgYnV0IHRoZW4gYWRkcyB0aGUgYnJhbmRcbiAqIHRvIHRoZSByZXN1bHQuIFRoZSBmdW5jdGlvbiBgdmFsdWVgIGdldHMgdGhlIHZhbHVlIGZyb20gdGhlIGFtb3VudCBieVxuICogcmVtb3ZpbmcgdGhlIGJyYW5kIChhbW91bnQgLT4gdmFsdWUpLCBhbmQgdGhlIGZ1bmN0aW9uIGBtYWtlYCBhZGRzIHRoZSBicmFuZFxuICogdG8gcHJvZHVjZSBhbiBhbW91bnQgKHZhbHVlIC0+IGFtb3VudCkuIFRoZSBmdW5jdGlvbiBgY29lcmNlYCB0YWtlcyBhbiBhbW91bnRcbiAqIGFuZCBjaGVja3MgaXQsIHJldHVybmluZyBhbiBhbW91bnQgKGFtb3VudCAtPiBhbW91bnQpLlxuICpcbiAqIEVhY2ggaXNzdWVyIG9mIGRpZ2l0YWwgYXNzZXRzIGhhcyBhbiBhc3NvY2lhdGVkIGJyYW5kIGluIGEgb25lLXRvLW9uZVxuICogbWFwcGluZy4gSW4gdW50cnVzdGVkIGNvbnRleHRzLCBzdWNoIGFzIGluIGFuYWx5emluZyBwYXltZW50cyBhbmQgYW1vdW50cywgd2VcbiAqIGNhbiBnZXQgdGhlIGJyYW5kIGFuZCBmaW5kIHRoZSBpc3N1ZXIgd2hpY2ggbWF0Y2hlcyB0aGUgYnJhbmQuIFRoZSBpc3N1ZXIgYW5kXG4gKiB0aGUgYnJhbmQgbXV0dWFsbHkgdmFsaWRhdGUgZWFjaCBvdGhlci5cbiAqL1xuXG5jb25zdCBoZWxwZXJzID0ge1xuICBuYXQ6IG5hdE1hdGhIZWxwZXJzLFxuICBzZXQ6IHNldE1hdGhIZWxwZXJzLFxuICBjb3B5U2V0OiBjb3B5U2V0TWF0aEhlbHBlcnMsXG4gIGNvcHlCYWc6IGNvcHlCYWdNYXRoSGVscGVycyxcbn07XG5cbi8qKiBAdHlwZSB7KHZhbHVlOiB1bmtub3duKSA9PiAnbmF0JyB8ICdzZXQnIHwgJ2NvcHlTZXQnIHwgJ2NvcHlCYWcnfSB9ICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCA9IHZhbHVlID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YodmFsdWUpO1xuICBpZiAocGFzc1N0eWxlID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiAnbmF0JztcbiAgfVxuICBpZiAocGFzc1N0eWxlID09PSAnY29weUFycmF5Jykge1xuICAgIHJldHVybiAnc2V0JztcbiAgfVxuICBpZiAobWF0Y2hlcyh2YWx1ZSwgTS5zZXQoKSkpIHtcbiAgICByZXR1cm4gJ2NvcHlTZXQnO1xuICB9XG4gIGlmIChtYXRjaGVzKHZhbHVlLCBNLmJhZygpKSkge1xuICAgIHJldHVybiAnY29weUJhZyc7XG4gIH1cbiAgLyogVE9ETyBUaGlzIGlzbid0IHF1aXRlIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLCBpbiBjYXNlIHZhbHVlUGFzc1N0eWxlKi9cbiAgLyogaXMgJ3RhZ2dlZCcuIFdlIHdvdWxkIG5lZWQgdG8gZGlzdGluZ3Vpc2ggd2hhdCBraW5kIG9mIHRhZ2dlZCovXG4gIC8qIG9iamVjdCBpdCBpcy4qL1xuICAvKiBBbHNvLCB0aGlzIGtpbmQgb2YgbWFudWFsIGxpc3RpbmcgaXMgYSBtYWludGVuYW5jZSBoYXphcmQgd2UqL1xuICAvKiAoVE9ETykgd2lsbCBlbmNvdW50ZXIgd2hlbiB3ZSBleHRlbmQgdGhlIG1hdGggaGVscGVycyBmdXJ0aGVyLiovXG4gIHRocm93IEZhaWxgdmFsdWUgJHt2YWx1ZX0gbXVzdCBiZSBhIGJpZ2ludCwgY29weVNldCwgY29weUJhZywgb3IgYW4gYXJyYXksIG5vdCAke3EoXG4gICAgcGFzc1N0eWxlLFxuICApfWA7XG59O1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCB2YWx1ZSBpcyBhIHZhbGlkIEFtb3VudE1hdGggYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGhlbHBlcnMuXG4gKlxuICogTWFkZSBhdmFpbGFibGUgb25seSBmb3IgdGVzdGluZywgYnV0IGl0IGlzIGhhcm1sZXNzIGZvciBvdGhlciB1c2VzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEBwYXJhbSB7Vn0gdmFsdWVcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczxWPn1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFZhbHVlR2V0SGVscGVycyA9IHZhbHVlID0+XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIGhlbHBlcnNbYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpXTtcblxuLyoqXG4gKiBAdHlwZSB7KGFsbGVnZWRCcmFuZDogQnJhbmQ8YW55PiwgYnJhbmQ/OiBCcmFuZDxhbnk+KSA9PiB2b2lkfVxuICovJGjNj19vbmNlLmFzc2VydFZhbHVlR2V0SGVscGVycyhhc3NlcnRWYWx1ZUdldEhlbHBlcnMpO1xuY29uc3Qgb3B0aW9uYWxCcmFuZENoZWNrID0gKGFsbGVnZWRCcmFuZCwgYnJhbmQpID0+IHtcbiAgaWYgKGJyYW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGFsbGVnZWRCcmFuZCA9PT0gYnJhbmQgfHxcbiAgICAgIEZhaWxgYW1vdW50J3MgYnJhbmQgJHtxKGFsbGVnZWRCcmFuZCl9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgYnJhbmQgJHtxKFxuICAgICAgICBicmFuZCxcbiAgICAgICl9YDtcbiAgfVxufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPiB8IHVuZGVmaW5lZH0gYnJhbmRcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczxhbnk+fVxuICovXG5jb25zdCBjaGVja0xSQW5kR2V0SGVscGVycyA9IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgYXNzZXJ0UmVjb3JkKGxlZnRBbW91bnQsICdsZWZ0QW1vdW50Jyk7XG4gIGFzc2VydFJlY29yZChyaWdodEFtb3VudCwgJ3JpZ2h0QW1vdW50Jyk7XG4gIGNvbnN0IHsgdmFsdWU6IGxlZnRWYWx1ZSwgYnJhbmQ6IGxlZnRCcmFuZCB9ID0gbGVmdEFtb3VudDtcbiAgY29uc3QgeyB2YWx1ZTogcmlnaHRWYWx1ZSwgYnJhbmQ6IHJpZ2h0QnJhbmQgfSA9IHJpZ2h0QW1vdW50O1xuICBhc3NlcnRSZW1vdGFibGUobGVmdEJyYW5kLCAnbGVmdEJyYW5kJyk7XG4gIGFzc2VydFJlbW90YWJsZShyaWdodEJyYW5kLCAncmlnaHRCcmFuZCcpO1xuICBvcHRpb25hbEJyYW5kQ2hlY2sobGVmdEJyYW5kLCBicmFuZCk7XG4gIG9wdGlvbmFsQnJhbmRDaGVjayhyaWdodEJyYW5kLCBicmFuZCk7XG4gIGxlZnRCcmFuZCA9PT0gcmlnaHRCcmFuZCB8fFxuICAgIEZhaWxgQnJhbmRzIGluIGxlZnQgJHtxKGxlZnRCcmFuZCl9IGFuZCByaWdodCAke3EoXG4gICAgICByaWdodEJyYW5kLFxuICAgICl9IHNob3VsZCBtYXRjaCBidXQgZG8gbm90YDtcbiAgY29uc3QgbGVmdEhlbHBlcnMgPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnMobGVmdFZhbHVlKTtcbiAgY29uc3QgcmlnaHRIZWxwZXJzID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHJpZ2h0VmFsdWUpO1xuICBsZWZ0SGVscGVycyA9PT0gcmlnaHRIZWxwZXJzIHx8XG4gICAgRmFpbGBUaGUgbGVmdCAke2xlZnRBbW91bnR9IGFuZCByaWdodCBhbW91bnQgJHtyaWdodEFtb3VudH0gaGFkIGRpZmZlcmVudCBhc3NldEtpbmRzYDtcbiAgcmV0dXJuIGxlZnRIZWxwZXJzO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtNYXRoSGVscGVyczxBc3NldFZhbHVlRm9yS2luZDxLPj59IGhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEByZXR1cm5zIHtbQXNzZXRWYWx1ZUZvcktpbmQ8Sz4sIEFzc2V0VmFsdWVGb3JLaW5kPEs+XX1cbiAqL1xuY29uc3QgY29lcmNlTFIgPSAoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpID0+IHtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBhcmJpdHJhcnkgc3VidHlwZSovXG4gIHJldHVybiBbaC5kb0NvZXJjZShsZWZ0QW1vdW50LnZhbHVlKSwgaC5kb0NvZXJjZShyaWdodEFtb3VudC52YWx1ZSldO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSByaWdodEFtb3VudC5cbiAqIFRoZSBub3Rpb24gb2YgXCJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cIiBkZXBlbmRzIG9uIHRoZSBraW5kIG9mIGFtb3VudCwgYXNcbiAqIGRlZmluZWQgYnkgdGhlIE1hdGhIZWxwZXJzLiBGb3IgZXhhbXBsZSwgd2hldGhlciByZWN0YW5nbGUgQSBpcyBncmVhdGVyIHRoYW5cbiAqIHJlY3RhbmdsZSBCIGRlcGVuZHMgb24gd2hldGhlciByZWN0YW5nbGUgQSBpbmNsdWRlcyByZWN0YW5nbGUgQiBhcyBkZWZpbmVkIGJ5XG4gKiB0aGUgbG9naWMgaW4gTWF0aEhlbHBlcnMuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc0dURSA9IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gIHJldHVybiBoLmRvSXNHVEUoLi4uY29lcmNlTFIoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpKTtcbn07XG5cbi8qKlxuICogTG9naWMgZm9yIG1hbmlwdWxhdGluZyBhbW91bnRzLlxuICpcbiAqIEFtb3VudHMgYXJlIHRoZSBjYW5vbmljYWwgZGVzY3JpcHRpb24gb2YgdHJhZGFibGUgZ29vZHMuIFRoZXkgYXJlIG1hbmlwdWxhdGVkXG4gKiBieSBpc3N1ZXJzIGFuZCBtaW50cywgYW5kIHJlcHJlc2VudCB0aGUgZ29vZHMgYW5kIGN1cnJlbmN5IGNhcnJpZWQgYnkgcHVyc2VzXG4gKiBhbmQgcGF5bWVudHMuIFRoZXkgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoaW5ncyBsaWtlIGN1cnJlbmN5LCBzdG9jaywgYW5kXG4gKiB0aGUgYWJzdHJhY3QgcmlnaHQgdG8gcGFydGljaXBhdGUgaW4gYSBwYXJ0aWN1bGFyIGV4Y2hhbmdlLlxuICovXG4gICAgICAgY29uc3QgQW1vdW50TWF0aCA9IHtcbiAgLyogVE9ETyB1c2Ugb3ZlcmxvYWRpbmcgdG8gaGFuZGxlIHdoZW4gQnJhbmQgaGFzIGFuIEFzc2V0S2luZCBhbmQgd2hlbiBpdCBkb2Vzbid0LiovXG4gIC8qIGEgQW1vdW50Rm9yVmFsdWUgdXRpbGl0eSBjb3VsZCBoZWxwIERSWSB0aG9zZSBjYXNlcy4qL1xuICAvKipcbiAqIE1ha2UgYW4gYW1vdW50IGZyb20gYSB2YWx1ZSBieSBhZGRpbmcgdGhlIGJyYW5kLlxuICpcbiAqIERvZXMgbm90IHZlcmlmeSB0aGF0IHRoZSBCcmFuZCdzIEFzc2V0S2luZCBtYXRjaGVzIHRoZSB2YWx1ZSdzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QnJhbmQ8YW55Pn0gQlxuICogQHRlbXBsYXRlIHtOYXRWYWx1ZSB8IENvcHlTZXQgfCBDb3B5QmFnIHwgU2V0VmFsdWV9IFZcbiAqIEBwYXJhbSB7Qn0gYnJhbmRcbiAqIEBwYXJhbSB7Vn0gYWxsZWdlZFZhbHVlXG4gKiBAcmV0dXJucyB7QiBleHRlbmRzIEJyYW5kPCduYXQnPlxuICogICAgID8gTmF0QW1vdW50XG4gKiAgICAgOiBWIGV4dGVuZHMgTmF0VmFsdWVcbiAqICAgICAgID8gTmF0QW1vdW50XG4gKiAgICAgICA6IFYgZXh0ZW5kcyBDb3B5U2V0XG4gKiAgICAgICAgID8gQ29weVNldEFtb3VudDxWWydwYXlsb2FkJ11bMF0+XG4gKiAgICAgICAgIDogViBleHRlbmRzIENvcHlCYWdcbiAqICAgICAgICAgICA/IENvcHlCYWdBbW91bnQ8VlsncGF5bG9hZCddWzBdWzBdPlxuICogICAgICAgICAgIDogViBleHRlbmRzIFNldFZhbHVlXG4gKiAgICAgICAgICAgICA/IFNldEFtb3VudDxWWzBdPlxuICogICAgICAgICAgICAgOiBuZXZlcn1cbiAqL1xuICBtYWtlOiAoYnJhbmQsIGFsbGVnZWRWYWx1ZSkgPT4ge1xuICAgIGFzc2VydFJlbW90YWJsZShicmFuZCwgJ2JyYW5kJyk7XG4gICAgY29uc3QgaCA9IGFzc2VydFZhbHVlR2V0SGVscGVycyhhbGxlZ2VkVmFsdWUpO1xuICAgIGNvbnN0IHZhbHVlID0gaC5kb0NvZXJjZShhbGxlZ2VkVmFsdWUpO1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gICAgcmV0dXJuIGhhcmRlbih7IGJyYW5kLCB2YWx1ZSB9KTtcbiAgfSxcbiAgLyoqXG4gKiBNYWtlIHN1cmUgdGhpcyBhbW91bnQgaXMgdmFsaWQgZW5vdWdoLCBhbmQgcmV0dXJuIGEgY29ycmVzcG9uZGluZyB2YWxpZFxuICogYW1vdW50IGlmIHNvLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBBXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHBhcmFtIHtBfSBhbGxlZ2VkQW1vdW50XG4gKiBAcmV0dXJucyB7QX1cbiAqL1xuICBjb2VyY2U6IChicmFuZCwgYWxsZWdlZEFtb3VudCkgPT4ge1xuICAgIGFzc2VydFJlbW90YWJsZShicmFuZCwgJ2JyYW5kJyk7XG4gICAgYXNzZXJ0UmVjb3JkKGFsbGVnZWRBbW91bnQsICdhbW91bnQnKTtcbiAgICBjb25zdCB7IGJyYW5kOiBhbGxlZ2VkQnJhbmQsIHZhbHVlOiBhbGxlZ2VkVmFsdWUgfSA9IGFsbGVnZWRBbW91bnQ7XG4gICAgYnJhbmQgPT09IGFsbGVnZWRCcmFuZCB8fFxuICAgICAgRmFpbGBUaGUgYnJhbmQgaW4gdGhlIGFsbGVnZWRBbW91bnQgJHthbGxlZ2VkQW1vdW50fSBpbiAnY29lcmNlJyBkaWRuJ3QgbWF0Y2ggdGhlIHNwZWNpZmllZCBicmFuZCAke2JyYW5kfS5gO1xuICAgIC8qIFdpbGwgdGhyb3cgb24gaW5hcHByb3ByaWF0ZSB2YWx1ZSovXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICByZXR1cm4gQW1vdW50TWF0aC5tYWtlKGJyYW5kLCBhbGxlZ2VkVmFsdWUpO1xuICB9LFxuICAvKipcbiAqIEV4dHJhY3QgYW5kIHJldHVybiB0aGUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge0F9IGFtb3VudFxuICogQHJldHVybnMge0FbJ3ZhbHVlJ119XG4gKi9cbiAgZ2V0VmFsdWU6IChicmFuZCwgYW1vdW50KSA9PiBBbW91bnRNYXRoLmNvZXJjZShicmFuZCwgYW1vdW50KS52YWx1ZSxcbiAgLyoqXG4gKiBSZXR1cm4gdGhlIGFtb3VudCByZXByZXNlbnRpbmcgYW4gZW1wdHkgYW1vdW50LiBUaGlzIGlzIHRoZSBpZGVudGl0eVxuICogZWxlbWVudCBmb3IgTWF0aEhlbHBlcnMuYWRkIGFuZCBNYXRIZWxwZXJzLnN1YnRyYWN0LlxuICpcbiAqIEB0eXBlIHt7XG4gKiAgIChicmFuZDogQnJhbmQpOiBBbW91bnQ8J25hdCc+O1xuICogICA8SyBleHRlbmRzIEFzc2V0S2luZD4oYnJhbmQ6IEJyYW5kPEs+LCBhc3NldEtpbmQ6IEspOiBBbW91bnQ8Sz47XG4gKiB9fVxuICovXG4gIG1ha2VFbXB0eTogKGJyYW5kLCBhc3NldEtpbmQgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoJ25hdCcpKSA9PiB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBhc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcbiAgICBjb25zdCB2YWx1ZSA9IGhlbHBlcnNbYXNzZXRLaW5kXS5kb01ha2VFbXB0eSgpO1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIG5hcnJvd2luZyBmcm9tIGZ1bmN0aW9uIG92ZXJsb2FkKi9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQsIHVzaW5nIGFub3RoZXIgYW1vdW50IGFzIHRoZVxuICogdGVtcGxhdGUgZm9yIHRoZSBicmFuZCBhbmQgYXNzZXRLaW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBBXG4gKiBAcGFyYW0ge0F9IGFtb3VudFxuICogQHJldHVybnMge0F9XG4gKi9cbiAgbWFrZUVtcHR5RnJvbUFtb3VudDogYW1vdW50ID0+IHtcbiAgICBhc3NlcnRSZWNvcmQoYW1vdW50LCAnYW1vdW50Jyk7XG4gICAgY29uc3QgeyBicmFuZCwgdmFsdWUgfSA9IGFtb3VudDtcbiAgICBjb25zdCBhc3NldEtpbmQgPSBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBkaWZmZXJlbnQgc3VidHlwZSovXG4gICAgcmV0dXJuIEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLCBhc3NldEtpbmQpO1xuICB9LFxuICAvKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBBbW91bnQgaXMgZW1wdHkuIE90aGVyd2lzZSBmYWxzZS5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kfSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBpc0VtcHR5OiAoYW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGFzc2VydFJlY29yZChhbW91bnQsICdhbW91bnQnKTtcbiAgICBjb25zdCB7IGJyYW5kOiBhbGxlZ2VkQnJhbmQsIHZhbHVlIH0gPSBhbW91bnQ7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGFsbGVnZWRCcmFuZCwgJ2JyYW5kJyk7XG4gICAgb3B0aW9uYWxCcmFuZENoZWNrKGFsbGVnZWRCcmFuZCwgYnJhbmQpO1xuICAgIGNvbnN0IGggPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnModmFsdWUpO1xuICAgIHJldHVybiBoLmRvSXNFbXB0eShoLmRvQ29lcmNlKHZhbHVlKSk7XG4gIH0sXG4gIGlzR1RFLFxuICAvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBlcXVhbHMgdGhlIHJpZ2h0QW1vdW50LiBXZSBhc3N1bWUgdGhhdCBpZlxuICogaXNHVEUgaXMgdHJ1ZSBpbiBib3RoIGRpcmVjdGlvbnMsIGlzRXF1YWwgaXMgYWxzbyB0cnVlXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QX0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBfSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgaXNFcXVhbDogKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IGggPSBjaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQpO1xuICAgIHJldHVybiBoLmRvSXNFcXVhbCguLi5jb2VyY2VMUihoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkpO1xuICB9LFxuICAvKipcbiAqIFJldHVybnMgYSBuZXcgYW1vdW50IHRoYXQgaXMgdGhlIHVuaW9uIG9mIGJvdGggbGVmdEFtb3VudCBhbmQgcmlnaHRBbW91bnQuXG4gKlxuICogRm9yIGZ1bmdpYmxlIGFtb3VudCB0aGlzIG1lYW5zIGFkZGluZyB0aGUgdmFsdWVzLiBGb3Igb3RoZXIga2luZHMgb2ZcbiAqIGFtb3VudCwgaXQgdXN1YWxseSBtZWFucyBpbmNsdWRpbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIGJvdGggbGVmdCBhbmRcbiAqIHJpZ2h0LlxuICpcbiAqIEB0eXBlIHt7XG4gKiAgIDxBIGV4dGVuZHMgQ29weUJhZywgQiBleHRlbmRzIENvcHlCYWc+KFxuICogICAgIGxlZnRBbW91bnQ6IENvcHlCYWdBbW91bnQ8QT4sXG4gKiAgICAgcmlnaHRBbW91bnQ6IENvcHlCYWdBbW91bnQ8Qj4sXG4gKiAgICAgYnJhbmQ/OiBCcmFuZCxcbiAqICAgKTogQ29weUJhZ0Ftb3VudDxBIHwgQj47XG4gKiAgIDxBIGV4dGVuZHMgQW1vdW50PihsZWZ0QW1vdW50OiBBLCByaWdodEFtb3VudDogQSwgYnJhbmQ/OiBCcmFuZCk6IEE7XG4gKiB9fVxuICovXG4gIGFkZDogKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IGggPSBjaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQpO1xuICAgIGNvbnN0IHZhbHVlID0gaC5kb0FkZCguLi5jb2VyY2VMUihoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkpO1xuICAgIHJldHVybiBoYXJkZW4oeyBicmFuZDogbGVmdEFtb3VudC5icmFuZCwgdmFsdWUgfSk7XG4gIH0sXG4gIC8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgbGVmdEFtb3VudCBtaW51cyB0aGUgcmlnaHRBbW91bnQgKGkuZS5cbiAqIGV2ZXJ5dGhpbmcgaW4gdGhlIGxlZnRBbW91bnQgdGhhdCBpcyBub3QgaW4gdGhlIHJpZ2h0QW1vdW50KS4gSWYgbGVmdEFtb3VudFxuICogZG9lc24ndCBpbmNsdWRlIHJpZ2h0QW1vdW50IChzdWJ0cmFjdGlvbiByZXN1bHRzIGluIGEgbmVnYXRpdmUpLCB0aHJvdyBhblxuICogZXJyb3IuIEJlY2F1c2UgdGhlIGxlZnQgYW1vdW50IG11c3QgaW5jbHVkZSB0aGUgcmlnaHQgYW1vdW50LCB0aGlzIGlzIE5PVFxuICogZXF1aXZhbGVudCB0byBzZXQgc3VidHJhY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IExcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBSXG4gKiBAcGFyYW0ge0x9IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7Un0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtMIGV4dGVuZHMgUiA/IEwgOiBuZXZlcn1cbiAqL1xuICBzdWJ0cmFjdDogKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IGggPSBjaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQpO1xuICAgIGNvbnN0IHZhbHVlID0gaC5kb1N1YnRyYWN0KC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBkaWZmZXJlbnQgc3VidHlwZSovXG4gICAgcmV0dXJuIGhhcmRlbih7IGJyYW5kOiBsZWZ0QW1vdW50LmJyYW5kLCB2YWx1ZSB9KTtcbiAgfSxcbiAgLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW4gdmFsdWUgYmV0d2VlbiB4IGFuZCB5IHVzaW5nIGlzR1RFXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QX0geFxuICogQHBhcmFtIHtBfSB5XG4gKiBAcGFyYW0ge0JyYW5kfSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QX1cbiAqL1xuICBtaW46ICh4LCB5LCBicmFuZCA9IHVuZGVmaW5lZCkgPT5cbiAgICBpc0dURSh4LCB5LCBicmFuZClcbiAgICAgID8geVxuICAgICAgOiBpc0dURSh5LCB4LCBicmFuZClcbiAgICAgICAgPyB4XG4gICAgICAgIDogRmFpbGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgLFxuICAvKipcbiAqIFJldHVybnMgdGhlIG1heCB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtBfSB4XG4gKiBAcGFyYW0ge0F9IHlcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtBfVxuICovXG4gIG1heDogKHgsIHksIGJyYW5kID0gdW5kZWZpbmVkKSA9PlxuICAgIGlzR1RFKHgsIHksIGJyYW5kKVxuICAgICAgPyB4XG4gICAgICA6IGlzR1RFKHksIHgpXG4gICAgICAgID8geVxuICAgICAgICA6IEZhaWxgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYCxcbn07JGjNj19vbmNlLkFtb3VudE1hdGgoQW1vdW50TWF0aCk7XG5oYXJkZW4oQW1vdW50TWF0aCk7XG5cbi8qKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50ICovXG4gICAgICAgY29uc3QgZ2V0QXNzZXRLaW5kID0gYW1vdW50ID0+IHtcbiAgYXNzZXJ0UmVjb3JkKGFtb3VudCwgJ2Ftb3VudCcpO1xuICBjb25zdCB7IHZhbHVlIH0gPSBhbW91bnQ7XG4gIHJldHVybiBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG59OyRozY9fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQXNzZXRLaW5kIjpbIkFzc2V0S2luZCJdLCJhc3NlcnRBc3NldEtpbmQiOlsiYXNzZXJ0QXNzZXRLaW5kIl0sImFzc2VydFZhbHVlR2V0SGVscGVycyI6WyJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiXSwiQW1vdW50TWF0aCI6WyJBbW91bnRNYXRoIl0sImdldEFzc2V0S2luZCI6WyJnZXRBc3NldEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAX+m9XnoFAAB6BQAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRTdG9yZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiXSwiZXhwb3J0cyI6WyJtYWtlQW1vdW50U3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRNYXRoOyRozY9faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dXSk7XG5cbi8qKiBAaW1wb3J0IHtBbW91bnQsIEFzc2V0S2luZH0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gQW1vdW50U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSBnZXRBbW91bnRcbiAqIEBwcm9wZXJ0eSB7KGRlbHRhOiBBbW91bnQ8Sz4pID0+IHZvaWR9IGluY3JlbWVudFxuICogQHByb3BlcnR5IHsoZGVsdGE6IEFtb3VudDxLPikgPT4gYm9vbGVhbn0gZGVjcmVtZW50XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtvYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJucyB7QW1vdW50U3RvcmU8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQW1vdW50U3RvcmUgPSAoc3RhdGUsIGtleSkgPT4ge1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBnZXRBbW91bnQ6ICgpID0+IHN0YXRlW2tleV0sXG4gICAgaW5jcmVtZW50OiBkZWx0YSA9PiB7XG4gICAgICBzdGF0ZVtrZXldID0gQW1vdW50TWF0aC5hZGQoc3RhdGVba2V5XSwgZGVsdGEpO1xuICAgIH0sXG4gICAgZGVjcmVtZW50OiBkZWx0YSA9PiB7XG4gICAgICBpZiAoQW1vdW50TWF0aC5pc0dURShzdGF0ZVtrZXldLCBkZWx0YSkpIHtcbiAgICAgICAgc3RhdGVba2V5XSA9IEFtb3VudE1hdGguc3VidHJhY3Qoc3RhdGVba2V5XSwgZGVsdGEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VBbW91bnRTdG9yZShtYWtlQW1vdW50U3RvcmUpO1xuaGFyZGVuKG1ha2VBbW91bnRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQW1vdW50U3RvcmUiOlsibWFrZUFtb3VudFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEO9e9l0BgAAdAYAACcAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvZGlzcGxheUluZm8uanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbImNvZXJjZURpc3BsYXlJbmZvIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxtdXN0TWF0Y2gsRGlzcGxheUluZm9TaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkRpc3BsYXlJbmZvU2hhcGVcIixbJGjNj19hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtBZGRpdGlvbmFsRGlzcGxheUluZm8sIEFzc2V0S2luZCwgRGlzcGxheUluZm99IGZyb20gJy4vdHlwZXMuanMnICovXG5cbi8qKlxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGFsbGVnZWREaXNwbGF5SW5mb1xuICogQHBhcmFtIHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHJldHVybnMge0Rpc3BsYXlJbmZvfVxuICovXG4gICAgICAgY29uc3QgY29lcmNlRGlzcGxheUluZm8gPSAoYWxsZWdlZERpc3BsYXlJbmZvLCBhc3NldEtpbmQpID0+IHtcbiAgbXVzdE1hdGNoKGFsbGVnZWREaXNwbGF5SW5mbywgRGlzcGxheUluZm9TaGFwZSwgJ2Rpc3BsYXlJbmZvJyk7XG5cbiAgaWYgKGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQgPT09IGFzc2V0S2luZCB8fFxuICAgICAgRmFpbGBkaXNwbGF5SW5mby5hc3NldEtpbmQgd2FzIHByZXNlbnQgKCR7YWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZH0pIGFuZCBkaWQgbm90IG1hdGNoIHRoZSBhc3NldEtpbmQgYXJndW1lbnQgKCR7YXNzZXRLaW5kfSlgO1xuICB9XG4gIGNvbnN0IGRpc3BsYXlJbmZvID0gaGFyZGVuKHsgLi4uYWxsZWdlZERpc3BsYXlJbmZvLCBhc3NldEtpbmQgfSk7XG5cbiAgaWYgKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMpIHx8XG4gICAgICBGYWlsYGRlY2ltYWxQbGFjZXMgJHtkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzfSBpcyBub3QgYSBzYWZlIGludGVnZXJgO1xuICB9XG5cbiAgcmV0dXJuIGRpc3BsYXlJbmZvO1xufTskaM2PX29uY2UuY29lcmNlRGlzcGxheUluZm8oY29lcmNlRGlzcGxheUluZm8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29lcmNlRGlzcGxheUluZm8iOlsiY29lcmNlRGlzcGxheUluZm8iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA819NA00CAABNAgAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtdXSxbXCIuL2lzc3VlcktpdC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGg+kHPHPAAAxzwAACUAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaXNzdWVyS2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b25lL2R1cmFibGUuanMiLCIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIl0sImV4cG9ydHMiOlsiaGFzSXNzdWVyIiwibWFrZUR1cmFibGVJc3N1ZXJLaXQiLCJtYWtlSXNzdWVyS2l0IiwicHJlcGFyZUlzc3VlcktpdCIsInVwZ3JhZGVJc3N1ZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQsRmFpbCxhc3NlcnRQYXR0ZXJuLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxtYWtlRHVyYWJsZVpvbmUsQXNzZXRLaW5kLGFzc2VydEFzc2V0S2luZCxjb2VyY2VEaXNwbGF5SW5mbyxwcmVwYXJlUGF5bWVudExlZGdlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0UGF0dGVyblwiLFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvbmUvZHVyYWJsZS5qc1wiLCBbW1wibWFrZUR1cmFibGVab25lXCIsWyRozY9fYSA9PiAobWFrZUR1cmFibGVab25lID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBc3NldEtpbmRcIixbJGjNj19hID0+IChBc3NldEtpbmQgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0QXNzZXRLaW5kXCIsWyRozY9fYSA9PiAoYXNzZXJ0QXNzZXRLaW5kID0gJGjNj19hKV1dXV0sW1wiLi9kaXNwbGF5SW5mby5qc1wiLCBbW1wiY29lcmNlRGlzcGxheUluZm9cIixbJGjNj19hID0+IChjb2VyY2VEaXNwbGF5SW5mbyA9ICRozY9fYSldXV1dLFtcIi4vcGF5bWVudExlZGdlci5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRMZWRnZXJcIixbJGjNj19hID0+IChwcmVwYXJlUGF5bWVudExlZGdlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7S2V5LCBQYXR0ZXJufSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKiBAaW1wb3J0IHtTaHV0ZG93bldpdGhGYWlsdXJlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LXZhdCc7XG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm59IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy92YXQtZGF0YSc7XG4gKiBAaW1wb3J0IHtBZGRpdGlvbmFsRGlzcGxheUluZm8sIFJlY292ZXJ5U2V0c09wdGlvbiwgSXNzdWVyS2l0LCBQYXltZW50TGVkZ2VyfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcGVydHkge0t9IGFzc2V0S2luZFxuICogQHByb3BlcnR5IHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGRpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge1BhdHRlcm59IGVsZW1lbnRTaGFwZVxuICovXG5cbi8qKlxuICogVXNlZCBfb25seV8gaW50ZXJuYWxseSwgdG8gbWFrZSBhIG5ldyBpc3N1ZXJLaXQgb3IgdG8gcmV2aXZlIGFuIG9sZCBvbmUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7SXNzdWVyUmVjb3JkPEs+fSBpc3N1ZXJSZWNvcmRcbiAqIEBwYXJhbSB7Wm9uZX0gaXNzdWVyWm9uZVxuICogQHBhcmFtIHtSZWNvdmVyeVNldHNPcHRpb259IHJlY292ZXJ5U2V0c1N0YXRlIE9taXR0ZWQgZnJvbSBpc3N1ZXJSZWNvcmRcbiAqICAgYmVjYXVzZSBpdCB3YXMgYWRkZWQgaW4gYW4gdXBncmFkZS5cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzIGluXG4gKiAgIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogICBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqICAgcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lIGxhcmdlclxuICogICB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd24gYmVmb3JlXG4gKiAgIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLiBTZWVcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCBzZXR1cElzc3VlcktpdCA9IChcbiAgeyBuYW1lLCBhc3NldEtpbmQsIGRpc3BsYXlJbmZvLCBlbGVtZW50U2hhcGUgfSxcbiAgaXNzdWVyWm9uZSxcbiAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gIGFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuXG4gIC8qIEFkZCBhc3NldEtpbmQgdG8gZGlzcGxheUluZm8sIG9yIG92ZXJyaWRlIGlmIHByZXNlbnQqL1xuICBjb25zdCBjbGVhbkRpc3BsYXlJbmZvID0gY29lcmNlRGlzcGxheUluZm8oZGlzcGxheUluZm8sIGFzc2V0S2luZCk7XG4gIGlmIChvcHRTaHV0ZG93bldpdGhGYWlsdXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKG9wdFNodXRkb3duV2l0aEZhaWx1cmUsICdmdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKGVsZW1lbnRTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihlbGVtZW50U2hhcGUpO1xuICB9XG5cbiAgLyogQXR0ZW51YXRlIHRoZSBwb3dlcmZ1bCBhdXRob3JpdHkgdG8gbWludCBhbmQgY2hhbmdlIGJhbGFuY2VzKi9cbiAgLyoqIEB0eXBlIHtQYXltZW50TGVkZ2VyPEs+fSAqL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUqL1xuICBjb25zdCB7IGlzc3VlciwgbWludCwgYnJhbmQsIG1pbnRSZWNvdmVyeVB1cnNlIH0gPSBwcmVwYXJlUGF5bWVudExlZGdlcihcbiAgICBpc3N1ZXJab25lLFxuICAgIG5hbWUsXG4gICAgYXNzZXRLaW5kLFxuICAgIGNsZWFuRGlzcGxheUluZm8sXG4gICAgZWxlbWVudFNoYXBlLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgYnJhbmQsXG4gICAgaXNzdWVyLFxuICAgIG1pbnQsXG4gICAgbWludFJlY292ZXJ5UHVyc2UsXG4gICAgZGlzcGxheUluZm86IGNsZWFuRGlzcGxheUluZm8sXG4gIH0pO1xufTtcbmhhcmRlbihzZXR1cElzc3VlcktpdCk7XG5cbi8qKiBUaGUga2V5IGF0IHdoaWNoIHRoZSBpc3N1ZXIgcmVjb3JkIGlzIHN0b3JlZC4gKi9cbmNvbnN0IElOU1RBTkNFX0tFWSA9ICdpc3N1ZXInO1xuLyoqXG4gKiBUaGUga2V5IGF0IHdoaWNoIHRoZSBpc3N1ZXJLaXQncyBgUmVjb3ZlcnlTZXRzT3B0aW9uYCBzdGF0ZSBpcyBzdG9yZWQuXG4gKiBJbnRyb2R1Y2VkIGJ5IGFuIHVwZ3JhZGUsIHNvIG1heSBiZSBhYnNlbnQgb24gYSBwcmVkZWNlc3NvciBpbmNhcm5hdGlvbi4gU2VlXG4gKiBgUmVjb3ZlcnlTZXRzT3B0aW9uYCBmb3IgZGVmYXVsdGluZyBiZWhhdmlvci5cbiAqL1xuY29uc3QgUkVDT1ZFUllfU0VUU19TVEFURSA9ICdyZWNvdmVyeVNldHNTdGF0ZSc7XG5cbi8qKlxuICogVXNlZCBfb25seV8gdG8gdXBncmFkZSBhIHByZWRlY2Vzc29yIGlzc3VlcktpdC4gVXNlIGBtYWtlRHVyYWJsZUlzc3VlcktpdGAgdG9cbiAqIG1ha2UgYSBuZXcgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzIGluXG4gKiAgIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogICBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqICAgcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lIGxhcmdlclxuICogICB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd24gYmVmb3JlXG4gKiAgIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLiBTZWVcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge1JlY292ZXJ5U2V0c09wdGlvbn0gW3JlY292ZXJ5U2V0c09wdGlvbl0gQWRkZWQgaW4gdXBncmFkZSwgc28gbGFzdFxuICogICBhbmQgb3B0aW9uYWwuIFNlZSBgUmVjb3ZlcnlTZXRzT3B0aW9uYCBmb3IgZGVmYXVsdGluZyBiZWhhdmlvci5cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbiAgICAgICBjb25zdCB1cGdyYWRlSXNzdWVyS2l0ID0gKFxuICBpc3N1ZXJCYWdnYWdlLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuICByZWNvdmVyeVNldHNPcHRpb24gPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgY29uc3QgaXNzdWVyUmVjb3JkID0gaXNzdWVyQmFnZ2FnZS5nZXQoSU5TVEFOQ0VfS0VZKTtcbiAgY29uc3QgaXNzdWVyWm9uZSA9IG1ha2VEdXJhYmxlWm9uZShpc3N1ZXJCYWdnYWdlKTtcbiAgY29uc3Qgb2xkUmVjb3ZlcnlTZXRzU3RhdGUgPSBpc3N1ZXJCYWdnYWdlLmhhcyhSRUNPVkVSWV9TRVRTX1NUQVRFKVxuICAgID8gaXNzdWVyQmFnZ2FnZS5nZXQoUkVDT1ZFUllfU0VUU19TVEFURSlcbiAgICA6ICdoYXNSZWNvdmVyeVNldHMnO1xuICBpZiAoXG4gICAgb2xkUmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdub1JlY292ZXJ5U2V0cycgJiZcbiAgICByZWNvdmVyeVNldHNPcHRpb24gPT09ICdoYXNSZWNvdmVyeVNldHMnXG4gICkge1xuICAgIEZhaWxgQ2Fubm90ICh5ZXQ/KSB1cGdyYWRlIGZyb20gJ25vUmVjb3ZlcnlTZXRzJyB0byAnaGFzUmVjb3ZlcnlTZXRzJ2A7XG4gIH1cbiAgLyogRXh0YW50IHNldHMgYXJlIG5vdCBjdXJyZW50bHkgZGVsZXRlZC4gSWYgdGhlIG5ldyBvcHRpb24gaXMqL1xuICAvKiAnbm9SZWNvdmVyeVNldHMnLCB0aGV5IHdvbid0IGJlIHVzZWQgYnV0IGV4dGFudCBvbmVzIHdpbGwgcmVtYWluLiBGdXR1cmUqL1xuICAvKiB1cGdyYWRlcyBtYXkgbWFrZSBpdCBwb3NzaWJsZSB0byBkZWxldGUgZWxlbWVudHMgZnJvbSB0aGVtLiovXG4gIGNvbnN0IHJlY292ZXJ5U2V0c1N0YXRlID0gcmVjb3ZlcnlTZXRzT3B0aW9uIHx8IG9sZFJlY292ZXJ5U2V0c1N0YXRlO1xuICByZXR1cm4gc2V0dXBJc3N1ZXJLaXQoXG4gICAgaXNzdWVyUmVjb3JkLFxuICAgIGlzc3VlclpvbmUsXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgKTtcbn07JGjNj19vbmNlLnVwZ3JhZGVJc3N1ZXJLaXQodXBncmFkZUlzc3VlcktpdCk7XG5oYXJkZW4odXBncmFkZUlzc3VlcktpdCk7XG5cbi8qKlxuICogRG9lcyBiYWdnYWdlIGFscmVhZHkgaGF2ZSBhbiBpc3N1ZXJLaXQ/XG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKi9cbiAgICAgICBjb25zdCBoYXNJc3N1ZXIgPSBiYWdnYWdlID0+IGJhZ2dhZ2UuaGFzKElOU1RBTkNFX0tFWSk7XG5cbi8qKlxuICogYGVsZW1lbnRTaGFwZWAsIG1heSBvbmx5IGJlIHByZXNlbnQgZm9yIGNvbGxlY3Rpb24tc3R5bGUgYW1vdW50cy4gSWYgcHJlc2VudCxcbiAqIGl0IGlzIGEgYFBhdHRlcm5gIHRoYXQgZXZlcnkgZWxlbWVudCBvZiB0aGlzIGlzc3VlcktpdHMncyBhbW91bnRzIG11c3RcbiAqIHNhdGlzZnkuIEZvciBleGFtcGxlLCB0aGUgWm9lIEludml0YXRpb24gaXNzdWVyS2l0IHVzZXMgYW4gZWxlbWVudFNoYXBlXG4gKiBkZXNjcmliaW5nIHRoZSBpbnZpdGF0aW9uIGRldGFpbHMgZm9yIGFuIGluZGl2aWR1YWwgaW52aXRhdGlvbi4gQW4gaW52aXRhdGlvblxuICogcHVyc2Ugb3IgcGF5bWVudCBoYXMgYW4gYW1vdW50IHRoYXQgY2FuIG9ubHkgYmUgYSBzZXQgb2YgdGhlc2UuIChUaG91Z2hcbiAqIHR5cGljYWxseSwgdGhlIGFtb3VudCBvZiBhbiBpbnZpdGF0aW9uIHBheW1lbnQgaXMgYSBzaW5nbGV0b24gc2V0LiBTdWNoIGFcbiAqIHBheW1lbnQgaXMgb2Z0ZW4gcmVmZXJyZWQgdG8gaW4gdGhlIHNpbmd1bGFyIGFzIFwiYW4gaW52aXRhdGlvblwiLilcbiAqXG4gKiBgcmVjb3ZlcnlTZXRzT3B0aW9uYCBhZGRlZCBpbiB1cGdyYWRlLiBOb3RlIHRoYXQgYElzc3Vlck9wdGlvbnNSZWNvcmRgIGlzXG4gKiBuZXZlciBzdG9yZWQsIHNvIHdlIG5ldmVyIG5lZWQgdG8gd29ycnkgYWJvdXQgaW5oZXJpdGluZyBvbmUgZnJvbSBhXG4gKiBwcmVkZWNlc3NvciBwcmVkYXRpbmcgdGhlIGludHJvZHVjdGlvbiBvZiByZWNvdmVyeSBzZXRzLiBTZWVcbiAqIGBSZWNvdmVyeVNldHNPcHRpb25gIGZvciBkZWZhdWx0aW5nIGJlaGF2aW9yLlxuICpcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPHtcbiAqICAgZWxlbWVudFNoYXBlOiBQYXR0ZXJuO1xuICogICByZWNvdmVyeVNldHNPcHRpb246IFJlY292ZXJ5U2V0c09wdGlvbjtcbiAqIH0+fSBJc3N1ZXJPcHRpb25zUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBVc2VkIF9vbmx5XyB0byBtYWtlIGEgX25ld18gZHVyYWJsZSBpc3N1ZXIsIGkuZS4sIHRoZSBpbml0aWFsIGluY2FybmF0aW9uIG9mXG4gKiB0aGF0IGlzc3Vlci5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gSyBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0XG4gKiAgIGRlc2NyaXB0aW9ucy4gVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogICBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS4gRm9yXG4gKiAgIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dCBpdCBpc1xuICogICBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nIHRvIHRoYXQgaXNzdWVyXG4gKiAgIGFuZCBicmFuZC5cbiAqXG4gKiAgIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzIGZyb20gdGhlXG4gKiAgIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlIGRlZmF1bHQsIGlzIHVzZWQgZm9yXG4gKiAgIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb24gdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmRdXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvXVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovJGjNj19vbmNlLmhhc0lzc3VlcihoYXNJc3N1ZXIpO1xuICAgICAgIGNvbnN0IG1ha2VEdXJhYmxlSXNzdWVyS2l0ID0gKFxuICBpc3N1ZXJCYWdnYWdlLFxuICBuYW1lLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIEsgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuICBhc3NldEtpbmQgPSBBc3NldEtpbmQuTkFULFxuICBkaXNwbGF5SW5mbyA9IGhhcmRlbih7fSksXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIHsgZWxlbWVudFNoYXBlID0gdW5kZWZpbmVkLCByZWNvdmVyeVNldHNPcHRpb24gPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGlzc3VlckRhdGEgPSBoYXJkZW4oe1xuICAgIG5hbWUsXG4gICAgYXNzZXRLaW5kLFxuICAgIGRpc3BsYXlJbmZvLFxuICAgIGVsZW1lbnRTaGFwZSxcbiAgfSk7XG4gIGlzc3VlckJhZ2dhZ2UuaW5pdChJTlNUQU5DRV9LRVksIGlzc3VlckRhdGEpO1xuICBjb25zdCBpc3N1ZXJab25lID0gbWFrZUR1cmFibGVab25lKGlzc3VlckJhZ2dhZ2UpO1xuICBjb25zdCByZWNvdmVyeVNldHNTdGF0ZSA9IHJlY292ZXJ5U2V0c09wdGlvbiB8fCAnaGFzUmVjb3ZlcnlTZXRzJztcbiAgaXNzdWVyQmFnZ2FnZS5pbml0KFJFQ09WRVJZX1NFVFNfU1RBVEUsIHJlY292ZXJ5U2V0c1N0YXRlKTtcbiAgcmV0dXJuIHNldHVwSXNzdWVyS2l0KFxuICAgIGlzc3VlckRhdGEsXG4gICAgaXNzdWVyWm9uZSxcbiAgICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICApO1xufTskaM2PX29uY2UubWFrZUR1cmFibGVJc3N1ZXJLaXQobWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBVc2VkIHRvIGVpdGhlciByZXZpdmUgYSBwcmVkZWNlc3NvciBpc3N1ZXJLaXQsIG9yIHRvIG1ha2UgYSBuZXcgZHVyYWJsZSBvbmVcbiAqIGlmIGl0IGlzIGFic2VudCwgYW5kIHRvIHBsYWNlIGl0IGluIGJhZ2dhZ2UgZm9yIHRoZSBuZXh0IHN1Y2Nlc3Nvci5cbiAqXG4gKiBAdGVtcGxhdGUge0lzc3Vlck9wdGlvbnNSZWNvcmR9IE9cbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXRcbiAqICAgZGVzY3JpcHRpb25zLiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiAgIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLiBGb3JcbiAqICAgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0IGl0IGlzXG4gKiAgIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmcgdG8gdGhhdCBpc3N1ZXJcbiAqICAgYW5kIGJyYW5kLlxuICpcbiAqICAgVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnMgZnJvbSB0aGVcbiAqICAgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGUgZGVmYXVsdCwgaXMgdXNlZCBmb3JcbiAqICAgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gW2Fzc2V0S2luZF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm9dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtPfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtPWydlbGVtZW50U2hhcGUnXSBleHRlbmRzIFR5cGVkUGF0dGVybjxpbmZlciBUIGV4dGVuZHMgS2V5PlxuICogICAgID8gSXNzdWVyS2l0PEssIFQ+XG4gKiAgICAgOiBJc3N1ZXJLaXQ8Sz59XG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlSXNzdWVyS2l0ID0gKFxuICBpc3N1ZXJCYWdnYWdlLFxuICBuYW1lLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIEsgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuICBhc3NldEtpbmQgPSBBc3NldEtpbmQuTkFULFxuICBkaXNwbGF5SW5mbyA9IGhhcmRlbih7fSksXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgaGF2ZSBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIElzc3Vlck9wdGlvbnNSZWNvcmQqL1xuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgaWYgKGhhc0lzc3Vlcihpc3N1ZXJCYWdnYWdlKSkge1xuICAgIGNvbnN0IHsgZWxlbWVudFNoYXBlOiBfID0gdW5kZWZpbmVkLCByZWNvdmVyeVNldHNPcHRpb24gPSB1bmRlZmluZWQgfSA9XG4gICAgICBvcHRpb25zO1xuICAgIGNvbnN0IGlzc3VlcktpdCA9IHVwZ3JhZGVJc3N1ZXJLaXQoXG4gICAgICBpc3N1ZXJCYWdnYWdlLFxuICAgICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgICAgIHJlY292ZXJ5U2V0c09wdGlvbixcbiAgICApO1xuXG4gICAgLyogVE9ETyBjaGVjayBjb25zaXN0ZW5jeSB3aXRoIG5hbWUsIGFzc2V0S2luZCwgZGlzcGxheUluZm8sIGVsZW1lbnRTaGFwZS4qL1xuICAgIC8qIENvbnNpc3RlbmN5IGVpdGhlciBtZWFucyB0aGF0IHRoZXNlIGFyZSB0aGUgc2FtZSwgb3IgdGhhdCB0aGV5IGRpZmZlciovXG4gICAgLyogaW4gYSBkaXJlY3Rpb24gd2UgYXJlIHByZXBhcmVkIHRvIHVwZ3JhZGUuIE5vdGUgdGhhdCBpdCBpcyB0aGUqL1xuICAgIC8qIHJlc3BvbnNpYmlsaXR5IG9mIGB1cGdyYWRlSXNzdWVyS2l0YCB0byBjaGVjayBjb25zaXN0ZW5jeSBvZiovXG4gICAgLyogYHJlY292ZXJ5U2V0c09wdGlvbmAsIHNvIGNvbnRpbnVlIHRvIG5vdCBkbyB0aGF0IGhlcmUuKi9cblxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgVHlwZSBwYXJhbWV0ZXIgY29uZnVzaW9uLiovXG4gICAgcmV0dXJuIGlzc3VlcktpdDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpc3N1ZXJLaXQgPSBtYWtlRHVyYWJsZUlzc3VlcktpdChcbiAgICAgIGlzc3VlckJhZ2dhZ2UsXG4gICAgICBuYW1lLFxuICAgICAgYXNzZXRLaW5kLFxuICAgICAgZGlzcGxheUluZm8sXG4gICAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCB0byB0aGUgdHlwZSBwYXJhbWV0ZXIqL1xuICAgIHJldHVybiBpc3N1ZXJLaXQ7XG4gIH1cbn07JGjNj19vbmNlLnByZXBhcmVJc3N1ZXJLaXQocHJlcGFyZUlzc3VlcktpdCk7XG5oYXJkZW4ocHJlcGFyZUlzc3VlcktpdCk7XG5cbi8qKlxuICogVXNlZCBfb25seV8gdG8gbWFrZSBhIG5ldyBpc3N1ZXJLaXQgdGhhdCBpcyBlZmZlY3RpdmVseSBub24tZHVyYWJsZS4gVGhpcyBpc1xuICogY3VycmVudGx5IGRvbmUgYnkgbWFraW5nIGEgZHVyYWJsZSBvbmUgaW4gYSBiYWdnYWdlIG5vdCByZWFjaGFibGUgZnJvbVxuICogYW55d2hlcmUuIFRPRE8gT25jZSByZWJ1aWx0IG9uIHpvbmVzLCB0aGlzIHNob3VsZCBpbnN0ZWFkIGp1c3QgYnVpbGQgb24gdGhlXG4gKiB2aXJ0dWFsIHpvbmUuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC83MTE2XG4gKlxuICogQ3VycmVudGx5IHVzZWQgZm9yIHRlc3Rpbmcgb25seS4gU2hvdWxkIHByb2JhYmx5IGNvbnRpbnVlIHRvIGJlIHVzZWQgZm9yXG4gKiB0ZXN0aW5nIG9ubHkuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPSduYXQnXVxuICogQHRlbXBsYXRlIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBbTz17fV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXRcbiAqICAgZGVzY3JpcHRpb25zLiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiAgIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLiBGb3JcbiAqICAgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0IGl0IGlzXG4gKiAgIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmcgdG8gdGhhdCBpc3N1ZXJcbiAqICAgYW5kIGJyYW5kLlxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kXSBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpY1xuICogICBtYXRoSGVscGVycyBmcm9tIHRoZSBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZVxuICogICBkZWZhdWx0LCBpcyB1c2VkIGZvciBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvXSBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uXG4gKiAgIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7T30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7T1snZWxlbWVudFNoYXBlJ10gZXh0ZW5kcyBUeXBlZFBhdHRlcm48aW5mZXIgVCBleHRlbmRzIEtleT5cbiAqICAgICA/IElzc3VlcktpdDxLLCBUPlxuICogICAgIDogSXNzdWVyS2l0PEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUlzc3VlcktpdCA9IChcbiAgbmFtZSxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbiAgYXNzZXRLaW5kID0gQXNzZXRLaW5kLk5BVCxcbiAgZGlzcGxheUluZm8gPSBoYXJkZW4oe30pLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIE8gY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSovXG4gIHsgZWxlbWVudFNoYXBlID0gdW5kZWZpbmVkLCByZWNvdmVyeVNldHNPcHRpb24gPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PlxuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICBtYWtlRHVyYWJsZUlzc3VlcktpdChcbiAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ2Ryb3BwZWQgaXNzdWVyIGtpdCcsIHsgZHVyYWJsZTogdHJ1ZSB9KSxcbiAgICBuYW1lLFxuICAgIGFzc2V0S2luZCxcbiAgICBkaXNwbGF5SW5mbyxcbiAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICAgIHsgZWxlbWVudFNoYXBlLCByZWNvdmVyeVNldHNPcHRpb24gfSxcbiAgKTskaM2PX29uY2UubWFrZUlzc3VlcktpdChtYWtlSXNzdWVyS2l0KTtcbmhhcmRlbihtYWtlSXNzdWVyS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InVwZ3JhZGVJc3N1ZXJLaXQiOlsidXBncmFkZUlzc3VlcktpdCJdLCJoYXNJc3N1ZXIiOlsiaGFzSXNzdWVyIl0sIm1ha2VEdXJhYmxlSXNzdWVyS2l0IjpbIm1ha2VEdXJhYmxlSXNzdWVyS2l0Il0sInByZXBhcmVJc3N1ZXJLaXQiOlsicHJlcGFyZUlzc3VlcktpdCJdLCJtYWtlSXNzdWVyS2l0IjpbIm1ha2VJc3N1ZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVOfcJRMGAAATBgAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGtleUVRLG1ha2VDb3B5QmFnLG11c3RNYXRjaCxNLGdldENvcHlCYWdFbnRyaWVzLGJhZ0lzU3VwZXJiYWcsYmFnVW5pb24sYmFnRGlzam9pbnRTdWJ0cmFjdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlCYWdcIixbJGjNj19hID0+IChtYWtlQ29weUJhZyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIixbJGjNj19hID0+IChnZXRDb3B5QmFnRW50cmllcyA9ICRozY9fYSldXSxbXCJiYWdJc1N1cGVyYmFnXCIsWyRozY9fYSA9PiAoYmFnSXNTdXBlcmJhZyA9ICRozY9fYSldXSxbXCJiYWdVbmlvblwiLFskaM2PX2EgPT4gKGJhZ1VuaW9uID0gJGjNj19hKV1dLFtcImJhZ0Rpc2pvaW50U3VidHJhY3RcIixbJGjNj19hID0+IChiYWdEaXNqb2ludFN1YnRyYWN0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7TWF0aEhlbHBlcnN9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7Q29weUJhZ30gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICovXG5cbi8qKiBAdHlwZSB7Q29weUJhZ30gKi9cbmNvbnN0IGVtcHR5ID0gbWFrZUNvcHlCYWcoW10pO1xuXG4vKiogQHR5cGUge01hdGhIZWxwZXJzPENvcHlCYWc+fSAqL1xuICAgICAgIGNvbnN0IGNvcHlCYWdNYXRoSGVscGVycyA9IGhhcmRlbih7XG4gIGRvQ29lcmNlOiBiYWcgPT4ge1xuICAgIG11c3RNYXRjaChiYWcsIE0uYmFnKCksICdiYWcgb2YgYW1vdW50Jyk7XG4gICAgcmV0dXJuIGJhZztcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IGJhZyA9PiBnZXRDb3B5QmFnRW50cmllcyhiYWcpLmxlbmd0aCA9PT0gMCxcbiAgZG9Jc0dURTogYmFnSXNTdXBlcmJhZyxcbiAgZG9Jc0VxdWFsOiBrZXlFUSxcbiAgZG9BZGQ6IGJhZ1VuaW9uLFxuICBkb1N1YnRyYWN0OiBiYWdEaXNqb2ludFN1YnRyYWN0LFxufSk7JGjNj19vbmNlLmNvcHlCYWdNYXRoSGVscGVycyhjb3B5QmFnTWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29weUJhZ01hdGhIZWxwZXJzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABaHe9JJgYAACYGAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weVNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQga2V5RVEsbWFrZUNvcHlTZXQsbXVzdE1hdGNoLE0sZ2V0Q29weVNldEtleXMsc2V0SXNTdXBlcnNldCxzZXREaXNqb2ludFVuaW9uLHNldERpc2pvaW50U3VidHJhY3Q7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImdldENvcHlTZXRLZXlzXCIsWyRozY9fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaM2PX2EpXV0sW1wic2V0SXNTdXBlcnNldFwiLFskaM2PX2EgPT4gKHNldElzU3VwZXJzZXQgPSAkaM2PX2EpXV0sW1wic2V0RGlzam9pbnRVbmlvblwiLFskaM2PX2EgPT4gKHNldERpc2pvaW50VW5pb24gPSAkaM2PX2EpXV0sW1wic2V0RGlzam9pbnRTdWJ0cmFjdFwiLFskaM2PX2EgPT4gKHNldERpc2pvaW50U3VidHJhY3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtNYXRoSGVscGVyc30gZnJvbSAnLi4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtDb3B5U2V0fSBmcm9tICdAZW5kby9wYXR0ZXJucydcbiAqL1xuXG4vKiogQHR5cGUge0NvcHlTZXR9ICovXG5jb25zdCBlbXB0eSA9IG1ha2VDb3B5U2V0KFtdKTtcblxuLyoqIEB0eXBlIHtNYXRoSGVscGVyczxDb3B5U2V0Pn0gKi9cbiAgICAgICBjb25zdCBjb3B5U2V0TWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogc2V0ID0+IHtcbiAgICBtdXN0TWF0Y2goc2V0LCBNLnNldCgpLCAnc2V0IG9mIGFtb3VudCcpO1xuICAgIHJldHVybiBzZXQ7XG4gIH0sXG4gIGRvTWFrZUVtcHR5OiAoKSA9PiBlbXB0eSxcbiAgZG9Jc0VtcHR5OiBzZXQgPT4gZ2V0Q29weVNldEtleXMoc2V0KS5sZW5ndGggPT09IDAsXG4gIGRvSXNHVEU6IHNldElzU3VwZXJzZXQsXG4gIGRvSXNFcXVhbDoga2V5RVEsXG4gIGRvQWRkOiBzZXREaXNqb2ludFVuaW9uLFxuICBkb1N1YnRyYWN0OiBzZXREaXNqb2ludFN1YnRyYWN0LFxufSk7JGjNj19vbmNlLmNvcHlTZXRNYXRoSGVscGVycyhjb3B5U2V0TWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29weVNldE1hdGhIZWxwZXJzIjpbImNvcHlTZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAZ8y1+zwYAAM8GAAA2AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm5hdE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxOYXQsaXNOYXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV0sW1wiaXNOYXRcIixbJGjNj19hID0+IChpc05hdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKiBAaW1wb3J0IHtNYXRoSGVscGVycywgTmF0VmFsdWV9IGZyb20gJy4uL3R5cGVzLmpzJyAqL1xuXG5jb25zdCBlbXB0eSA9IDBuO1xuXG4vKipcbiAqIEZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzIHVzZSB0aGUgbmF0TWF0aEhlbHBlcnMgdG8gbWFuYWdlIGJhbGFuY2VzIC0gdGhlXG4gKiBvcGVyYXRpb25zIGFyZSBtZXJlbHkgYXJpdGhtZXRpYyBvbiBuYXR1cmFsLCBub24tbmVnYXRpdmUgbnVtYmVycy5cbiAqXG4gKiBOYXR1cmFsIG51bWJlcnMgYXJlIHVzZWQgZm9yIGZ1bmdpYmxlIGVyaWdodHMgc3VjaCBhcyBtb25leSBiZWNhdXNlIHJvdW5kaW5nXG4gKiBpc3N1ZXMgbWFrZSBmbG9hdHMgcHJvYmxlbWF0aWMuIEFsbCBvcGVyYXRpb25zIHNob3VsZCBiZSBkb25lIHdpdGggdGhlXG4gKiBzbWFsbGVzdCB3aG9sZSB1bml0IHN1Y2ggdGhhdCB0aGUgYG5hdE1hdGhIZWxwZXJzYCBuZXZlciBkZWFscyB3aXRoXG4gKiBmcmFjdGlvbmFsIHBhcnRzLlxuICpcbiAqIEB0eXBlIHtNYXRoSGVscGVyczxOYXRWYWx1ZT59XG4gKi9cbiAgICAgICBjb25zdCBuYXRNYXRoSGVscGVycyA9IGhhcmRlbih7XG4gIGRvQ29lcmNlOiBuYXQgPT4ge1xuICAgIC8qIFRPRE86IHRpZ2h0ZW4gdGhlIGRlZmluaXRpb24gb2YgTmF0IGluIEBhZ29yaWMvbmF0IHRvIHRocm93IG9uIGBudW1iZXJgKi9cbiAgICBhc3NlcnQudHlwZW9mKG5hdCwgJ2JpZ2ludCcpO1xuICAgIGlzTmF0KG5hdCkgfHwgRmFpbGB2YWx1ZSAke25hdH0gbXVzdCBiZSBhIG5hdHVyYWwgbnVtYmVyYDtcbiAgICByZXR1cm4gTmF0KG5hdCk7XG4gIH0sXG4gIGRvTWFrZUVtcHR5OiAoKSA9PiBlbXB0eSxcbiAgZG9Jc0VtcHR5OiBuYXQgPT4gbmF0ID09PSBlbXB0eSxcbiAgZG9Jc0dURTogKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ID49IHJpZ2h0LFxuICBkb0lzRXF1YWw6IChsZWZ0LCByaWdodCkgPT4gbGVmdCA9PT0gcmlnaHQsXG4gIC8qIEJpZ0ludHMgZG9uJ3Qgb2JzZXJ2YWJseSBvdmVyZmxvdyovXG4gIGRvQWRkOiAobGVmdCwgcmlnaHQpID0+IGxlZnQgKyByaWdodCxcbiAgZG9TdWJ0cmFjdDogKGxlZnQsIHJpZ2h0KSA9PiBOYXQobGVmdCAtIHJpZ2h0KSxcbn0pOyRozY9fb25jZS5uYXRNYXRoSGVscGVycyhuYXRNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJuYXRNYXRoSGVscGVycyI6WyJuYXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA93DX//QcAAP0HAAA2AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsic2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixhc3NlcnRLZXksZWxlbWVudHNJc1N1cGVyc2V0LGVsZW1lbnRzRGlzam9pbnRVbmlvbixlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QsY29lcmNlVG9FbGVtZW50cyxlbGVtZW50c0NvbXBhcmU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0S2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImVsZW1lbnRzSXNTdXBlcnNldFwiLFskaM2PX2EgPT4gKGVsZW1lbnRzSXNTdXBlcnNldCA9ICRozY9fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50VW5pb25cIixbJGjNj19hID0+IChlbGVtZW50c0Rpc2pvaW50VW5pb24gPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0XCIsWyRozY9fYSA9PiAoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0ID0gJGjNj19hKV1dLFtcImNvZXJjZVRvRWxlbWVudHNcIixbJGjNj19hID0+IChjb2VyY2VUb0VsZW1lbnRzID0gJGjNj19hKV1dLFtcImVsZW1lbnRzQ29tcGFyZVwiLFskaM2PX2EgPT4gKGVsZW1lbnRzQ29tcGFyZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge01hdGhIZWxwZXJzLCBTZXRWYWx1ZX0gZnJvbSAnLi4vdHlwZXMuanMnICovXG5cbi8qIE9wZXJhdGlvbnMgZm9yIGFycmF5cyB3aXRoIHVuaXF1ZSBvYmplY3RzIGlkZW50aWZ5aW5nIGFuZCBwcm92aWRpbmcqL1xuLyogaW5mb3JtYXRpb24gYWJvdXQgZGlnaXRhbCBhc3NldHMuIFVzZWQgZm9yIFpvZSBpbnZpdGVzLiovXG4vKiogQHR5cGUge1NldFZhbHVlfSAqL1xuY29uc3QgZW1wdHkgPSBoYXJkZW4oW10pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2UgYXJyYXktYmFzZWQgU2V0TWF0aCB3aXRoIENvcHlTZXQtYmFzZWQgQ29weVNldE1hdGhcbiAqIEB0eXBlIHtNYXRoSGVscGVyczxTZXRWYWx1ZT59XG4gKi9cbiAgICAgICBjb25zdCBzZXRNYXRoSGVscGVycyA9IGhhcmRlbih7XG4gIGRvQ29lcmNlOiBsaXN0ID0+IHtcbiAgICBsaXN0ID0gY29lcmNlVG9FbGVtZW50cyhsaXN0KTtcbiAgICAvKiBBc3NlcnQgdGhhdCBsaXN0IGNvbnRhaW5zIG9ubHkqL1xuICAgIC8qICogcGFzcy1ieS1jb3B5IHByaW1pdGl2ZXMsKi9cbiAgICAvKiAqIHBhc3MtYnktY29weSBjb250YWluZXJzIGNvbnRhaW5pbmcga2V5cywqL1xuICAgIC8qICogcmVtb3RhYmxlcy4qL1xuICAgIGFzc2VydEtleShsaXN0KTtcbiAgICByZXR1cm4gbGlzdDtcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IGxpc3QgPT4gcGFzc1N0eWxlT2YobGlzdCkgPT09ICdjb3B5QXJyYXknICYmIGxpc3QubGVuZ3RoID09PSAwLFxuICBkb0lzR1RFOiBlbGVtZW50c0lzU3VwZXJzZXQsXG4gIGRvSXNFcXVhbDogKHgsIHkpID0+IGVsZW1lbnRzQ29tcGFyZSh4LCB5KSA9PT0gMCxcbiAgZG9BZGQ6IGVsZW1lbnRzRGlzam9pbnRVbmlvbixcbiAgZG9TdWJ0cmFjdDogZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LFxufSk7JGjNj19vbmNlLnNldE1hdGhIZWxwZXJzKHNldE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNldE1hdGhIZWxwZXJzIjpbInNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADJyxEpYBQAAWAUAACMAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcGF5bWVudC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaW5pdEVtcHR5OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsWyRozY9fYSA9PiAoaW5pdEVtcHR5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qKlxuICogQGltcG9ydCB7QXNzZXRLaW5kLCBCcmFuZCwgUGF5bWVudH0gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvem9uZSc7XG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VHdWFyZH0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICovXG5cbi8qIFRPRE8gVHlwZSBJbnRlcmZhY2VHdWFyZCBiZXR0ZXIgdGhhbiBJbnRlcmZhY2VHdWFyZDxhbnk+Ki9cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7Wm9uZX0gaXNzdWVyWm9uZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkPGFueT59IFBheW1lbnRJXG4gKiBAcmV0dXJucyB7KCkgPT4gUGF5bWVudDxLLCBhbnk+fVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVBheW1lbnRLaW5kID0gKGlzc3VlclpvbmUsIG5hbWUsIGJyYW5kLCBQYXltZW50SSkgPT4ge1xuICBjb25zdCBtYWtlUGF5bWVudCA9IGlzc3VlclpvbmUuZXhvQ2xhc3MoXG4gICAgYCR7bmFtZX0gcGF5bWVudGAsXG4gICAgUGF5bWVudEksXG4gICAgaW5pdEVtcHR5LFxuICAgIHtcbiAgICAgIGdldEFsbGVnZWRCcmFuZCgpIHtcbiAgICAgICAgcmV0dXJuIGJyYW5kO1xuICAgICAgfSxcbiAgICB9LFxuICApO1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIFt0YWddIGZvciB0YWdnZWQgdHlwZSBub3QgZGVmaW5lZCBpbiBydW50aW1lKi9cbiAgcmV0dXJuIG1ha2VQYXltZW50O1xufTskaM2PX29uY2UucHJlcGFyZVBheW1lbnRLaW5kKHByZXBhcmVQYXltZW50S2luZCk7XG5oYXJkZW4ocHJlcGFyZVBheW1lbnRLaW5kKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50S2luZCI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2CdIdr42AAC+NgAAKQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50TGVkZ2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vcGF0dGVybnMiLCIuL2Ftb3VudE1hdGguanMiLCIuL3BheW1lbnQuanMiLCIuL3B1cnNlLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsYW5ub3RhdGVFcnJvcixYLGlzUHJvbWlzZSxtdXN0TWF0Y2gsTSxrZXlFUSxBbW91bnRNYXRoLHByZXBhcmVQYXltZW50S2luZCxwcmVwYXJlUHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIi4vcGF5bWVudC5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRLaW5kXCIsWyRozY9fYSA9PiAocHJlcGFyZVBheW1lbnRLaW5kID0gJGjNj19hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1wicHJlcGFyZVB1cnNlS2luZFwiLFskaM2PX2EgPT4gKHByZXBhcmVQdXJzZUtpbmQgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLFskaM2PX2EgPT4gKEJyYW5kSSA9ICRozY9fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLFskaM2PX2EgPT4gKG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7S2V5LCBQYXR0ZXJufSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm59IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7U2h1dGRvd25XaXRoRmFpbHVyZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC12YXQnO1xuICogQGltcG9ydCB7QW1vdW50U3RvcmV9IGZyb20gJy4vYW1vdW50U3RvcmUuanMnO1xuICogQGltcG9ydCB7QW1vdW50LCBBc3NldEtpbmQsIERpc3BsYXlJbmZvLCBQYXltZW50TGVkZ2VyLCBQYXltZW50LCBCcmFuZCwgUmVjb3ZlcnlTZXRzT3B0aW9uLCBQdXJzZSwgSXNzdWVyLCBNaW50fSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1dlYWtNYXBTdG9yZX0gZnJvbSAnQGFnb3JpYy9zdG9yZSc7XG4gKiBAaW1wb3J0IHtTZXRTdG9yZX0gZnJvbSAnQGFnb3JpYy9zdG9yZSc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7S30gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRTaGFwZVxuICogQHJldHVybnMge1R5cGVkUGF0dGVybjxBbW91bnQ8Sz4+fVxuICovXG5jb25zdCBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUgPSAoYnJhbmQsIGFzc2V0S2luZCwgZWxlbWVudFNoYXBlKSA9PiB7XG4gIGxldCB2YWx1ZVNoYXBlO1xuICBzd2l0Y2ggKGFzc2V0S2luZCkge1xuICAgIGNhc2UgJ25hdCc6IHtcbiAgICAgIHZhbHVlU2hhcGUgPSBNLm5hdCgpO1xuICAgICAgZWxlbWVudFNoYXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBGdW5naWJsZSBhc3NldHMgY2Fubm90IGhhdmUgYW4gZWxlbWVudFNoYXBlOiAke3EoZWxlbWVudFNoYXBlKX1gO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3NldCc6IHtcbiAgICAgIGlmIChlbGVtZW50U2hhcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5hcnJheU9mKE0ua2V5KCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uYXJyYXlPZihNLmFuZChNLmtleSgpLCBlbGVtZW50U2hhcGUpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgaWYgKGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLnNldCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uc2V0T2YoZWxlbWVudFNoYXBlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QmFnJzoge1xuICAgICAgaWYgKGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLmJhZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uYmFnT2YoZWxlbWVudFNoYXBlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBGYWlsYHVuZXhwZWN0ZWQgYXNzZXQga2luZCAke3EoYXNzZXRLaW5kKX1gO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFtb3VudFNoYXBlID0gaGFyZGVuKHtcbiAgICBicmFuZCwgLyogbWF0Y2hlcyBvbmx5IHRoaXMgZXhhY3QgYnJhbmQqL1xuICAgIHZhbHVlOiB2YWx1ZVNoYXBlLFxuICB9KTtcbiAgcmV0dXJuIGFtb3VudFNoYXBlO1xufTtcblxuLyoqXG4gKiBNYWtlIHRoZSBwYXltZW50TGVkZ2VyLCB0aGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgYmFsYW5jZXMgb2YgcGF5bWVudHMuIEFsbFxuICogbWludGluZyBhbmQgdHJhbnNmZXIgYXV0aG9yaXR5IG9yaWdpbmF0ZXMgaGVyZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtab25lfSBpc3N1ZXJab25lXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7RGlzcGxheUluZm88Sz59IGRpc3BsYXlJbmZvXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRTaGFwZVxuICogQHBhcmFtIHtSZWNvdmVyeVNldHNPcHRpb259IHJlY292ZXJ5U2V0c1N0YXRlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXVxuICogQHJldHVybnMge1BheW1lbnRMZWRnZXI8Sz59XG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUGF5bWVudExlZGdlciA9IChcbiAgaXNzdWVyWm9uZSxcbiAgbmFtZSxcbiAgYXNzZXRLaW5kLFxuICBkaXNwbGF5SW5mbyxcbiAgZWxlbWVudFNoYXBlLFxuICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICAvKiogQHR5cGUge0JyYW5kPEs+fSAqL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBjYWxsV2hlbiovXG4gIGNvbnN0IGJyYW5kID0gaXNzdWVyWm9uZS5leG8oYCR7bmFtZX0gYnJhbmRgLCBCcmFuZEksIHtcbiAgICBpc015SXNzdWVyKGFsbGVnZWRJc3N1ZXIpIHtcbiAgICAgIC8qIEJyYW5kSSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgYWxsZWdlZElzc3VlcmAgaXMgYSBSZW1vdGFibGUqL1xuICAgICAgcmV0dXJuIGFsbGVnZWRJc3N1ZXIgPT09IGlzc3VlcjtcbiAgICB9LFxuICAgIGdldEFsbGVnZWROYW1lKCkge1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfSxcbiAgICAvKiBHaXZlIGluZm9ybWF0aW9uIHRvIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuKi9cbiAgICBnZXREaXNwbGF5SW5mbygpIHtcbiAgICAgIHJldHVybiBkaXNwbGF5SW5mbztcbiAgICB9LFxuICAgIGdldEFtb3VudFNoYXBlKCkge1xuICAgICAgcmV0dXJuIGFtb3VudFNoYXBlO1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGFtb3VudFNoYXBlID0gYW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlKFxuICAgIGJyYW5kLFxuICAgIGFzc2V0S2luZCxcbiAgICBlbGVtZW50U2hhcGUsXG4gICk7XG5cbiAgY29uc3QgeyBJc3N1ZXJJLCBNaW50SSwgUGF5bWVudEksIFB1cnNlSUtpdCB9ID0gbWFrZUlzc3VlckludGVyZmFjZXMoXG4gICAgYnJhbmQsXG4gICAgYXNzZXRLaW5kLFxuICAgIGFtb3VudFNoYXBlLFxuICApO1xuXG4gIGNvbnN0IG1ha2VQYXltZW50ID0gcHJlcGFyZVBheW1lbnRLaW5kKGlzc3VlclpvbmUsIG5hbWUsIGJyYW5kLCBQYXltZW50SSk7XG5cbiAgLyoqIEB0eXBlIHtTaHV0ZG93bldpdGhGYWlsdXJlfSAqL1xuICBjb25zdCBzaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlID0gcmVhc29uID0+IHtcbiAgICAvKiBUT0RPIFRoaXMgc2hvdWxkIGFsc28gZGVzdHJveSBsZWRnZXIgc3RhdGUuKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0Ki9cbiAgICBpZiAob3B0U2h1dGRvd25XaXRoRmFpbHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlKHJlYXNvbik7XG4gICAgICB9IGNhdGNoIChlcnJJblNodXRkb3duKSB7XG4gICAgICAgIGFubm90YXRlRXJyb3IoZXJySW5TaHV0ZG93biwgWGBDYXVzZWQgYnk6ICR7cmVhc29ufWApO1xuICAgICAgICB0aHJvdyBlcnJJblNodXRkb3duO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyByZWFzb247XG4gIH07XG5cbiAgLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgQW1vdW50Pn0gKi9cbiAgY29uc3QgcGF5bWVudExlZGdlciA9IGlzc3VlclpvbmUud2Vha01hcFN0b3JlKCdwYXltZW50TGVkZ2VyJywge1xuICAgIHZhbHVlU2hhcGU6IGFtb3VudFNoYXBlLFxuICB9KTtcblxuICAvKipcbiAqIEEgKG5vbi1lbXB0eSkgd2l0aGRyYXduIGxpdmUgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZlxuICogdGhlIHB1cnNlIGl0IHdhcyB3aXRoZHJhd24gZnJvbS4gTGV0J3MgY2FsbCB0aGVzZSBcInJlY292ZXJhYmxlXCIgcGF5bWVudHMuXG4gKiBBbGwgcmVjb3ZlcmFibGUgcGF5bWVudHMgYXJlIGxpdmUsIGJ1dCBub3QgYWxsIGxpdmUgcGF5bWVudHMgYXJlXG4gKiByZWNvdmVyYWJsZS4gV2UgZG8gdGhlIGJvb2trZWVwaW5nIGZvciBwYXltZW50IHJlY292ZXJ5IHdpdGggdGhpcyB3ZWFrbWFwXG4gKiBmcm9tIHJlY292ZXJhYmxlIHBheW1lbnRzIHRvIHRoZSByZWNvdmVyeSBzZXQgdGhleSBhcmUgaW4uIEEgYnVuY2ggb2ZcbiAqIGludGVyZXN0aW5nIGludmFyaWFudHMgaGVyZTpcbiAqXG4gKiAtIEV2ZXJ5IHBheW1lbnQgdGhhdCBpcyBhIGtleSBpbiB0aGUgb3V0ZXIgYHBheW1lbnRSZWNvdmVyeVNldHNgIHdlYWtNYXAgaXNcbiAqICAgYWxzbyBpbiB0aGUgcmVjb3Zlcnkgc2V0IGluZGV4ZWQgYnkgdGhhdCBwYXltZW50LlxuICogLSBJbXBsaWVkIGJ5IHRoZSBhYm92ZSBidXQgd29ydGggc3RhdGluZzogdGhlIHBheW1lbnQgaXMgb25seSBpbiBhdCBtb3N0IG9uZVxuICogICByZWNvdmVyeSBzZXQuXG4gKiAtIEEgcmVjb3Zlcnkgc2V0IG9ubHkgY29udGFpbnMgc3VjaCBwYXltZW50cy5cbiAqIC0gRXZlcnkgcHVyc2UgaXMgYXNzb2NpYXRlZCB3aXRoIGV4YWN0bHkgb25lIHJlY292ZXJ5IHNldCB1bmlxdWUgdG8gaXQuXG4gKiAtIEEgcHVyc2UncyByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBwYXltZW50cyB3aXRoZHJhd24gZnJvbSB0aGF0IHB1cnNlIGFuZFxuICogICBub3QgeWV0IGNvbnN1bWVkLlxuICpcbiAqIElmIGByZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJ2AsIHRoZW4gbm90aGluZyBzaG91bGQgZXZlciBiZVxuICogYWRkZWQgdG8gdGhpcyBXZWFrU3RvcmUuXG4gKlxuICogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBTZXRTdG9yZTxQYXltZW50Pj59XG4gKi9cbiAgY29uc3QgcGF5bWVudFJlY292ZXJ5U2V0cyA9IGlzc3VlclpvbmUud2Vha01hcFN0b3JlKCdwYXltZW50UmVjb3ZlcnlTZXRzJyk7XG5cbiAgLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGluaXRQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seSBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmluaXRgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtTZXRTdG9yZTxQYXltZW50Pn0gW29wdFJlY292ZXJ5U2V0XVxuICovXG4gIGNvbnN0IGluaXRQYXltZW50ID0gKHBheW1lbnQsIGFtb3VudCwgb3B0UmVjb3ZlcnlTZXQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBpZiAocmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdub1JlY292ZXJ5U2V0cycpIHtcbiAgICAgIG9wdFJlY292ZXJ5U2V0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGB3aGVuIHJlY292ZXJTZXRzU3RhdGUgPT09ICdub1JlY292ZXJ5U2V0cycsIG9wdFJlY292ZXJ5U2V0IG11c3QgYmUgZW1wdHlgO1xuICAgIH1cbiAgICBpZiAob3B0UmVjb3ZlcnlTZXQgIT09IHVuZGVmaW5lZCAmJiAhQW1vdW50TWF0aC5pc0VtcHR5KGFtb3VudCkpIHtcbiAgICAgIG9wdFJlY292ZXJ5U2V0LmFkZChwYXltZW50KTtcbiAgICAgIHBheW1lbnRSZWNvdmVyeVNldHMuaW5pdChwYXltZW50LCBvcHRSZWNvdmVyeVNldCk7XG4gICAgfVxuICAgIHBheW1lbnRMZWRnZXIuaW5pdChwYXltZW50LCBhbW91bnQpO1xuICB9O1xuXG4gIC8qKlxuICogVG8gbWFpbnRhaW4gdGhlIGludmFyaWFudHMgbGlzdGVkIGluIHRoZSBgcGF5bWVudFJlY292ZXJ5U2V0c2AgY29tbWVudCxcbiAqIGBkZWxldGVQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seSBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmRlbGV0ZWAuXG4gKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKi9cbiAgY29uc3QgZGVsZXRlUGF5bWVudCA9IHBheW1lbnQgPT4ge1xuICAgIHBheW1lbnRMZWRnZXIuZGVsZXRlKHBheW1lbnQpO1xuICAgIGlmIChwYXltZW50UmVjb3ZlcnlTZXRzLmhhcyhwYXltZW50KSkge1xuICAgICAgY29uc3QgcmVjb3ZlcnlTZXQgPSBwYXltZW50UmVjb3ZlcnlTZXRzLmdldChwYXltZW50KTtcbiAgICAgIHBheW1lbnRSZWNvdmVyeVNldHMuZGVsZXRlKHBheW1lbnQpO1xuICAgICAgcmVjb3ZlcnlTZXQuZGVsZXRlKHBheW1lbnQpO1xuICAgIH1cbiAgfTtcblxuICAvKiogQHR5cGUgeyhhbGxlZ2VkQW1vdW50OiBBbW91bnQpID0+IEFtb3VudH0gKi9cbiAgY29uc3QgY29lcmNlID0gYWxsZWdlZEFtb3VudCA9PiBBbW91bnRNYXRoLmNvZXJjZShicmFuZCwgYWxsZWdlZEFtb3VudCk7XG4gIC8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gYm9vbGVhbn0gKi9cblxuICAvKipcbiAqIE1ldGhvZHMgbGlrZSBkZXBvc2l0KCkgaGF2ZSBhbiBvcHRpb25hbCBzZWNvbmQgcGFyYW1ldGVyIGBvcHRBbW91bnRTaGFwZWBcbiAqIHdoaWNoLCBpZiBwcmVzZW50LCBpcyBzdXBwb3NlZCB0byBtYXRjaCB0aGUgYmFsYW5jZSBvZiB0aGUgcGF5bWVudC4gVGhpc1xuICogaGVscGVyIGZ1bmN0aW9uIGRvZXMgdGhhdCBjaGVjay5cbiAqXG4gKiBOb3RlOiBgb3B0QW1vdW50U2hhcGVgIGlzIHVzZXItc3VwcGxpZWQgd2l0aCBubyBwcmV2aW91cyB2YWxpZGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBwYXltZW50QmFsYW5jZVxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuICBjb25zdCBhc3NlcnRBbW91bnRDb25zaXN0ZW50ID0gKHBheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSkgPT4ge1xuICAgIGlmIChvcHRBbW91bnRTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2gocGF5bWVudEJhbGFuY2UsIG9wdEFtb3VudFNoYXBlLCAnYW1vdW50Jyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuICBjb25zdCBhc3NlcnRMaXZlUGF5bWVudCA9IHBheW1lbnQgPT4ge1xuICAgIHBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpIHx8XG4gICAgICBGYWlsYCR7cGF5bWVudH0gd2FzIG5vdCBhIGxpdmUgcGF5bWVudCBmb3IgYnJhbmQgJHtxKFxuICAgICAgICBicmFuZCxcbiAgICAgICl9LiBJdCBjb3VsZCBiZSBhIHVzZWQtdXAgcGF5bWVudCwgYSBwYXltZW50IGZvciBhbm90aGVyIGJyYW5kLCBvciBpdCBtaWdodCBub3QgYmUgYSBwYXltZW50IGF0IGFsbC5gO1xuICB9O1xuXG4gIC8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2UuZGVwb3NpdFxuICpcbiAqIEBwYXJhbSB7QW1vdW50U3RvcmV9IGJhbGFuY2VTdG9yZVxuICogQHBhcmFtIHtQYXltZW50fSBzcmNQYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cbiAgY29uc3QgZGVwb3NpdEludGVybmFsID0gKFxuICAgIGJhbGFuY2VTdG9yZSxcbiAgICBzcmNQYXltZW50LFxuICAgIG9wdEFtb3VudFNoYXBlID0gdW5kZWZpbmVkLFxuICApID0+IHtcbiAgICAhaXNQcm9taXNlKHNyY1BheW1lbnQpIHx8XG4gICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgYGRlcG9zaXQgZG9lcyBub3QgYWNjZXB0IHByb21pc2VzIGFzIGZpcnN0IGFyZ3VtZW50LiBJbnN0ZWFkIG9mIHBhc3NpbmcgdGhlIHByb21pc2UgKGRlcG9zaXQocGF5bWVudFByb21pc2UpKSwgY29uc2lkZXIgdW53cmFwcGluZyB0aGUgcHJvbWlzZSBmaXJzdDogRS53aGVuKHBheW1lbnRQcm9taXNlLCAoYWN0dWFsUGF5bWVudCA9PiBkZXBvc2l0KGFjdHVhbFBheW1lbnQpKWAsXG4gICAgICAgIFR5cGVFcnJvcixcbiAgICAgICk7XG4gICAgYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG4gICAgY29uc3Qgc3JjUGF5bWVudEJhbGFuY2UgPSBwYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbiAgICBhc3NlcnRBbW91bnRDb25zaXN0ZW50KHNyY1BheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSk7XG4gICAgdHJ5IHtcbiAgICAgIC8qIENPTU1JVCBQT0lOVCovXG4gICAgICAvKiBNb3ZlIHRoZSBhc3NldHMgaW4gYHNyY1BheW1lbnRgIGludG8gdGhpcyBwdXJzZSwgdXNpbmcgdXAgdGhlKi9cbiAgICAgIC8qIHNvdXJjZSBwYXltZW50LCBzdWNoIHRoYXQgdG90YWwgYXNzZXRzIGFyZSBjb25zZXJ2ZWQuKi9cbiAgICAgIGRlbGV0ZVBheW1lbnQoc3JjUGF5bWVudCk7XG4gICAgICBiYWxhbmNlU3RvcmUuaW5jcmVtZW50KHNyY1BheW1lbnRCYWxhbmNlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIHNyY1BheW1lbnRCYWxhbmNlO1xuICB9O1xuXG4gIC8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2Uud2l0aGRyYXdcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFN0b3JlfSBiYWxhbmNlU3RvcmVcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnQgLSB0aGUgYW1vdW50IHRvIGJlIHdpdGhkcmF3blxuICogQHBhcmFtIHtTZXRTdG9yZTxQYXltZW50Pn0gW3JlY292ZXJ5U2V0XVxuICogQHJldHVybnMge1BheW1lbnR9XG4gKi9cbiAgY29uc3Qgd2l0aGRyYXdJbnRlcm5hbCA9IChiYWxhbmNlU3RvcmUsIGFtb3VudCwgcmVjb3ZlcnlTZXQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBhbW91bnQgPSBjb2VyY2UoYW1vdW50KTtcbiAgICBjb25zdCBwYXltZW50ID0gbWFrZVBheW1lbnQoKTtcbiAgICAvKiBDT01NSVQgUE9JTlQgTW92ZSB0aGUgd2l0aGRyYXduIGFzc2V0cyBmcm9tIHRoaXMgcHVyc2UgaW50byovXG4gICAgLyogcGF5bWVudC4gVG90YWwgYXNzZXRzIG11c3QgcmVtYWluIGNvbnNlcnZlZC4qL1xuICAgIGJhbGFuY2VTdG9yZS5kZWNyZW1lbnQoYW1vdW50KSB8fFxuICAgICAgRmFpbGBXaXRoZHJhd2FsIG9mICR7YW1vdW50fSBmYWlsZWQgYmVjYXVzZSB0aGUgcHVyc2Ugb25seSBjb250YWluZWQgJHtiYWxhbmNlU3RvcmUuZ2V0QW1vdW50KCl9YDtcbiAgICB0cnkge1xuICAgICAgaW5pdFBheW1lbnQocGF5bWVudCwgYW1vdW50LCByZWNvdmVyeVNldCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBwYXltZW50O1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7KCkgPT4gUHVyc2U8Sz59ICovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIGFtb3VudCBraW5kcyovXG4gIGNvbnN0IG1ha2VFbXB0eVB1cnNlID0gcHJlcGFyZVB1cnNlS2luZChcbiAgICBpc3N1ZXJab25lLFxuICAgIG5hbWUsXG4gICAgYXNzZXRLaW5kLFxuICAgIGJyYW5kLFxuICAgIFB1cnNlSUtpdCxcbiAgICBoYXJkZW4oe1xuICAgICAgZGVwb3NpdEludGVybmFsLFxuICAgICAgd2l0aGRyYXdJbnRlcm5hbCxcbiAgICB9KSxcbiAgICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgICBwYXltZW50UmVjb3ZlcnlTZXRzLFxuICApO1xuXG4gIC8qKiBAdHlwZSB7SXNzdWVyPEs+fSAqL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBjYWxsV2hlbiovXG4gIGNvbnN0IGlzc3VlciA9IGlzc3VlclpvbmUuZXhvKGAke25hbWV9IGlzc3VlcmAsIElzc3VlckksIHtcbiAgICBnZXRCcmFuZCgpIHtcbiAgICAgIHJldHVybiBicmFuZDtcbiAgICB9LFxuICAgIGdldEFsbGVnZWROYW1lKCkge1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfSxcbiAgICBnZXRBc3NldEtpbmQoKSB7XG4gICAgICByZXR1cm4gYXNzZXRLaW5kO1xuICAgIH0sXG4gICAgZ2V0RGlzcGxheUluZm8oKSB7XG4gICAgICByZXR1cm4gZGlzcGxheUluZm87XG4gICAgfSxcbiAgICBtYWtlRW1wdHlQdXJzZSgpIHtcbiAgICAgIHJldHVybiBtYWtlRW1wdHlQdXJzZSgpO1xuICAgIH0sXG4gICAgLyoqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudCBhd2FpdGVkIGJ5IGNhbGxXaGVuICovXG4gICAgaXNMaXZlKHBheW1lbnQpIHtcbiAgICAgIC8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbiAgICAgIHJldHVybiBwYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KTtcbiAgICB9LFxuICAgIC8qKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlbiAqL1xuICAgIGdldEFtb3VudE9mKHBheW1lbnQpIHtcbiAgICAgIC8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbiAgICAgIGFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xuICAgICAgcmV0dXJuIHBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuICAgIH0sXG4gICAgLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlblxuICogQHBhcmFtIHtQYXR0ZXJufSBvcHRBbW91bnRTaGFwZVxuICovXG4gICAgYnVybihwYXltZW50LCBvcHRBbW91bnRTaGFwZSA9IHVuZGVmaW5lZCkge1xuICAgICAgLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuICAgICAgYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG4gICAgICBjb25zdCBwYXltZW50QmFsYW5jZSA9IHBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuICAgICAgYXNzZXJ0QW1vdW50Q29uc2lzdGVudChwYXltZW50QmFsYW5jZSwgb3B0QW1vdW50U2hhcGUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLyogQ09NTUlUIFBPSU5ULiovXG4gICAgICAgIGRlbGV0ZVBheW1lbnQocGF5bWVudCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF5bWVudEJhbGFuY2U7XG4gICAgfSxcbiAgfSk7XG5cbiAgLyoqXG4gKiBQcm92aWRlcyBmb3IgdGhlIHJlY292ZXJ5IG9mIG5ld2x5IG1pbnRlZCBidXQgbm90LXlldC1kZXBvc2l0ZWQgcGF5bWVudHMuXG4gKlxuICogQmVjYXVzZSB0aGUgYG1pbnRSZWNvdmVyeVB1cnNlYCBpcyBwbGFjZWQgaW4gYmFnZ2FnZSwgZXZlbiBpZiB0aGUgY2FsbGVyIG9mXG4gKiBgbWFrZUlzc3VlcktpdGAgZHJvcHMgaXQgb24gdGhlIGZsb29yLCBpdCBjYW4gc3RpbGwgYmUgcmVjb3ZlcmVkIGluIGFuXG4gKiBlbWVyZ2VuY3kgdXBncmFkZS5cbiAqL1xuICBjb25zdCBtaW50UmVjb3ZlcnlQdXJzZSA9IC8qKiBAdHlwZSB7UHVyc2U8Sz59ICovIChcbiAgICBpc3N1ZXJab25lLm1ha2VPbmNlKCdtaW50UmVjb3ZlcnlQdXJzZScsICgpID0+IG1ha2VFbXB0eVB1cnNlKCkpXG4gICk7XG5cbiAgLyoqIEB0eXBlIHtNaW50PEs+fSAqL1xuICBjb25zdCBtaW50ID0gaXNzdWVyWm9uZS5leG8oYCR7bmFtZX0gbWludGAsIE1pbnRJLCB7XG4gICAgZ2V0SXNzdWVyKCkge1xuICAgICAgcmV0dXJuIGlzc3VlcjtcbiAgICB9LFxuICAgIG1pbnRQYXltZW50KG5ld0Ftb3VudCkge1xuICAgICAgbmV3QW1vdW50ID0gY29lcmNlKG5ld0Ftb3VudCk7XG4gICAgICBtdXN0TWF0Y2gobmV3QW1vdW50LCBhbW91bnRTaGFwZSwgJ21pbnRlZCBhbW91bnQnKTtcbiAgICAgIC8qIGByYXdQYXltZW50YCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSByZWNvdmVyeSBzZXQsIGFuZCovXG4gICAgICAvKiBzbyBtdXN0IG5vdCBlc2NhcGUuKi9cbiAgICAgIGNvbnN0IHJhd1BheW1lbnQgPSBtYWtlUGF5bWVudCgpO1xuICAgICAgaW5pdFBheW1lbnQocmF3UGF5bWVudCwgbmV3QW1vdW50LCB1bmRlZmluZWQpO1xuXG4gICAgICBjb25zdCBtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSA9IG1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbiAgICAgIG1pbnRSZWNvdmVyeVB1cnNlLmRlcG9zaXQocmF3UGF5bWVudCwgbmV3QW1vdW50KTtcbiAgICAgIGNvbnN0IHBheW1lbnQgPSBtaW50UmVjb3ZlcnlQdXJzZS53aXRoZHJhdyhuZXdBbW91bnQpO1xuICAgICAgY29uc3QgbWludFJlY292ZXJ5UHVyc2VBZnRlciA9IG1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbiAgICAgIGFzc2VydChrZXlFUShtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSwgbWludFJlY292ZXJ5UHVyc2VBZnRlcikpO1xuICAgICAgcmV0dXJuIHBheW1lbnQ7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaXNzdWVyS2l0ID0gaGFyZGVuKHsgaXNzdWVyLCBtaW50LCBicmFuZCwgbWludFJlY292ZXJ5UHVyc2UgfSk7XG4gIHJldHVybiBpc3N1ZXJLaXQ7XG59OyRozY9fb25jZS5wcmVwYXJlUGF5bWVudExlZGdlcihwcmVwYXJlUGF5bWVudExlZGdlcik7XG5oYXJkZW4ocHJlcGFyZVBheW1lbnRMZWRnZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRMZWRnZXIiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPiCeiZccAACXHAAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiLi9hbW91bnRNYXRoLmpzIiwiLi90cmFuc2llbnROb3RpZmllci5qcyIsIi4vYW1vdW50U3RvcmUuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUHVyc2VLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxNLG1ha2VDb3B5U2V0LEFtb3VudE1hdGgsbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0LG1ha2VBbW91bnRTdG9yZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIi4vdHJhbnNpZW50Tm90aWZpZXIuanNcIiwgW1tcIm1ha2VUcmFuc2llbnROb3RpZmllcktpdFwiLFskaM2PX2EgPT4gKG1ha2VUcmFuc2llbnROb3RpZmllcktpdCA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50U3RvcmUuanNcIiwgW1tcIm1ha2VBbW91bnRTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VBbW91bnRTdG9yZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtBc3NldEtpbmQsIFJlY292ZXJ5U2V0c09wdGlvbiwgQnJhbmQsIFBheW1lbnR9IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL3pvbmUnO1xuICogQGltcG9ydCB7SW50ZXJmYWNlR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1dlYWtNYXBTdG9yZX0gZnJvbSAnQGFnb3JpYy9zdG9yZSc7XG4gKiBAaW1wb3J0IHtTZXRTdG9yZX0gZnJvbSAnQGFnb3JpYy9zdG9yZSc7XG4gKi9cblxuY29uc3QgRU1QVFlfQ09QWV9TRVQgPSBtYWtlQ29weVNldChbXSk7XG5cbi8qIFRPRE8gVHlwZSBJbnRlcmZhY2VHdWFyZCBiZXR0ZXIgdGhhbiBJbnRlcmZhY2VHdWFyZDxhbnk+Ki9cbi8qKlxuICogQHBhcmFtIHtab25lfSBpc3N1ZXJab25lXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7e1xuICogICBwdXJzZTogSW50ZXJmYWNlR3VhcmQ8YW55PjtcbiAqICAgZGVwb3NpdEZhY2V0OiBJbnRlcmZhY2VHdWFyZDxhbnk+O1xuICogfX0gUHVyc2VJS2l0XG4gKiBAcGFyYW0ge3tcbiAqICAgZGVwb3NpdEludGVybmFsOiBhbnk7XG4gKiAgIHdpdGhkcmF3SW50ZXJuYWw6IGFueTtcbiAqIH19IHB1cnNlTWV0aG9kc1xuICogQHBhcmFtIHtSZWNvdmVyeVNldHNPcHRpb259IHJlY292ZXJ5U2V0c1N0YXRlXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxQYXltZW50LCBTZXRTdG9yZTxQYXltZW50Pj59IHBheW1lbnRSZWNvdmVyeVNldHNcbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVQdXJzZUtpbmQgPSAoXG4gIGlzc3VlclpvbmUsXG4gIG5hbWUsXG4gIGFzc2V0S2luZCxcbiAgYnJhbmQsXG4gIFB1cnNlSUtpdCxcbiAgcHVyc2VNZXRob2RzLFxuICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgcGF5bWVudFJlY292ZXJ5U2V0cyxcbikgPT4ge1xuICBjb25zdCBhbW91bnRTaGFwZSA9IGJyYW5kLmdldEFtb3VudFNoYXBlKCk7XG5cbiAgLyogTm90ZTogVmlydHVhbCBmb3IgaGlnaCBjYXJkaW5hbGl0eSwgYnV0ICpub3QqIGR1cmFibGUsIGFuZCBzbyovXG4gIC8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuICAvKiBUT0RPIHByb3BhZ2F0ZSB6b25pZnlpbmcgdG8gbm90aWZpZXJzLCBtYXliZT8qL1xuICBjb25zdCB7IHByb3ZpZGVOb3RpZmllciwgdXBkYXRlOiB1cGRhdGVCYWxhbmNlIH0gPSBtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQoKTtcblxuICAvKipcbiAqIElmIGByZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ2hhc1JlY292ZXJ5U2V0cydgICh0aGUgbm9ybWFsIHN0YXRlKSwgdGhlbiBqdXN0XG4gKiByZXR1cm4gYHN0YXRlLnJlY292ZXJ5U2V0YC5cbiAqXG4gKiBJZiBgcmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdub1JlY292ZXJ5U2V0cydgLCByZXR1cm4gYHVuZGVmaW5lZGAuIENhbGxlcnNcbiAqIG11c3QgYmUgYXdhcmUgdGhhdCB0aGUgYHVuZGVmaW5lZGAgcmV0dXJuIGhhcHBlbnMgaWZmIGByZWNvdmVyeVNldHNTdGF0ZVxuICogPT09ICdub1JlY292ZXJ5U2V0cydgLCBhbmQgdG8gYXZvaWQgc3RvcmluZyBvciByZXRyaWV2aW5nIGFueXRoaW5nIGZyb20gdGhlXG4gKiBhY3R1YWwgcmVjb3Zlcnkgc2V0LlxuICpcbiAqIEBwYXJhbSB7eyByZWNvdmVyeVNldDogU2V0U3RvcmU8UGF5bWVudD4gfX0gc3RhdGVcbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxQYXltZW50PiB8IHVuZGVmaW5lZH1cbiAqL1xuICBjb25zdCBtYXliZVJlY292ZXJ5U2V0ID0gc3RhdGUgPT4ge1xuICAgIGNvbnN0IHsgcmVjb3ZlcnlTZXQgfSA9IHN0YXRlO1xuICAgIGlmIChyZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ2hhc1JlY292ZXJ5U2V0cycpIHtcbiAgICAgIHJldHVybiByZWNvdmVyeVNldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdub1JlY292ZXJ5U2V0cycgfHxcbiAgICAgICAgRmFpbGByZWNvdmVyU2V0c1N0YXRlIG11c3QgYmUgbm9SZWNvdmVyeVNldHMgaWYgaXQgaXNuJ3QgaGFzUmVjb3ZlclNldHNgO1xuICAgICAgcGF5bWVudFJlY292ZXJ5U2V0cyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgcGF5bWVudFJlY292ZXJ5U2V0cyBtdXN0IGFsd2F5cyBiZSBkZWZpbmVkYDtcbiAgICAgIHJlY292ZXJ5U2V0LmdldFNpemUoKSA9PT0gMCB8fFxuICAgICAgICBGYWlsYFdpdGggbm9SZWNvdmVyeVNldHMsIHJlY292ZXJ5U2V0IG11c3QgYmUgZW1wdHlgO1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuICAvKiAtIFRoaXMga2luZCBpcyBhIHBhaXIgb2YgcHVyc2UgYW5kIGRlcG9zaXRGYWNldCB0aGF0IGhhdmUgYSAxOjEqL1xuICAvKiBjb3JyZXNwb25kZW5jZS4qL1xuICAvKiAtIFRoZXkgYXJlIHZpcnR1YWxpemVkIHRvZ2V0aGVyIHRvIHNoYXJlIGEgc2luZ2xlIHN0YXRlIHJlY29yZC4qL1xuICAvKiAtIEFuIGFsdGVybmF0aXZlIGRlc2lnbiBjb25zaWRlcmVkIHdhcyB0byBoYXZlIHRoaXMgcmV0dXJuIGEgUHVyc2UgYWxvbmUqL1xuICAvKiB0aGF0IGNyZWF0ZWQgZGVwb3NpdEZhY2V0IGFzIG5lZWRlZC4gQnV0IHRoaXMgYXBwcm9hY2ggZW5zdXJlcyBhIGNvbnN0YW50Ki9cbiAgLyogaWRlbnRpdHkgZm9yIHRoZSBmYWNldCBhbmQgZXhlcmNpc2VzIHRoZSBtdWx0aS1mYWNldGVkIG9iamVjdCBzdHlsZS4qL1xuICBjb25zdCB7IGRlcG9zaXRJbnRlcm5hbCwgd2l0aGRyYXdJbnRlcm5hbCB9ID0gcHVyc2VNZXRob2RzO1xuICBjb25zdCBtYWtlUHVyc2VLaXQgPSBpc3N1ZXJab25lLmV4b0NsYXNzS2l0KFxuICAgIGAke25hbWV9IFB1cnNlYCxcbiAgICBQdXJzZUlLaXQsXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEJhbGFuY2UgPSBBbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCwgYXNzZXRLaW5kKTtcblxuICAgICAgLyoqIEB0eXBlIHtTZXRTdG9yZTxQYXltZW50Pn0gKi9cbiAgICAgIGNvbnN0IHJlY292ZXJ5U2V0ID0gaXNzdWVyWm9uZS5kZXRhY2hlZCgpLnNldFN0b3JlKCdyZWNvdmVyeSBzZXQnKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VycmVudEJhbGFuY2UsXG4gICAgICAgIHJlY292ZXJ5U2V0LFxuICAgICAgfTtcbiAgICB9LFxuICAgIHtcbiAgICAgIHB1cnNlOiB7XG4gICAgICAgIGRlcG9zaXQoc3JjUGF5bWVudCwgb3B0QW1vdW50U2hhcGUgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvKiBQdXJzZUkgZG9lcyAqbm90KiBkZWxheSBgZGVwb3NpdGAgdW50aWwgYHNyY1BheW1lbnRgIGlzIGZ1bGZ1bGxlZC4qL1xuICAgICAgICAgIC8qIFNlZSB0aGUgY29tbWVudHMgb24gUHVyc2VJLmRlcG9zaXQgaW4gdHlwZUd1YXJkcy5qcyovXG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IHB1cnNlIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICBjb25zdCBiYWxhbmNlU3RvcmUgPSBtYWtlQW1vdW50U3RvcmUoc3RhdGUsICdjdXJyZW50QmFsYW5jZScpO1xuICAgICAgICAgIC8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBkZXBvc2l0LiovXG4gICAgICAgICAgY29uc3Qgc3JjUGF5bWVudEJhbGFuY2UgPSBkZXBvc2l0SW50ZXJuYWwoXG4gICAgICAgICAgICBiYWxhbmNlU3RvcmUsXG4gICAgICAgICAgICBzcmNQYXltZW50LFxuICAgICAgICAgICAgb3B0QW1vdW50U2hhcGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVCYWxhbmNlKHB1cnNlLCBiYWxhbmNlU3RvcmUuZ2V0QW1vdW50KCkpO1xuICAgICAgICAgIHJldHVybiBzcmNQYXltZW50QmFsYW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgd2l0aGRyYXcoYW1vdW50KSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IHB1cnNlIH0gPSB0aGlzLmZhY2V0cztcblxuICAgICAgICAgIGNvbnN0IG9wdFJlY292ZXJ5U2V0ID0gbWF5YmVSZWNvdmVyeVNldChzdGF0ZSk7XG4gICAgICAgICAgY29uc3QgYmFsYW5jZVN0b3JlID0gbWFrZUFtb3VudFN0b3JlKHN0YXRlLCAnY3VycmVudEJhbGFuY2UnKTtcbiAgICAgICAgICAvKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gd2l0aGRyYXcuKi9cbiAgICAgICAgICBjb25zdCBwYXltZW50ID0gd2l0aGRyYXdJbnRlcm5hbChcbiAgICAgICAgICAgIGJhbGFuY2VTdG9yZSxcbiAgICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAgIG9wdFJlY292ZXJ5U2V0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQmFsYW5jZShwdXJzZSwgYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpKTtcbiAgICAgICAgICByZXR1cm4gcGF5bWVudDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Q3VycmVudEFtb3VudCgpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IGJhbGFuY2VTdG9yZSA9IG1ha2VBbW91bnRTdG9yZShzdGF0ZSwgJ2N1cnJlbnRCYWxhbmNlJyk7XG4gICAgICAgICAgcmV0dXJuIGJhbGFuY2VTdG9yZS5nZXRBbW91bnQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyKCkge1xuICAgICAgICAgIHJldHVybiBwcm92aWRlTm90aWZpZXIodGhpcy5mYWNldHMucHVyc2UpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRBbGxlZ2VkQnJhbmQoKSB7XG4gICAgICAgICAgcmV0dXJuIGJyYW5kO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldERlcG9zaXRGYWNldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdEZhY2V0O1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldFJlY292ZXJ5U2V0KCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3Qgb3B0UmVjb3ZlcnlTZXQgPSBtYXliZVJlY292ZXJ5U2V0KHN0YXRlKTtcbiAgICAgICAgICBpZiAob3B0UmVjb3ZlcnlTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0NPUFlfU0VUO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb3B0UmVjb3ZlcnlTZXQuc25hcHNob3QoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVjb3ZlckFsbCgpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgbGV0IGFtb3VudCA9IEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLCBhc3NldEtpbmQpO1xuICAgICAgICAgIGNvbnN0IG9wdFJlY292ZXJ5U2V0ID0gbWF5YmVSZWNvdmVyeVNldChzdGF0ZSk7XG4gICAgICAgICAgaWYgKG9wdFJlY292ZXJ5U2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQ7IC8qIGVtcHR5IGF0IHRoaXMgdGltZSovXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgcGF5bWVudCBvZiBvcHRSZWNvdmVyeVNldC5rZXlzKCkpIHtcbiAgICAgICAgICAgIC8qIFRoaXMgZG9lcyBjYXVzZSBkZWxldGlvbnMgZnJvbSB0aGUgc2V0IHdoaWxlIGl0ZXJhdGluZywqL1xuICAgICAgICAgICAgLyogYnV0IHRoaXMgc3BlY2lhbCBjYXNlIGlzIGFsbG93ZWQuKi9cbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gZmFjZXRzLnB1cnNlLmRlcG9zaXQocGF5bWVudCk7XG4gICAgICAgICAgICBhbW91bnQgPSBBbW91bnRNYXRoLmFkZChhbW91bnQsIGRlbHRhLCBicmFuZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wdFJlY292ZXJ5U2V0LmdldFNpemUoKSA9PT0gMCB8fFxuICAgICAgICAgICAgRmFpbGBpbnRlcm5hbDogUmVtYWluaW5nIHVucmVjb3ZlcmVkIHBheW1lbnRzOiAke2ZhY2V0cy5wdXJzZS5nZXRSZWNvdmVyeVNldCgpfWA7XG4gICAgICAgICAgcmV0dXJuIGFtb3VudDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBkZXBvc2l0RmFjZXQ6IHtcbiAgICAgICAgcmVjZWl2ZSguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLnB1cnNlLmRlcG9zaXQoLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgc3RhdGVTaGFwZToge1xuICAgICAgICBjdXJyZW50QmFsYW5jZTogYW1vdW50U2hhcGUsXG4gICAgICAgIHJlY292ZXJ5U2V0OiBNLnJlbW90YWJsZSgncmVjb3ZlcnlTZXQnKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuICgpID0+IG1ha2VQdXJzZUtpdCgpLnB1cnNlO1xufTskaM2PX29uY2UucHJlcGFyZVB1cnNlS2luZChwcmVwYXJlUHVyc2VLaW5kKTtcbmhhcmRlbihwcmVwYXJlUHVyc2VLaW5kKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQdXJzZUtpbmQiOlsicHJlcGFyZVB1cnNlS2luZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC+q6FyJz0AACc9AAAhAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3JhdGlvLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9uYXQiLCIuL2Ftb3VudE1hdGguanMiLCIuL3NhZmVNYXRoLmpzIl0sImV4cG9ydHMiOlsiYWRkUmF0aW9zIiwiYXNzZXJ0SXNSYXRpbyIsImFzc2VydFBhcnNhYmxlTnVtYmVyIiwiY2VpbERpdmlkZUJ5IiwiY2VpbE11bHRpcGx5QnkiLCJkaXZpZGVCeSIsImZsb29yRGl2aWRlQnkiLCJmbG9vck11bHRpcGx5QnkiLCJpbnZlcnRSYXRpbyIsIm1ha2VSYXRpbyIsIm1ha2VSYXRpb0Zyb21BbW91bnRzIiwibXVsdGlwbHlCeSIsIm11bHRpcGx5UmF0aW9zIiwib25lTWludXMiLCJwYXJzZVJhdGlvIiwicXVhbnRpemUiLCJyYXRpb0dURSIsInJhdGlvVG9OdW1iZXIiLCJyYXRpb3NTYW1lIiwic3VidHJhY3RSYXRpb3MiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsYXNzZXJ0UmVjb3JkLGlzTmF0LEFtb3VudE1hdGgsbmF0U2FmZU1hdGg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmVjb3JkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJpc05hdFwiLFskaM2PX2EgPT4gKGlzTmF0ID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIi4vc2FmZU1hdGguanNcIiwgW1tcIm5hdFNhZmVNYXRoXCIsWyRozY9fYSA9PiAobmF0U2FmZU1hdGggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtBbW91bnQsIEJyYW5kLCBJc3N1ZXIsIFBheW1lbnQsIFB1cnNlfSBmcm9tICdAYWdvcmljL2VydHAnO1xuICovXG5cbmNvbnN0IHsgbXVsdGlwbHksIGZsb29yRGl2aWRlLCBjZWlsRGl2aWRlLCBiYW5rZXJzRGl2aWRlLCBhZGQsIHN1YnRyYWN0IH0gPVxuICBuYXRTYWZlTWF0aDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYXRpb1xuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBudW1lcmF0b3JcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gZGVub21pbmF0b3JcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTY2FsZUFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqL1xuXG4vKiBtYWtlIGEgUmF0aW8sIHdoaWNoIHJlcHJlc2VudHMgYSBmcmFjdGlvbi4gSXQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLiovXG4vKiovXG4vKiBUaGUgbmF0dXJhbCBzeW50YXggZm9yIHRoZSBtb3N0IGNvbW1vbiBvcGVyYXRpb25zIHdlIHdhbnQgdG8gc3VwcG9ydCovXG4vKiBhcmUgQW1vdW50ICogUmF0aW8gYW5kIEFtb3VudCAvIFJhdGlvLiBTaW5jZSB0aGUgb3BlcmF0aW9ucyB3YW50IHRvIGFkaGVyZSB0byovXG4vKiB0aGUgcmF0aW8gcmF0aGVyIHRoYW4gdGhlIGFtb3VudCwgd2Ugc2V0dGxlZCBvbiBhIGNhbGxpbmcgY29udmVudGlvbiBvZiovXG4vKiBbY2VpbHxmbG9vcl1NdWx0aXBseUJ5KEFtb3VudCwgUmF0aW8pIGFuZCBbY2VpbHxmbG9vcl1EaXZpZGVCeShBbW91bnQsIFJhdGlvKSovXG4vKiovXG4vKiBUaGUgbW9zdCBjb21tb24ga2luZCBvZiBSYXRpbyBjYW4gYmUgYXBwbGllZCB0byBBbW91bnRzIG9mIGEgcGFydGljdWxhciovXG4vKiBicmFuZCwgYW5kIHByb2R1Y2VzIHJlc3VsdHMgb2YgdGhlIHNhbWUgYnJhbmQuIFRoaXMgcmVwcmVzZW50cyBhIG11bHRpcGxpZXIqL1xuLyogdGhhdCBpcyBvbmx5IGFwcGxpY2FibGUgdG8gdGhhdCBicmFuZC4gVGhlIGxlc3MgY29tbW9uIGtpbmQgb2YgUmF0aW8gY2FuIGJlKi9cbi8qIGFwcGxpZWQgdG8gb25lIHBhcnRpY3VsYXIgYnJhbmQgb2YgYW1vdW50cywgYW5kIHByb2R1Y2VzIHJlc3VsdHMgb2YgYW5vdGhlciovXG4vKiBwYXJ0aWN1bGFyIGJyYW5kLiBUaGlzIHJlcHJlc2VudHMgc29tZSBraW5kIG9mIGV4Y2hhbmdlIHJhdGUuIFRoZSovXG4vKiBicmFuZC1jaGVja2luZyBoZWxwcyB1cyBlbnN1cmUgdGhhdCBub3JtYWwgUmF0aW9zIGFyZW4ndCBhcHBsaWVkIHRvIGFtb3VudHMqL1xuLyogb2YgdGhlIHdyb25nIGJyYW5kLCBhbmQgdGhhdCBleGNoYW5nZSByYXRlcyBhcmUgb25seSB1c2VkIGluIHRoZSBhcHByb3ByaWF0ZSovXG4vKiBkaXJlY3Rpb24uKi9cbi8qKi9cbi8qIFNpbmNlIHRoZSByYXRpb3MgYXJlIHJlcHJlc2VudGVkIGJ5IGEgbnVtZXJhdG9yIGFuZCBhIGRlbm9taW5hdG9yLCBldmVyeSovXG4vKiBtdWx0aXBsaWNhdGlvbiBvciBkaXZpc2lvbiBvcGVyYXRpb24gdGhhdCBwcm9kdWNlcyBhbiBhbW91bnQgZW5kcyB3aXRoIGEqL1xuLyogZGl2aXNpb24gb2YgdGhlIHVuZGVybHlpbmcgYmlnaW50cywgYW5kIGludGVnZXIgZGl2aXNpb24gcmVxdWlyZXMgYSBtb2RlKi9cbi8qIG9mIFtyb3VuZGluZyB0byBpbnRlZ2VyXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Sb3VuZGluZyNSb3VuZGluZ190b19pbnRlZ2VyKS4qL1xuLyogQmVjYXVzZSBgUmF0aW9gIG9ubHkgd29yayB3aXRoIE5hdHVyYWwgbnVtYmVycywganVzdCB0aHJlZSBtb2RlcyBzdWZmaWNlOiovXG4vKiAtIGZsb29yIHJvdW5kcyBkb3duKi9cbi8qIC0gY2VpbCByb3VuZHMgdXAqL1xuLyogLSBkZWZhdWx0ICh3aXRob3V0IHByZWZpeCkgbWluaW1pemVzIGJpYXMgYnkgcm91bmRpbmcgaGFsZiB0byBldmVuKi9cblxuY29uc3QgUEVSQ0VOVCA9IDEwMG47XG5cbmNvbnN0IHJhdGlvUHJvcGVydHlOYW1lcyA9IFsnbnVtZXJhdG9yJywgJ2Rlbm9taW5hdG9yJ107XG5cbiAgICAgICBjb25zdCBhc3NlcnRJc1JhdGlvID0gcmF0aW8gPT4ge1xuICBhc3NlcnRSZWNvcmQocmF0aW8sICdyYXRpbycpO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmF0aW8pO1xuICBrZXlzLmxlbmd0aCA9PT0gMiB8fCBGYWlsYFJhdGlvICR7cmF0aW99IG11c3QgYmUgYSByZWNvcmQgd2l0aCAyIGZpZWxkcy5gO1xuICBmb3IgKGNvbnN0IG5hbWUgb2Yga2V5cykge1xuICAgIHJhdGlvUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhuYW1lKSB8fFxuICAgICAgRmFpbGBQYXJhbWV0ZXIgbXVzdCBiZSBhIFJhdGlvIHJlY29yZCwgYnV0ICR7cmF0aW99IGhhcyAke3EobmFtZSl9YDtcbiAgfVxuICBjb25zdCBudW1lcmF0b3JWYWx1ZSA9IHJhdGlvLm51bWVyYXRvci52YWx1ZTtcbiAgY29uc3QgZGVub21pbmF0b3JWYWx1ZSA9IHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlO1xuICBpc05hdChudW1lcmF0b3JWYWx1ZSkgfHxcbiAgICBGYWlsYFRoZSBudW1lcmF0b3IgdmFsdWUgbXVzdCBiZSBhIE5hdFZhbHVlLCBub3QgJHtudW1lcmF0b3JWYWx1ZX1gO1xuICBpc05hdChkZW5vbWluYXRvclZhbHVlKSB8fFxuICAgIEZhaWxgVGhlIGRlbm9taW5hdG9yIHZhbHVlIG11c3QgYmUgYSBOYXRWYWx1ZSwgbm90ICR7ZGVub21pbmF0b3JWYWx1ZX1gO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge2JpZ2ludH0gbnVtZXJhdG9yXG4gKiBAcGFyYW0ge0JyYW5kfSBudW1lcmF0b3JCcmFuZFxuICogQHBhcmFtIHtiaWdpbnR9IFtkZW5vbWluYXRvcl0gVGhlIGRlZmF1bHQgZGVub21pbmF0b3IgaXMgMTAwXG4gKiBAcGFyYW0ge0JyYW5kfSBbZGVub21pbmF0b3JCcmFuZF0gVGhlIGRlZmF1bHQgaXMgdG8gcmV1c2UgdGhlIG51bWVyYXRvckJyYW5kXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaM2PX29uY2UuYXNzZXJ0SXNSYXRpbyhhc3NlcnRJc1JhdGlvKTtcbiAgICAgICBjb25zdCBtYWtlUmF0aW8gPSAoXG4gIG51bWVyYXRvcixcbiAgbnVtZXJhdG9yQnJhbmQsXG4gIGRlbm9taW5hdG9yID0gUEVSQ0VOVCxcbiAgZGVub21pbmF0b3JCcmFuZCA9IG51bWVyYXRvckJyYW5kLFxuKSA9PiB7XG4gIGRlbm9taW5hdG9yID4gMG4gfHxcbiAgICBGYWlsYE5vIGluZmluaXRlIHJhdGlvcyEgRGVub21pbmF0b3Igd2FzIDAgJHtxKGRlbm9taW5hdG9yQnJhbmQpfWA7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgbnVtZXJhdG9yOiBBbW91bnRNYXRoLm1ha2UobnVtZXJhdG9yQnJhbmQsIG51bWVyYXRvciksXG4gICAgZGVub21pbmF0b3I6IEFtb3VudE1hdGgubWFrZShkZW5vbWluYXRvckJyYW5kLCBkZW5vbWluYXRvciksXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0Ftb3VudH0gbnVtZXJhdG9yQW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudH0gZGVub21pbmF0b3JBbW91bnRcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRozY9fb25jZS5tYWtlUmF0aW8obWFrZVJhdGlvKTtcbiAgICAgICBjb25zdCBtYWtlUmF0aW9Gcm9tQW1vdW50cyA9IChudW1lcmF0b3JBbW91bnQsIGRlbm9taW5hdG9yQW1vdW50KSA9PiB7XG4gIEFtb3VudE1hdGguY29lcmNlKG51bWVyYXRvckFtb3VudC5icmFuZCwgbnVtZXJhdG9yQW1vdW50KTtcbiAgQW1vdW50TWF0aC5jb2VyY2UoZGVub21pbmF0b3JBbW91bnQuYnJhbmQsIGRlbm9taW5hdG9yQW1vdW50KTtcbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIHZhbHVlIGNhbiBiZSBhbnkgQW1vdW50VmFsdWUgYnV0IG1ha2VSYXRpbygpIHN1cHBvcnRzIG9ubHkgYmlnaW50Ki9cbiAgICBudW1lcmF0b3JBbW91bnQudmFsdWUsXG4gICAgbnVtZXJhdG9yQW1vdW50LmJyYW5kLFxuICAgIGRlbm9taW5hdG9yQW1vdW50LnZhbHVlLFxuICAgIGRlbm9taW5hdG9yQW1vdW50LmJyYW5kLFxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEBwYXJhbSB7YW55fSBkaXZpZGVPcFxuICogQHJldHVybnMge0Ftb3VudDwnbmF0Jz59XG4gKi8kaM2PX29uY2UubWFrZVJhdGlvRnJvbUFtb3VudHMobWFrZVJhdGlvRnJvbUFtb3VudHMpO1xuY29uc3QgbXVsdGlwbHlIZWxwZXIgPSAoYW1vdW50LCByYXRpbywgZGl2aWRlT3ApID0+IHtcbiAgQW1vdW50TWF0aC5jb2VyY2UoYW1vdW50LmJyYW5kLCBhbW91bnQpO1xuICBhc3NlcnRJc1JhdGlvKHJhdGlvKTtcbiAgYW1vdW50LmJyYW5kID09PSByYXRpby5kZW5vbWluYXRvci5icmFuZCB8fFxuICAgIEZhaWxgYW1vdW50J3MgYnJhbmQgJHtxKGFtb3VudC5icmFuZCl9IG11c3QgbWF0Y2ggcmF0aW8ncyBkZW5vbWluYXRvciAke3EoXG4gICAgICByYXRpby5kZW5vbWluYXRvci5icmFuZCxcbiAgICApfWA7XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7QW1vdW50PCduYXQnPn0gKi8gKFxuICAgIEFtb3VudE1hdGgubWFrZShcbiAgICAgIHJhdGlvLm51bWVyYXRvci5icmFuZCxcbiAgICAgIGRpdmlkZU9wKFxuICAgICAgICBtdWx0aXBseShhbW91bnQudmFsdWUsIHJhdGlvLm51bWVyYXRvci52YWx1ZSksXG4gICAgICAgIHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlLFxuICAgICAgKSxcbiAgICApXG4gICk7XG59O1xuXG4vKiogQHR5cGUge1NjYWxlQW1vdW50fSAqL1xuICAgICAgIGNvbnN0IGZsb29yTXVsdGlwbHlCeSA9IChhbW91bnQsIHJhdGlvKSA9PiB7XG4gIHJldHVybiBtdWx0aXBseUhlbHBlcihhbW91bnQsIHJhdGlvLCBmbG9vckRpdmlkZSk7XG59O1xuXG4vKiogQHR5cGUge1NjYWxlQW1vdW50fSAqLyRozY9fb25jZS5mbG9vck11bHRpcGx5QnkoZmxvb3JNdWx0aXBseUJ5KTtcbiAgICAgICBjb25zdCBjZWlsTXVsdGlwbHlCeSA9IChhbW91bnQsIHJhdGlvKSA9PiB7XG4gIHJldHVybiBtdWx0aXBseUhlbHBlcihhbW91bnQsIHJhdGlvLCBjZWlsRGl2aWRlKTtcbn07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovJGjNj19vbmNlLmNlaWxNdWx0aXBseUJ5KGNlaWxNdWx0aXBseUJ5KTtcbiAgICAgICBjb25zdCBtdWx0aXBseUJ5ID0gKGFtb3VudCwgcmF0aW8pID0+IHtcbiAgcmV0dXJuIG11bHRpcGx5SGVscGVyKGFtb3VudCwgcmF0aW8sIGJhbmtlcnNEaXZpZGUpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEBwYXJhbSB7YW55fSBkaXZpZGVPcFxuICogQHJldHVybnMge0Ftb3VudDwnbmF0Jz59XG4gKi8kaM2PX29uY2UubXVsdGlwbHlCeShtdWx0aXBseUJ5KTtcbmNvbnN0IGRpdmlkZUhlbHBlciA9IChhbW91bnQsIHJhdGlvLCBkaXZpZGVPcCkgPT4ge1xuICBBbW91bnRNYXRoLmNvZXJjZShhbW91bnQuYnJhbmQsIGFtb3VudCk7XG4gIGFzc2VydElzUmF0aW8ocmF0aW8pO1xuICBhbW91bnQuYnJhbmQgPT09IHJhdGlvLm51bWVyYXRvci5icmFuZCB8fFxuICAgIEZhaWxgYW1vdW50J3MgYnJhbmQgJHtxKGFtb3VudC5icmFuZCl9IG11c3QgbWF0Y2ggcmF0aW8ncyBudW1lcmF0b3IgJHtxKFxuICAgICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxuICAgICl9YDtcblxuICByZXR1cm4gLyoqIEB0eXBlIHtBbW91bnQ8J25hdCc+fSAqLyAoXG4gICAgQW1vdW50TWF0aC5tYWtlKFxuICAgICAgcmF0aW8uZGVub21pbmF0b3IuYnJhbmQsXG4gICAgICBkaXZpZGVPcChcbiAgICAgICAgbXVsdGlwbHkoYW1vdW50LnZhbHVlLCByYXRpby5kZW5vbWluYXRvci52YWx1ZSksXG4gICAgICAgIHJhdGlvLm51bWVyYXRvci52YWx1ZSxcbiAgICAgICksXG4gICAgKVxuICApO1xufTtcblxuLyoqXG4gKiBEaXZpZGUgdGhlIGFtb3VudCBieSB0aGUgcmF0aW8sIHRydW5jYXRpbmcgdGhlIHJlbWFpbmRlci5cbiAqXG4gKiBAdHlwZSB7U2NhbGVBbW91bnR9XG4gKi9cbiAgICAgICBjb25zdCBmbG9vckRpdmlkZUJ5ID0gKGFtb3VudCwgcmF0aW8pID0+IHtcbiAgcmV0dXJuIGRpdmlkZUhlbHBlcihhbW91bnQsIHJhdGlvLCBmbG9vckRpdmlkZSk7XG59O1xuXG4vKipcbiAqIERpdmlkZSB0aGUgYW1vdW50IGJ5IHRoZSByYXRpbywgcm91bmRpbmcgdXAgdGhlIHJlbWFpbmRlci5cbiAqXG4gKiBAdHlwZSB7U2NhbGVBbW91bnR9XG4gKi8kaM2PX29uY2UuZmxvb3JEaXZpZGVCeShmbG9vckRpdmlkZUJ5KTtcbiAgICAgICBjb25zdCBjZWlsRGl2aWRlQnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gZGl2aWRlSGVscGVyKGFtb3VudCwgcmF0aW8sIGNlaWxEaXZpZGUpO1xufTtcblxuLyoqXG4gKiBEaXZpZGUgdGhlIGFtb3VudCBieSB0aGUgcmF0aW8sIHJvdW5kaW5nIHRvIG5lYXJlc3Qgd2l0aCB0aWVzIHRvIGV2ZW4gKGFrYVxuICogQmFua2VyJ3MgUm91bmRpbmcpIGFzIGluIElFRUUgNzU0IGRlZmF1bHQgcm91bmRpbmcuXG4gKlxuICogQHR5cGUge1NjYWxlQW1vdW50fVxuICovJGjNj19vbmNlLmNlaWxEaXZpZGVCeShjZWlsRGl2aWRlQnkpO1xuICAgICAgIGNvbnN0IGRpdmlkZUJ5ID0gKGFtb3VudCwgcmF0aW8pID0+IHtcbiAgcmV0dXJuIGRpdmlkZUhlbHBlcihhbW91bnQsIHJhdGlvLCBiYW5rZXJzRGl2aWRlKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRozY9fb25jZS5kaXZpZGVCeShkaXZpZGVCeSk7XG4gICAgICAgY29uc3QgaW52ZXJ0UmF0aW8gPSByYXRpbyA9PiB7XG4gIGFzc2VydElzUmF0aW8ocmF0aW8pO1xuXG4gIHJldHVybiBtYWtlUmF0aW8oXG4gICAgcmF0aW8uZGVub21pbmF0b3IudmFsdWUsXG4gICAgcmF0aW8uZGVub21pbmF0b3IuYnJhbmQsXG4gICAgcmF0aW8ubnVtZXJhdG9yLnZhbHVlLFxuICAgIHJhdGlvLm51bWVyYXRvci5icmFuZCxcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRozY9fb25jZS5pbnZlcnRSYXRpbyhpbnZlcnRSYXRpbyk7XG4gICAgICAgY29uc3QgYWRkUmF0aW9zID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGFzc2VydElzUmF0aW8ocmlnaHQpO1xuICBhc3NlcnRJc1JhdGlvKGxlZnQpO1xuICBsZWZ0Lm51bWVyYXRvci5icmFuZCA9PT0gcmlnaHQubnVtZXJhdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBudW1lcmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gO1xuICBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kID09PSByaWdodC5kZW5vbWluYXRvci5icmFuZCB8fFxuICAgIEZhaWxgZGVub21pbmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gO1xuXG4gIC8qIFNpbXBsaWZ5aW5nIHRoZSBleHByZXNzaW9uOiovXG4gIC8qIChhbmQgKyBibmQpIC8geSBkKioyKi9cbiAgLyogKGEgKyBiKSBuZCAvIHkgZCoqMiovXG4gIC8qICgoYSArIGIpIG4gLyB5IGQpICogKGQgLyBkKSovXG4gIC8qIChhICsgYikgbiAvIHlkKi9cbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICBhZGQoXG4gICAgICBtdWx0aXBseShsZWZ0Lm51bWVyYXRvci52YWx1ZSwgcmlnaHQuZGVub21pbmF0b3IudmFsdWUpLCAvKiBhIG5kKi9cbiAgICAgIG11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUsIHJpZ2h0Lm51bWVyYXRvci52YWx1ZSkgIC8qIGIgbmQqL1xuICAgICksIC8qIChhICsgYikgbmQqL1xuICAgIGxlZnQubnVtZXJhdG9yLmJyYW5kLFxuICAgIG11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUsIHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSwgLyogeSBkKioyKi9cbiAgICBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kLFxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhdGlvfSBsZWZ0XG4gKiBAcGFyYW0ge1JhdGlvfSByaWdodFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjNj19vbmNlLmFkZFJhdGlvcyhhZGRSYXRpb3MpO1xuICAgICAgIGNvbnN0IHN1YnRyYWN0UmF0aW9zID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGFzc2VydElzUmF0aW8ocmlnaHQpO1xuICBhc3NlcnRJc1JhdGlvKGxlZnQpO1xuICBsZWZ0Lm51bWVyYXRvci5icmFuZCA9PT0gcmlnaHQubnVtZXJhdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBudW1lcmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gO1xuICBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kID09PSByaWdodC5kZW5vbWluYXRvci5icmFuZCB8fFxuICAgIEZhaWxgZGVub21pbmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gO1xuXG4gIHJldHVybiBtYWtlUmF0aW8oXG4gICAgc3VidHJhY3QoXG4gICAgICBtdWx0aXBseShsZWZ0Lm51bWVyYXRvci52YWx1ZSwgcmlnaHQuZGVub21pbmF0b3IudmFsdWUpLCAvKiBhIG5kKi9cbiAgICAgIG11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUsIHJpZ2h0Lm51bWVyYXRvci52YWx1ZSkgIC8qIGIgbmQqL1xuICAgICksIC8qIChhIC0gYikgbmQqL1xuICAgIGxlZnQubnVtZXJhdG9yLmJyYW5kLFxuICAgIG11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUsIHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSwgLyogeSBkKioyKi9cbiAgICBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kLFxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhdGlvfSBsZWZ0XG4gKiBAcGFyYW0ge1JhdGlvfSByaWdodFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjNj19vbmNlLnN1YnRyYWN0UmF0aW9zKHN1YnRyYWN0UmF0aW9zKTtcbiAgICAgICBjb25zdCBtdWx0aXBseVJhdGlvcyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICBhc3NlcnRJc1JhdGlvKHJpZ2h0KTtcbiAgYXNzZXJ0SXNSYXRpbyhsZWZ0KTtcblxuICBjb25zdCBnZXRSZW1haW5pbmdCcmFuZHMgPSAoKSA9PiB7XG4gICAgLyogUHJlZmVyIHJlc3VsdHMgdGhhdCBoYXZlIHRoZSBzYW1lIGJyYW5kIGFzIHRoZSBsZWZ0IG9wZXJhbmQuKi9cbiAgICBpZiAocmlnaHQubnVtZXJhdG9yLmJyYW5kID09PSByaWdodC5kZW5vbWluYXRvci5icmFuZCkge1xuICAgICAgcmV0dXJuIFtsZWZ0Lm51bWVyYXRvci5icmFuZCwgbGVmdC5kZW5vbWluYXRvci5icmFuZF07XG4gICAgfVxuICAgIGlmIChyaWdodC5udW1lcmF0b3IuYnJhbmQgPT09IGxlZnQuZGVub21pbmF0b3IuYnJhbmQpIHtcbiAgICAgIHJldHVybiBbbGVmdC5udW1lcmF0b3IuYnJhbmQsIHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiAgICB9XG4gICAgaWYgKGxlZnQubnVtZXJhdG9yLmJyYW5kID09PSByaWdodC5kZW5vbWluYXRvci5icmFuZCkge1xuICAgICAgcmV0dXJuIFtyaWdodC5udW1lcmF0b3IuYnJhbmQsIGxlZnQuZGVub21pbmF0b3IuYnJhbmRdO1xuICAgIH1cbiAgICBpZiAobGVmdC5udW1lcmF0b3IuYnJhbmQgPT09IGxlZnQuZGVub21pbmF0b3IuYnJhbmQpIHtcbiAgICAgIHJldHVybiBbcmlnaHQubnVtZXJhdG9yLmJyYW5kLCByaWdodC5kZW5vbWluYXRvci5icmFuZF07XG4gICAgfVxuICAgIHRocm93IEZhaWxgYXQgbGVhc3Qgb25lIGJyYW5kIG11c3QgY2FuY2VsIG91dDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG4gIH07XG5cbiAgY29uc3QgW251bWVyYXRvckJyYW5kLCBkZW5vbWluYXRvckJyYW5kXSA9IGdldFJlbWFpbmluZ0JyYW5kcygpO1xuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIG11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLCByaWdodC5udW1lcmF0b3IudmFsdWUpLFxuICAgIG51bWVyYXRvckJyYW5kLFxuICAgIG11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUsIHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSxcbiAgICBkZW5vbWluYXRvckJyYW5kLFxuICApO1xufTtcblxuLyoqXG4gKiBJZiByYXRpbyBpcyBiZXR3ZWVuIDAgYW5kIDEsIHN1YnRyYWN0IGZyb20gMS5cbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHJldHVybnMge1JhdGlvfVxuICovJGjNj19vbmNlLm11bHRpcGx5UmF0aW9zKG11bHRpcGx5UmF0aW9zKTtcbiAgICAgICBjb25zdCBvbmVNaW51cyA9IHJhdGlvID0+IHtcbiAgYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG4gIHJhdGlvLm51bWVyYXRvci5icmFuZCA9PT0gcmF0aW8uZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgICBGYWlsYG9uZU1pbnVzIG9ubHkgc3VwcG9ydHMgcmF0aW9zIHdpdGggYSBzaW5nbGUgYnJhbmQsIGJ1dCAke3JhdGlvLm51bWVyYXRvci5icmFuZH0gZG9lc24ndCBtYXRjaCAke3JhdGlvLmRlbm9taW5hdG9yLmJyYW5kfWA7XG4gIHJhdGlvLm51bWVyYXRvci52YWx1ZSA8PSByYXRpby5kZW5vbWluYXRvci52YWx1ZSB8fFxuICAgIEZhaWxgUGFyYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE6ICR7cmF0aW8ubnVtZXJhdG9yLnZhbHVlfS8ke3JhdGlvLmRlbm9taW5hdG9yLnZhbHVlfWA7XG4gIHJldHVybiBtYWtlUmF0aW8oXG4gICAgc3VidHJhY3QocmF0aW8uZGVub21pbmF0b3IudmFsdWUsIHJhdGlvLm51bWVyYXRvci52YWx1ZSksXG4gICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxuICAgIHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlLFxuICAgIHJhdGlvLm51bWVyYXRvci5icmFuZCxcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjNj19vbmNlLm9uZU1pbnVzKG9uZU1pbnVzKTtcbiAgICAgICBjb25zdCByYXRpb0dURSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICBpZiAobGVmdC5udW1lcmF0b3IuYnJhbmQgPT09IHJpZ2h0Lm51bWVyYXRvci5icmFuZCkge1xuICAgIGxlZnQuZGVub21pbmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kIHx8XG4gICAgICBGYWlsYG51bWVyYXRvciBicmFuZHMgbWF0Y2gsIGJ1dCBkZW5vbWluYXRvciBicmFuZHMgZG9uJ3Q6ICR7cShsZWZ0KX0gJHtxKFxuICAgICAgICByaWdodCxcbiAgICAgICl9YDtcbiAgfSBlbHNlIGlmIChsZWZ0Lm51bWVyYXRvci5icmFuZCA9PT0gbGVmdC5kZW5vbWluYXRvci5icmFuZCkge1xuICAgIHJpZ2h0Lm51bWVyYXRvci5icmFuZCA9PT0gcmlnaHQuZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgICAgIEZhaWxgbGVmdGhhbmQgYnJhbmRzIG1hdGNoLCBidXQgcmlnaHRoYW5kIGJyYW5kcyBkb24ndDogJHtxKGxlZnQpfSAke3EoXG4gICAgICAgIHJpZ2h0LFxuICAgICAgKX1gO1xuICB9XG4gIHJldHVybiBuYXRTYWZlTWF0aC5pc0dURShcbiAgICBtdWx0aXBseShsZWZ0Lm51bWVyYXRvci52YWx1ZSwgcmlnaHQuZGVub21pbmF0b3IudmFsdWUpLFxuICAgIG11bHRpcGx5KHJpZ2h0Lm51bWVyYXRvci52YWx1ZSwgbGVmdC5kZW5vbWluYXRvci52YWx1ZSksXG4gICk7XG59O1xuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByYXRpb3MgYXJlIHRoZSBzYW1lIHZhbHVlcyAoZXF1YWwgb3IgZXF1aXZhbGFudCBtYXkgcmV0dXJuXG4gKiBmYWxzZSlcbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSBsZWZ0XG4gKiBAcGFyYW0ge1JhdGlvfSByaWdodFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaM2PX29uY2UucmF0aW9HVEUocmF0aW9HVEUpO1xuICAgICAgIGNvbnN0IHJhdGlvc1NhbWUgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIChcbiAgICBBbW91bnRNYXRoLmlzRXF1YWwobGVmdC5udW1lcmF0b3IsIHJpZ2h0Lm51bWVyYXRvcikgJiZcbiAgICBBbW91bnRNYXRoLmlzRXF1YWwobGVmdC5kZW5vbWluYXRvciwgcmlnaHQuZGVub21pbmF0b3IpXG4gICk7XG59O1xuXG4vKipcbiAqIE1ha2UgYSBuZXcgcmF0aW8gd2l0aCBhIHNtYWxsZXIgZGVub21pbmF0b3IgdGhhdCBhcHByb3hpbWF0ZXMgdGhlIHJhdGlvLiBJZlxuICogdGhlIHByb3Bvc2VkIGRlbm9taW5hdG9yIGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IG9uZSwgcmV0dXJuIHRoZVxuICogb3JpZ2luYWwuXG4gKlxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEBwYXJhbSB7YmlnaW50fSBuZXdEZW5cbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRozY9fb25jZS5yYXRpb3NTYW1lKHJhdGlvc1NhbWUpO1xuICAgICAgIGNvbnN0IHF1YW50aXplID0gKHJhdGlvLCBuZXdEZW4pID0+IHtcbiAgY29uc3Qgb2xkRGVuID0gcmF0aW8uZGVub21pbmF0b3IudmFsdWU7XG4gIGNvbnN0IG9sZE51bSA9IHJhdGlvLm51bWVyYXRvci52YWx1ZTtcbiAgaWYgKG5ld0RlbiA+IG9sZERlbikge1xuICAgIHJldHVybiByYXRpbztcbiAgfVxuXG4gIGNvbnN0IG5ld051bSA9XG4gICAgbmV3RGVuID09PSBvbGREZW4gPyBvbGROdW0gOiBiYW5rZXJzRGl2aWRlKG9sZE51bSAqIG5ld0Rlbiwgb2xkRGVuKTtcbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICBuZXdOdW0sXG4gICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxuICAgIG5ld0RlbixcbiAgICByYXRpby5kZW5vbWluYXRvci5icmFuZCxcbiAgKTtcbn07JGjNj19vbmNlLnF1YW50aXplKHF1YW50aXplKTtcblxuY29uc3QgTlVNRVJJQ19SRSA9IC9eKFxcZFxcZCopKD86XFwuKFxcZCopKT8kLztcbi8qKiBAdHlwZWRlZiB7YmlnaW50IHwgbnVtYmVyIHwgc3RyaW5nfSBQYXJzYWJsZU51bWJlciAqL1xuXG4vKipcbiAqIENyZWF0ZSBhIHJhdGlvIGZyb20gYSBnaXZlbiBudW1lcmljIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7UGFyc2FibGVOdW1iZXJ9IG51bWVyaWNcbiAqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBudW1lcmF0b3JCcmFuZFxuICogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IFtkZW5vbWluYXRvckJyYW5kXVxuICogQHJldHVybnMge1JhdGlvfVxuICovXG4gICAgICAgY29uc3QgcGFyc2VSYXRpbyA9IChcbiAgbnVtZXJpYyxcbiAgbnVtZXJhdG9yQnJhbmQsXG4gIGRlbm9taW5hdG9yQnJhbmQgPSBudW1lcmF0b3JCcmFuZCxcbikgPT4ge1xuICBjb25zdCBtYXRjaCA9IGAke251bWVyaWN9YC5tYXRjaChOVU1FUklDX1JFKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IEZhaWxgSW52YWxpZCBudW1lcmljIGRhdGE6ICR7bnVtZXJpY31gO1xuICB9XG5cbiAgY29uc3QgW18sIHdob2xlLCBwYXJ0ID0gJyddID0gbWF0Y2g7XG4gIHJldHVybiBtYWtlUmF0aW8oXG4gICAgQmlnSW50KGAke3dob2xlfSR7cGFydH1gKSxcbiAgICBudW1lcmF0b3JCcmFuZCxcbiAgICAxMG4gKiogQmlnSW50KHBhcnQubGVuZ3RoKSxcbiAgICBkZW5vbWluYXRvckJyYW5kLFxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBQYXJzYWJsZU51bWJlcn1cbiAqLyRozY9fb25jZS5wYXJzZVJhdGlvKHBhcnNlUmF0aW8pO1xuICAgICAgIGNvbnN0IGFzc2VydFBhcnNhYmxlTnVtYmVyID0gc3BlY2ltZW4gPT4ge1xuICBjb25zdCBtYXRjaCA9IGAke3NwZWNpbWVufWAubWF0Y2goTlVNRVJJQ19SRSk7XG4gIG1hdGNoIHx8IEZhaWxgSW52YWxpZCBudW1lcmljIGRhdGE6ICR7c3BlY2ltZW59YDtcbn07XG5cbi8qKlxuICogUmF0aW9zIG1pZ2h0IGJlIGdyZWF0ZXIgb3IgbGVzcyB0aGFuIG9uZS5cbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHJldHVybnMge251bWJlcn1cbiAqLyRozY9fb25jZS5hc3NlcnRQYXJzYWJsZU51bWJlcihhc3NlcnRQYXJzYWJsZU51bWJlcik7XG4gICAgICAgY29uc3QgcmF0aW9Ub051bWJlciA9IHJhdGlvID0+IHtcbiAgY29uc3QgbiA9IE51bWJlcihyYXRpby5udW1lcmF0b3IudmFsdWUpO1xuICBjb25zdCBkID0gTnVtYmVyKHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlKTtcbiAgcmV0dXJuIG4gLyBkO1xufTskaM2PX29uY2UucmF0aW9Ub051bWJlcihyYXRpb1RvTnVtYmVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydElzUmF0aW8iOlsiYXNzZXJ0SXNSYXRpbyJdLCJtYWtlUmF0aW8iOlsibWFrZVJhdGlvIl0sIm1ha2VSYXRpb0Zyb21BbW91bnRzIjpbIm1ha2VSYXRpb0Zyb21BbW91bnRzIl0sImZsb29yTXVsdGlwbHlCeSI6WyJmbG9vck11bHRpcGx5QnkiXSwiY2VpbE11bHRpcGx5QnkiOlsiY2VpbE11bHRpcGx5QnkiXSwibXVsdGlwbHlCeSI6WyJtdWx0aXBseUJ5Il0sImZsb29yRGl2aWRlQnkiOlsiZmxvb3JEaXZpZGVCeSJdLCJjZWlsRGl2aWRlQnkiOlsiY2VpbERpdmlkZUJ5Il0sImRpdmlkZUJ5IjpbImRpdmlkZUJ5Il0sImludmVydFJhdGlvIjpbImludmVydFJhdGlvIl0sImFkZFJhdGlvcyI6WyJhZGRSYXRpb3MiXSwic3VidHJhY3RSYXRpb3MiOlsic3VidHJhY3RSYXRpb3MiXSwibXVsdGlwbHlSYXRpb3MiOlsibXVsdGlwbHlSYXRpb3MiXSwib25lTWludXMiOlsib25lTWludXMiXSwicmF0aW9HVEUiOlsicmF0aW9HVEUiXSwicmF0aW9zU2FtZSI6WyJyYXRpb3NTYW1lIl0sInF1YW50aXplIjpbInF1YW50aXplIl0sInBhcnNlUmF0aW8iOlsicGFyc2VSYXRpbyJdLCJhc3NlcnRQYXJzYWJsZU51bWJlciI6WyJhc3NlcnRQYXJzYWJsZU51bWJlciJdLCJyYXRpb1RvTnVtYmVyIjpbInJhdGlvVG9OdW1iZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAcC8W5YoHAACKBwAAJAAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9zYWZlTWF0aC5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJuYXRTYWZlTWF0aCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE5hdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV1dKTtcblxuLyoqIEB0eXBlZGVmIHsoeDogbnVtYmVyIHwgYmlnaW50LCB5OiBudW1iZXIgfCBiaWdpbnQpID0+IGJpZ2ludH0gTmF0T3AgKi9cblxuLyoqXG4gKiBUaGVzZSBvcGVyYXRpb25zIHNob3VsZCBiZSB1c2VkIGZvciBjYWxjdWxhdGlvbnMgd2l0aCB0aGUgdmFsdWVzIG9mIGJhc2ljXG4gKiBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogbmF0U2FmZU1hdGggaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBkaXJlY3RseSwgYW5kIHNvIGl0IG5lZWRzIHRvIHZhbGlkYXRlIHRoZVxuICogaW5wdXRzLCBhcyB3ZWxsIGFzIHRoZSBvdXRwdXRzIHdoZW4gbmVjZXNzYXJ5LlxuICovXG4gICAgICAgY29uc3QgbmF0U2FmZU1hdGggPSBoYXJkZW4oe1xuICAvKiogQHR5cGUge05hdE9wfSAqL1xuICAvKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuICBhZGQ6ICh4LCB5KSA9PiBOYXQoeCkgKyBOYXQoeSksXG4gIC8qKiBAdHlwZSB7TmF0T3B9ICovXG4gIHN1YnRyYWN0OiAoeCwgeSkgPT4gTmF0KE5hdCh4KSAtIE5hdCh5KSksXG4gIC8qKiBAdHlwZSB7TmF0T3B9ICovXG4gIG11bHRpcGx5OiAoeCwgeSkgPT4gTmF0KHgpICogTmF0KHkpLFxuICAvKiogQHR5cGUge05hdE9wfSAqL1xuICBmbG9vckRpdmlkZTogKHgsIHkpID0+IE5hdCh4KSAvIE5hdCh5KSxcbiAgLyoqIEB0eXBlIHtOYXRPcH0gKi9cbiAgY2VpbERpdmlkZTogKHgsIHkpID0+IHtcbiAgICB5ID0gTmF0KHkpO1xuICAgIHJldHVybiBOYXQoTmF0KHgpICsgeSAtIDFuKSAvIHk7XG4gIH0sXG4gIC8qKlxuICogRGl2aWRlIHVzaW5nIGhhbGYtdG8tZXZlbiAoYWthIEJhbmtlcidzIFJvdW5kaW5nKSBhcyBpbiBJRUVFIDc3NCBkZWZhdWx0XG4gKiByb3VuZGluZ1xuICpcbiAqIEB0eXBlIHtOYXRPcH1cbiAqL1xuICBiYW5rZXJzRGl2aWRlOiAoYSwgYikgPT4ge1xuICAgIGEgPSBOYXQoYSk7XG4gICAgYiA9IE5hdChiKTtcblxuICAgIGNvbnN0IGRpdiA9IGEgLyBiO1xuICAgIGNvbnN0IHJlbSA9IGEgJSBiO1xuICAgIC8qIGlmIHJlbWFpbmRlciA+IGhhbGYgZGl2aXNvciwgc2hvdWxkIGhhdmUgcm91bmRlZCB1cCBpbnN0ZWFkIG9mIGRvd24sIHNvIGFkZCAxKi9cbiAgICBpZiAocmVtICogMm4gPiBiKSB7XG4gICAgICByZXR1cm4gZGl2ICsgMW47XG4gICAgfSBlbHNlIGlmIChyZW0gKiAybiA9PT0gYikge1xuICAgICAgLyogQWRkIDEgaWYgcmVzdWx0IGlzIG9kZCB0byBnZXQgYW4gZXZlbiByZXR1cm4gdmFsdWUqL1xuICAgICAgaWYgKGRpdiAlIDJuID09PSAxbikgcmV0dXJuIGRpdiArIDFuO1xuICAgIH1cbiAgICByZXR1cm4gZGl2O1xuICB9LFxuICAvKiogQHR5cGUgeyh4OiBudW1iZXIgfCBiaWdpbnQsIHk6IG51bWJlciB8IGJpZ2ludCkgPT4gYm9vbGVhbn0gKi9cbiAgaXNHVEU6ICh4LCB5KSA9PiBOYXQoeCkgPj0gTmF0KHkpLFxufSk7JGjNj19vbmNlLm5hdFNhZmVNYXRoKG5hdFNhZmVNYXRoKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdFNhZmVNYXRoIjpbIm5hdFNhZmVNYXRoIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGDkrFsZBwAAGQcAAC0AAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL25vdGlmaWVyIl0sImV4cG9ydHMiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxwcm92aWRlTGF6eSxtYWtlTm90aWZpZXJLaXQ7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcInByb3ZpZGVMYXp5XCIsWyRozY9fYSA9PiAocHJvdmlkZUxhenkgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlTm90aWZpZXJLaXRcIixbJGjNj19hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UHVyc2V9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7Tm90aWZpZXJSZWNvcmR9IGZyb20gJ0BhZ29yaWMvbm90aWZpZXInO1xuICogQGltcG9ydCB7V2Vha01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqL1xuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuICAgICAgIGNvbnN0IG1ha2VUcmFuc2llbnROb3RpZmllcktpdCA9ICgpID0+IHtcbiAgLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UHVyc2UsIE5vdGlmaWVyUmVjb3JkPGFueT4+fSAqL1xuICBjb25zdCB0cmFuc2llbnROb3RpZmVyS2l0cyA9IG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUoXG4gICAgJ3RyYW5zaWVudE5vdGlmZXJLaXRzJyxcbiAgKTtcblxuICBjb25zdCBwcm92aWRlTm90aWZpZXJLaXQgPSBrZXkgPT5cbiAgICBwcm92aWRlTGF6eSh0cmFuc2llbnROb3RpZmVyS2l0cywga2V5LCAoKSA9PlxuICAgICAgbWFrZU5vdGlmaWVyS2l0KGtleS5nZXRDdXJyZW50QW1vdW50KCkpLFxuICAgICk7XG5cbiAgY29uc3QgcHJvdmlkZU5vdGlmaWVyID0ga2V5ID0+IHByb3ZpZGVOb3RpZmllcktpdChrZXkpLm5vdGlmaWVyO1xuICBjb25zdCB1cGRhdGUgPSAoa2V5LCBuZXdWYWx1ZSkgPT4ge1xuICAgIGlmICh0cmFuc2llbnROb3RpZmVyS2l0cy5oYXMoa2V5KSkge1xuICAgICAgY29uc3QgeyB1cGRhdGVyIH0gPSB0cmFuc2llbnROb3RpZmVyS2l0cy5nZXQoa2V5KTtcbiAgICAgIHVwZGF0ZXIudXBkYXRlU3RhdGUobmV3VmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4geyBwcm92aWRlTm90aWZpZXIsIHVwZGF0ZSB9O1xufTskaM2PX29uY2UubWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG5oYXJkZW4obWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFuc2llbnROb3RpZmllcktpdCI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5frfq0AtAABALQAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiQW1vdW50UGF0dGVyblNoYXBlIiwiQW1vdW50U2hhcGUiLCJBc3NldEtpbmRTaGFwZSIsIkJyYW5kSSIsIkJyYW5kU2hhcGUiLCJEZXBvc2l0RmFjZXRTaGFwZSIsIkRpc3BsYXlJbmZvU2hhcGUiLCJJc3N1ZXJLaXRTaGFwZSIsIklzc3VlclNoYXBlIiwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIiwiTWludFNoYXBlIiwiTm90aWZpZXJTaGFwZSIsIlBheW1lbnRTaGFwZSIsIlB1cnNlU2hhcGUiLCJSYXRpb1NoYXBlIiwiaXNDb3B5QmFnVmFsdWUiLCJpc0NvcHlTZXRWYWx1ZSIsImlzTmF0VmFsdWUiLCJpc1NldFZhbHVlIiwibWFrZUlzc3VlckludGVyZmFjZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNLG1hdGNoZXMsZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZUd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoqXG4gKiBAaW1wb3J0IHtBbW91bnRWYWx1ZSwgUmF0aW99IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm59IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnXG4gKiBAaW1wb3J0IHtDb3B5QmFnLCBDb3B5U2V0LCBQYXR0ZXJufSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtOYXRWYWx1ZSwgU2V0VmFsdWV9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbiAgICAgICBjb25zdCBCcmFuZFNoYXBlID0gTS5yZW1vdGFibGUoJ0JyYW5kJyk7JGjNj19vbmNlLkJyYW5kU2hhcGUoQnJhbmRTaGFwZSk7XG4gICAgICAgY29uc3QgSXNzdWVyU2hhcGUgPSBNLnJlbW90YWJsZSgnSXNzdWVyJyk7JGjNj19vbmNlLklzc3VlclNoYXBlKElzc3VlclNoYXBlKTtcbiAgICAgICBjb25zdCBQYXltZW50U2hhcGUgPSBNLnJlbW90YWJsZSgnUGF5bWVudCcpOyRozY9fb25jZS5QYXltZW50U2hhcGUoUGF5bWVudFNoYXBlKTtcbiAgICAgICBjb25zdCBQdXJzZVNoYXBlID0gTS5yZW1vdGFibGUoJ1B1cnNlJyk7JGjNj19vbmNlLlB1cnNlU2hhcGUoUHVyc2VTaGFwZSk7XG4gICAgICAgY29uc3QgRGVwb3NpdEZhY2V0U2hhcGUgPSBNLnJlbW90YWJsZSgnRGVwb3NpdEZhY2V0Jyk7JGjNj19vbmNlLkRlcG9zaXRGYWNldFNoYXBlKERlcG9zaXRGYWNldFNoYXBlKTtcbiAgICAgICBjb25zdCBOb3RpZmllclNoYXBlID0gTS5yZW1vdGFibGUoJ05vdGlmaWVyJyk7JGjNj19vbmNlLk5vdGlmaWVyU2hhcGUoTm90aWZpZXJTaGFwZSk7XG4gICAgICAgY29uc3QgTWludFNoYXBlID0gTS5yZW1vdGFibGUoJ01pbnQnKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgTmF0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdCBpcyBhXG4gKiBub24tbmVnYXRpdmUgYmlnaW50LCB0aGVuIGl0IHJlcHJlc2VudHMgdGhhdCBtYW55IHVuaXRzIG9mIHRoZSBmdW5naWJsZSBhc3NldFxuICogcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQuIFRoZSBicmFuZCBvZiB0aGF0IGFtb3VudCBzaG91bGQgaW5kZWVkIHJlcHJlc2VudFxuICogYSBraW5kIG9mIGFzc2V0IGNvbnNpc3Rpbmcgb2YgYSBjb3VudGFibGUgc2V0IG9mIGZ1bmdpYmxlIHVuaXRzLlxuICovJGjNj19vbmNlLk1pbnRTaGFwZShNaW50U2hhcGUpO1xuY29uc3QgTmF0VmFsdWVTaGFwZSA9IE0ubmF0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlTZXQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgc2V0IG9mIHRob3NlIGtleXMsIHdoZXJlIGVhY2gga2V5XG4gKiByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBub24tZnVuZ2libGUgaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LCBmcm9tIHRoZVxuICogbm9uLWZ1bmdpYmxlIGFzc2V0IGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBhbW91bnRcbiAqIGl0c2VsZiByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWQgdG8gYW55IG9mIHRoZSBvdGhlclxuICogaXRlbXMgZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlIHRoYXQgd2VcbiAqIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0IHRoZSBjb2RlIHRoYXQgaG9sZHNcbiAqIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBicmFuZCwgb25seVxuICogbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0cyBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnlcbiAqIGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5XG4gKiBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXQgd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlXG4gKiBzYXRpc2ZpZWQuIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5U2V0VmFsdWVTaGFwZSA9IE0uc2V0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIFNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXQgaXMgYVxuICogQ29weUFycmF5IG9mIHBhc3NhYmxlIEtleXMuIFRoaXMgcmVwcmVzZW50YXRpb24gaXMgZGVwcmVjYXRlZC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqICAgQ29weVNldFZhbHVlcy5cbiAqL1xuY29uc3QgU2V0VmFsdWVTaGFwZSA9IE0uYXJyYXlPZihNLmtleSgpKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weUJhZ1ZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weUJhZywgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBiYWcgKG11bHRpc2V0KSBvZiB0aG9zZSBrZXlzLCB3aGVyZSBlYWNoXG4gKiBrZXkgcmVwcmVzZW50cyBzb21lIGluZGl2aWR1YWwgc2VtaS1mdW5naWJsZSBpdGVtLCBsaWtlIGEgY29uY2VydCB0aWNrZXQsXG4gKiBmcm9tIHRoZSBzZW1pLWZ1bmdpYmxlIGFzc2V0IGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZVxuICogbnVtYmVyIG9mIHRpbWVzIHRoYXQga2V5IGFwcGVhcnMgaW4gdGhlIGJhZyBpcyB0aGUgbnVtYmVyIG9mIGZ1bmdpYmxlIHVuaXRzXG4gKiBvZiB0aGF0IGtleS4gVGhlIGFtb3VudCBpdHNlbGYgcmVwcmVzZW50cyB0aGUgYmFnIG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkXG4gKiB0byBhbnkgb2YgdGhlIG90aGVyIGl0ZW1zIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZSB0aGF0IHdlXG4gKiBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdCB0aGUgY29kZSB0aGF0IGhvbGRzXG4gKiB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgYnJhbmQsIG9ubHlcbiAqIG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHMgb2YgdGhhdCBhc3NldCBjbGFzcyBhcyBkZWZpbmVkIGJ5XG4gKiBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlciBhbiBhbW91bnQgZXhwcmVzc2luZywgZm9yIGV4YW1wbGUsIHRoYXQgdGhleVxuICogXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0IHdpbGwgbmV2ZXIgYmUgbWludGVkLiBUaGF0IHdhbnQgd2lsbCBuZXZlciBiZVxuICogc2F0aXNmaWVkLiBcIllvdSBjYW4ndCBhbHdheXMgZ2V0Li4uXCJcbiAqL1xuY29uc3QgQ29weUJhZ1ZhbHVlU2hhcGUgPSBNLmJhZygpO1xuXG5jb25zdCBBbW91bnRWYWx1ZVNoYXBlID0gTS5vcihcbiAgTmF0VmFsdWVTaGFwZSxcbiAgQ29weVNldFZhbHVlU2hhcGUsXG4gIFNldFZhbHVlU2hhcGUsXG4gIENvcHlCYWdWYWx1ZVNoYXBlLFxuKTtcblxuICAgICAgIGNvbnN0IEFtb3VudFNoYXBlID0geyBicmFuZDogQnJhbmRTaGFwZSwgdmFsdWU6IEFtb3VudFZhbHVlU2hhcGUgfTskaM2PX29uY2UuQW1vdW50U2hhcGUoQW1vdW50U2hhcGUpO1xuaGFyZGVuKEFtb3VudFNoYXBlKTtcblxuLyoqXG4gKiBUbyBiZSB1c2VkIHRvIGd1YXJkIGFuIGFtb3VudCBwYXR0ZXJuIGFyZ3VtZW50LCBpLmUuLCBhbiBhcmd1bWVudCB3aGljaCBpcyBhXG4gKiBwYXR0ZXJuIHRoYXQgY2FuIGJlIHVzZWQgdG8gdGVzdCBhbW91bnRzLiBTaW5jZSBhbW91bnRzIGFyZSBrZXlzLCBhbnl3aGVyZSBhblxuICogYW1vdW50IHBhdHRlcm4gaXMgZXhwZWN0ZWQsIGFuIGFtb3VudCBjYW4gYmUgcHJvdmlkZWQgYW5kIHdpbGwgbWF0Y2ggb25seVxuICogdGhhdCBjb25jcmV0ZSBhbW91bnQsIGkuZS4sIGFtb3VudHMgdGhhdCBhcmUgYGtleUVRYCB0byB0aGF0IGFtb3VudC5cbiAqXG4gKiBUaGUgYEFtb3VudFNoYXBlYCBndWFyZCBhYm92ZSBpcyBhbiBhbW91bnQgcGF0dGVybi4gQnV0IG5vdCBhbGwgYW1vdW50XG4gKiBwYXR0ZXJucyBhcmUgbGlrZSBgQW1vdW50U2hhcGVgLiBGb3IgZXhhbXBsZSwgYE0uYW55KClgIGlzIGEgdmFsaWQgYW1vdW50XG4gKiBwYXR0ZXJuIHRoYXQgd2lsbCBhZG1pdCBhbnkgYW1vdW50LCBidXQgaXMgZG9lcyBub3QgcmVzZW1ibGUgdGhlXG4gKiBgQW1vdW50U2hhcGVgIHBhdHRlcm4gYWJvdmUuXG4gKi9cbiAgICAgICBjb25zdCBBbW91bnRQYXR0ZXJuU2hhcGUgPSBNLnBhdHRlcm4oKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48UmF0aW8+fSAqLyRozY9fb25jZS5BbW91bnRQYXR0ZXJuU2hhcGUoQW1vdW50UGF0dGVyblNoYXBlKTtcbiAgICAgICBjb25zdCBSYXRpb1NoYXBlID0geyBudW1lcmF0b3I6IEFtb3VudFNoYXBlLCBkZW5vbWluYXRvcjogQW1vdW50U2hhcGUgfTskaM2PX29uY2UuUmF0aW9TaGFwZShSYXRpb1NoYXBlKTtcbmhhcmRlbihSYXRpb1NoYXBlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBOYXQgYmlnaW50LlxuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgTmF0VmFsdWV9XG4gKi9cbiAgICAgICBjb25zdCBpc05hdFZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgTmF0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzTmF0VmFsdWUoaXNOYXRWYWx1ZSk7XG5oYXJkZW4oaXNOYXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgQ29weVNldFxuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgQ29weVNldH1cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weVNldFZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgQ29weVNldFZhbHVlU2hhcGUpOyRozY9fb25jZS5pc0NvcHlTZXRWYWx1ZShpc0NvcHlTZXRWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5U2V0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIHBhc3MgYnkgY29weSBhcnJheSBzdHJ1Y3R1cmUuIERvZXMgbm90IGNoZWNrIGZvclxuICogZHVwbGljYXRlcy4gVG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMsIHVzZSBzZXRNYXRoSGVscGVycy5jb2VyY2UuXG4gKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNoYW5nZSBmcm9tIHVzaW5nIGFycmF5LWJhc2VkIFNldFZhbHVlcyB0byBDb3B5U2V0LWJhc2VkXG4gKiAgIENvcHlTZXRWYWx1ZXMuXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFNldFZhbHVlfVxuICovXG4gICAgICAgY29uc3QgaXNTZXRWYWx1ZSA9IHZhbHVlID0+IG1hdGNoZXModmFsdWUsIFNldFZhbHVlU2hhcGUpOyRozY9fb25jZS5pc1NldFZhbHVlKGlzU2V0VmFsdWUpO1xuaGFyZGVuKGlzU2V0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlCYWdcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlCYWd9XG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlCYWdWYWx1ZSA9IHZhbHVlID0+IG1hdGNoZXModmFsdWUsIENvcHlCYWdWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNDb3B5QmFnVmFsdWUoaXNDb3B5QmFnVmFsdWUpO1xuaGFyZGVuKGlzQ29weUJhZ1ZhbHVlKTtcblxuLyogT25lIEdPT0dPTHRoIHNob3VsZCBiZSBlbm91Z2ggZGVjaW1hbCBwbGFjZXMgZm9yIGFueWJvZHkuKi9cbiAgICAgICBjb25zdCBNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMgPSAxMDA7JGjNj19vbmNlLk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyhNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpO1xuXG4gICAgICAgY29uc3QgQXNzZXRLaW5kU2hhcGUgPSBNLm9yKCduYXQnLCAnc2V0JywgJ2NvcHlTZXQnLCAnY29weUJhZycpOyRozY9fb25jZS5Bc3NldEtpbmRTaGFwZShBc3NldEtpbmRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBEaXNwbGF5SW5mb1NoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge30sXG4gIHtcbiAgICBkZWNpbWFsUGxhY2VzOiBNLmFuZChcbiAgICAgIE0uZ3RlKC1NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpLFxuICAgICAgTS5sdGUoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbiAgICApLFxuICAgIGFzc2V0S2luZDogQXNzZXRLaW5kU2hhcGUsXG4gIH0sXG4gIHtcbiAgICAvKiBJbmNsdWRpbmcgdGhpcyBlbXB0eSBgcmVzdGAgZW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBubyBvdGhlciovXG4gICAgLyogcHJvcGVydGllcyBiZXlvbmQgdGhvc2UgaW4gdGhlIGBiYXNlYCByZWNvcmQuKi9cbiAgfSxcbik7JGjNj19vbmNlLkRpc3BsYXlJbmZvU2hhcGUoRGlzcGxheUluZm9TaGFwZSk7XG5cbiAgICAgICBjb25zdCBJc3N1ZXJLaXRTaGFwZSA9IHtcbiAgYnJhbmQ6IEJyYW5kU2hhcGUsXG4gIG1pbnQ6IE1pbnRTaGFwZSxcbiAgbWludFJlY292ZXJ5UHVyc2U6IFB1cnNlU2hhcGUsXG4gIGlzc3VlcjogSXNzdWVyU2hhcGUsXG4gIGRpc3BsYXlJbmZvOiBEaXNwbGF5SW5mb1NoYXBlLFxufTskaM2PX29uY2UuSXNzdWVyS2l0U2hhcGUoSXNzdWVyS2l0U2hhcGUpO1xuaGFyZGVuKElzc3VlcktpdFNoYXBlKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEludGVyZmFjZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gICAgICAgY29uc3QgQnJhbmRJID0gTS5pbnRlcmZhY2UoJ0JyYW5kJywge1xuICBpc015SXNzdWVyOiBNLmNhbGxXaGVuKE0uYXdhaXQoSXNzdWVyU2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgZ2V0QWxsZWdlZE5hbWU6IE0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG4gIGdldERpc3BsYXlJbmZvOiBNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxuICBnZXRBbW91bnRTaGFwZTogTS5jYWxsKCkucmV0dXJucyhNLnBhdHRlcm4oKSksXG59KTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFticmFuZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYXNzZXRLaW5kU2hhcGVdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFthbW91bnRTaGFwZV1cbiAqLyRozY9fb25jZS5CcmFuZEkoQnJhbmRJKTtcbiAgICAgICBjb25zdCBtYWtlSXNzdWVySW50ZXJmYWNlcyA9IChcbiAgYnJhbmRTaGFwZSA9IEJyYW5kU2hhcGUsXG4gIGFzc2V0S2luZFNoYXBlID0gQXNzZXRLaW5kU2hhcGUsXG4gIGFtb3VudFNoYXBlID0gQW1vdW50U2hhcGUsXG4pID0+IHtcbiAgY29uc3QgSXNzdWVySSA9IE0uaW50ZXJmYWNlKCdJc3N1ZXInLCB7XG4gICAgZ2V0QnJhbmQ6IE0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG4gICAgZ2V0QWxsZWdlZE5hbWU6IE0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG4gICAgZ2V0QXNzZXRLaW5kOiBNLmNhbGwoKS5yZXR1cm5zKGFzc2V0S2luZFNoYXBlKSxcbiAgICBnZXREaXNwbGF5SW5mbzogTS5jYWxsKCkucmV0dXJucyhEaXNwbGF5SW5mb1NoYXBlKSxcbiAgICBtYWtlRW1wdHlQdXJzZTogTS5jYWxsKCkucmV0dXJucyhQdXJzZVNoYXBlKSxcblxuICAgIGlzTGl2ZTogTS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICAgIGdldEFtb3VudE9mOiBNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG4gICAgYnVybjogTS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpXG4gICAgICAub3B0aW9uYWwoQW1vdW50UGF0dGVyblNoYXBlKVxuICAgICAgLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICB9KTtcblxuICBjb25zdCBNaW50SSA9IE0uaW50ZXJmYWNlKCdNaW50Jywge1xuICAgIGdldElzc3VlcjogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG4gICAgbWludFBheW1lbnQ6IE0uY2FsbChhbW91bnRTaGFwZSkucmV0dXJucyhQYXltZW50U2hhcGUpLFxuICB9KTtcblxuICBjb25zdCBQYXltZW50SSA9IE0uaW50ZXJmYWNlKCdQYXltZW50Jywge1xuICAgIGdldEFsbGVnZWRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbiAgfSk7XG5cbiAgY29uc3QgUHVyc2VJID0gTS5pbnRlcmZhY2UoJ1B1cnNlJywge1xuICAgIGdldEFsbGVnZWRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbiAgICBnZXRDdXJyZW50QW1vdW50OiBNLmNhbGwoKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgICBnZXRDdXJyZW50QW1vdW50Tm90aWZpZXI6IE0uY2FsbCgpLnJldHVybnMoTm90aWZpZXJTaGFwZSksXG4gICAgLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbiAgICAvKiBSYXRoZXIsIHRoZSBzZW1hbnRpY3Mgb2YgYGRlcG9zaXRgIHJlcXVpcmUgaXQgdG8gcHJvdmlkZSBpdHMqL1xuICAgIC8qIGNhbGxlcnMgd2l0aCBhIHN0cm9uZyBndWFyYW50ZWUgdGhhdCBgZGVwb3NpdGAgbWVzc2FnZXMgYXJlKi9cbiAgICAvKiBwcm9jZXNzZWQgd2l0aG91dCBmdXJ0aGVyIGRlbGF5IGluIHRoZSBvcmRlciB0aGV5IGFycml2ZS4qL1xuICAgIC8qIFB1cnNlSSB0aGVyZWZvcmUgcmVxdWlyZXMgdGhhdCB0aGUgYHNyY1BheW1lbnRgIGFyZ3VtZW50IGFscmVhZHkqL1xuICAgIC8qIGJlIGEgcmVtb3RhYmxlLCBub3QgYSBwcm9taXNlLiovXG4gICAgLyogUHVyc2VJIG9ubHkgY2FsbHMgdGhpcyByYXcgbWV0aG9kIGFmdGVyIHZhbGlkYXRpbmcgdGhhdCovXG4gICAgLyogYHNyY1BheW1lbnRgIGlzIGEgcmVtb3RhYmxlLCBsZWF2aW5nIGl0Ki9cbiAgICAvKiB0byB0aGlzIHJhdyBtZXRob2QgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIHJlbW90YWJsZSBpcyBhY3R1YWxseSovXG4gICAgLyogYSBsaXZlIHBheW1lbnQgb2YgdGhlIGNvcnJlY3QgYnJhbmQgd2l0aCBzdWZmaWNpZW50IGZ1bmRzLiovXG4gICAgZGVwb3NpdDogTS5jYWxsKFBheW1lbnRTaGFwZSlcbiAgICAgIC5vcHRpb25hbChBbW91bnRQYXR0ZXJuU2hhcGUpXG4gICAgICAucmV0dXJucyhhbW91bnRTaGFwZSksXG4gICAgZ2V0RGVwb3NpdEZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKERlcG9zaXRGYWNldFNoYXBlKSxcbiAgICB3aXRoZHJhdzogTS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG4gICAgZ2V0UmVjb3ZlcnlTZXQ6IE0uY2FsbCgpLnJldHVybnMoTS5zZXRPZihQYXltZW50U2hhcGUpKSxcbiAgICByZWNvdmVyQWxsOiBNLmNhbGwoKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgfSk7XG5cbiAgY29uc3QgRGVwb3NpdEZhY2V0SSA9IE0uaW50ZXJmYWNlKCdEZXBvc2l0RmFjZXQnLCB7XG4gICAgcmVjZWl2ZTogZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFB1cnNlSSkubWV0aG9kR3VhcmRzLmRlcG9zaXQsXG4gIH0pO1xuXG4gIGNvbnN0IFB1cnNlSUtpdCA9IHtcbiAgICBwdXJzZTogUHVyc2VJLFxuICAgIGRlcG9zaXRGYWNldDogRGVwb3NpdEZhY2V0SSxcbiAgfTtcbiAgaGFyZGVuKFB1cnNlSUtpdCk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgSXNzdWVySSxcbiAgICBNaW50SSxcbiAgICBQYXltZW50SSxcbiAgICBQdXJzZUlLaXQsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUlzc3VlckludGVyZmFjZXMobWFrZUlzc3VlckludGVyZmFjZXMpO1xuaGFyZGVuKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyYW5kU2hhcGUiOlsiQnJhbmRTaGFwZSJdLCJJc3N1ZXJTaGFwZSI6WyJJc3N1ZXJTaGFwZSJdLCJQYXltZW50U2hhcGUiOlsiUGF5bWVudFNoYXBlIl0sIlB1cnNlU2hhcGUiOlsiUHVyc2VTaGFwZSJdLCJEZXBvc2l0RmFjZXRTaGFwZSI6WyJEZXBvc2l0RmFjZXRTaGFwZSJdLCJOb3RpZmllclNoYXBlIjpbIk5vdGlmaWVyU2hhcGUiXSwiTWludFNoYXBlIjpbIk1pbnRTaGFwZSJdLCJBbW91bnRTaGFwZSI6WyJBbW91bnRTaGFwZSJdLCJBbW91bnRQYXR0ZXJuU2hhcGUiOlsiQW1vdW50UGF0dGVyblNoYXBlIl0sIlJhdGlvU2hhcGUiOlsiUmF0aW9TaGFwZSJdLCJpc05hdFZhbHVlIjpbImlzTmF0VmFsdWUiXSwiaXNDb3B5U2V0VmFsdWUiOlsiaXNDb3B5U2V0VmFsdWUiXSwiaXNTZXRWYWx1ZSI6WyJpc1NldFZhbHVlIl0sImlzQ29weUJhZ1ZhbHVlIjpbImlzQ29weUJhZ1ZhbHVlIl0sIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyI6WyJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiXSwiQXNzZXRLaW5kU2hhcGUiOlsiQXNzZXRLaW5kU2hhcGUiXSwiRGlzcGxheUluZm9TaGFwZSI6WyJEaXNwbGF5SW5mb1NoYXBlIl0sIklzc3VlcktpdFNoYXBlIjpbIklzc3VlcktpdFNoYXBlIl0sIkJyYW5kSSI6WyJCcmFuZEkiXSwibWFrZUlzc3VlckludGVyZmFjZXMiOlsibWFrZUlzc3VlckludGVyZmFjZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACl7EmvGwUAABsFAAArAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnN0YW50cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiUGFyYW1UeXBlIiwiUGFyYW1UeXBlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKipcbiAqIEVudW0gb2YgcGFyYW1ldGVyIHR5cGVzXG4gKlxuICogVU5LTk9XTiBpcyBhbiBlc2NhcGUgaGF0Y2ggZm9yIHR5cGVzIHdlIGhhdmVuJ3QgYWRkZWQgeWV0LiBJZiB5b3UgYXJlXG4gKiBkZXZlbG9waW5nIGEgbmV3IGNvbnRyYWN0IGFuZCB1c2UgVU5LTk9XTiwgcGxlYXNlIGFsc28gZmlsZSBhbiBpc3N1ZSB0byBhc2tcbiAqIHVzIHRvIHN1cHBvcnQgdGhlIG5ldyB0eXBlLlxuICogQGVudW0ge3R5cGVvZiBQYXJhbVR5cGVba2V5b2YgdHlwZW9mIFBhcmFtVHlwZV19XG4gKi9cbiAgICAgICBjb25zdCBQYXJhbVR5cGUgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBBTU9VTlQ6ICdhbW91bnQnLFxuICBCUkFORDogJ2JyYW5kJyxcbiAgSU5TVEFMTEFUSU9OOiAnaW5zdGFsbGF0aW9uJyxcbiAgSU5TVEFOQ0U6ICdpbnN0YW5jZScsXG4gIElOVklUQVRJT046ICdpbnZpdGF0aW9uJyxcbiAgTkFUOiAnbmF0JyxcbiAgUkFUSU86ICdyYXRpbycsXG4gIFNUUklORzogJ3N0cmluZycsXG4gIFBBU1NBQkxFX1JFQ09SRDogJ3JlY29yZCcsXG4gIFRJTUVTVEFNUDogJ3RpbWVzdGFtcCcsXG4gIFJFTEFUSVZFX1RJTUU6ICdyZWxhdGl2ZVRpbWUnLFxuICBVTktOT1dOOiAndW5rbm93bicsXG59KTskaM2PX29uY2UuUGFyYW1UeXBlKFBhcmFtVHlwZSk7XG5oYXJkZW4oUGFyYW1UeXBlKTtcblxuLyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ki9cbi8qIFNoYWxsb3cgY29weSB0byB3b3JrIGFyb3VuZCBUUyBkLnRzIGRlZmluaW5nIGFuIGVtcHR5IG5hbWVzcGFjZSBpbnN0ZWFkIG9mIGFuIG9iamVjdCovXG4gICAgICAgY29uc3QgUGFyYW1UeXBlcyA9IHsgLi4uUGFyYW1UeXBlIH07JGjNj19vbmNlLlBhcmFtVHlwZXMoUGFyYW1UeXBlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQYXJhbVR5cGUiOlsiUGFyYW1UeXBlIl0sIlBhcmFtVHlwZXMiOlsiUGFyYW1UeXBlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAi6AXzxQwAAMUMAAA/AAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9hc3NlcnRpb25zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdGltZSJdLCJleHBvcnRzIjpbImFzc2VydFJlbGF0aXZlVGltZSIsImFzc2VydFRpbWVzdGFtcCIsIm1ha2VBc3NlcnRCcmFuZGVkUmF0aW8iLCJtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uIiwibWFrZUFzc2VydEluc3RhbmNlIiwibWFrZUxvb2tzTGlrZUJyYW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxpc1JlbW90YWJsZSxhc3NlcnRJc1JhdGlvLG11c3RNYXRjaCxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxUaW1lc3RhbXBSZWNvcmRTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc1JlbW90YWJsZVwiLFskaM2PX2EgPT4gKGlzUmVtb3RhYmxlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qc1wiLCBbW1wiYXNzZXJ0SXNSYXRpb1wiLFskaM2PX2EgPT4gKGFzc2VydElzUmF0aW8gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV0sW1wiVGltZXN0YW1wUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChUaW1lc3RhbXBSZWNvcmRTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtCcmFuZH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqL1xuXG5jb25zdCBtYWtlTG9va3NMaWtlQnJhbmQgPSBuYW1lID0+IHtcbiAgLyoqIEBwYXJhbSB7QnJhbmR9IGJyYW5kICovXG4gIHJldHVybiBicmFuZCA9PiB7XG4gICAgaXNSZW1vdGFibGUoYnJhbmQpIHx8IEZhaWxgdmFsdWUgZm9yICR7bmFtZX0gbXVzdCBiZSBhIGJyYW5kLCB3YXMgJHticmFuZH1gO1xuICB9O1xufTskaM2PX29uY2UubWFrZUxvb2tzTGlrZUJyYW5kKG1ha2VMb29rc0xpa2VCcmFuZCk7XG5oYXJkZW4obWFrZUxvb2tzTGlrZUJyYW5kKTtcblxuY29uc3QgbWFrZUFzc2VydEluc3RhbGxhdGlvbiA9IG5hbWUgPT4ge1xuICByZXR1cm4gaW5zdGFsbGF0aW9uID0+IHtcbiAgICAvKiBUT0RPKDMzNDQpOiBhZGQgYSBiZXR0ZXIgYXNzZXJ0aW9uIG9uY2UgWm9lIHZhbGlkYXRlcyBpbnN0YWxsYXRpb25zKi9cbiAgICB0eXBlb2YgaW5zdGFsbGF0aW9uID09PSAnb2JqZWN0JyB8fFxuICAgICAgRmFpbGB2YWx1ZSBmb3IgJHtuYW1lfSBtdXN0IGJlIGFuIEluc3RhbGxhdGlvbiwgd2FzICR7aW5zdGFsbGF0aW9ufWA7XG4gIH07XG59OyRozY9fb25jZS5tYWtlQXNzZXJ0SW5zdGFsbGF0aW9uKG1ha2VBc3NlcnRJbnN0YWxsYXRpb24pO1xuaGFyZGVuKG1ha2VBc3NlcnRJbnN0YWxsYXRpb24pO1xuXG5jb25zdCBtYWtlQXNzZXJ0SW5zdGFuY2UgPSBuYW1lID0+IHtcbiAgcmV0dXJuIGluc3RhbmNlID0+IHtcbiAgICAvKiBUT0RPKDMzNDQpOiBhZGQgYSBiZXR0ZXIgYXNzZXJ0aW9uIG9uY2UgWm9lIHZhbGlkYXRlcyBpbnN0YW5jZXMqL1xuICAgIHR5cGVvZiBpbnN0YW5jZSA9PT0gJ29iamVjdCcgfHxcbiAgICAgIEZhaWxgdmFsdWUgZm9yICR7bmFtZX0gbXVzdCBiZSBhbiBJbnN0YW5jZSwgd2FzICR7aW5zdGFuY2V9YDtcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VBc3NlcnRJbnN0YW5jZShtYWtlQXNzZXJ0SW5zdGFuY2UpO1xuaGFyZGVuKG1ha2VBc3NlcnRJbnN0YW5jZSk7XG5cbmNvbnN0IG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8gPSAobmFtZSwgbW9kZWxSYXRpbykgPT4ge1xuICByZXR1cm4gcmF0aW8gPT4ge1xuICAgIGFzc2VydElzUmF0aW8ocmF0aW8pO1xuICAgIHJhdGlvLm51bWVyYXRvci5icmFuZCA9PT0gbW9kZWxSYXRpby5udW1lcmF0b3IuYnJhbmQgfHxcbiAgICAgIEZhaWxgTnVtZXJhdG9yIGJyYW5kIGZvciAke25hbWV9IG11c3QgYmUgJHttb2RlbFJhdGlvLm51bWVyYXRvci5icmFuZH1gO1xuICAgIHJhdGlvLmRlbm9taW5hdG9yLmJyYW5kID09PSBtb2RlbFJhdGlvLmRlbm9taW5hdG9yLmJyYW5kIHx8XG4gICAgICBGYWlsYERlbm9taW5hdG9yIGJyYW5kIGZvciAke25hbWV9IG11c3QgYmUgJHttb2RlbFJhdGlvLmRlbm9taW5hdG9yLmJyYW5kfWA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59OyRozY9fb25jZS5tYWtlQXNzZXJ0QnJhbmRlZFJhdGlvKG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8pO1xuaGFyZGVuKG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8pO1xuXG5jb25zdCBhc3NlcnRSZWxhdGl2ZVRpbWUgPSB2YWx1ZSA9PiB7XG4gIG11c3RNYXRjaCh2YWx1ZSwgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xufTskaM2PX29uY2UuYXNzZXJ0UmVsYXRpdmVUaW1lKGFzc2VydFJlbGF0aXZlVGltZSk7XG5oYXJkZW4oYXNzZXJ0UmVsYXRpdmVUaW1lKTtcblxuY29uc3QgYXNzZXJ0VGltZXN0YW1wID0gdmFsdWUgPT4ge1xuICBtdXN0TWF0Y2godmFsdWUsIFRpbWVzdGFtcFJlY29yZFNoYXBlLCAndGltZXN0YW1wJyk7XG59OyRozY9fb25jZS5hc3NlcnRUaW1lc3RhbXAoYXNzZXJ0VGltZXN0YW1wKTtcbmhhcmRlbihhc3NlcnRUaW1lc3RhbXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxvb2tzTGlrZUJyYW5kIjpbIm1ha2VMb29rc0xpa2VCcmFuZCJdLCJtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uIjpbIm1ha2VBc3NlcnRJbnN0YWxsYXRpb24iXSwibWFrZUFzc2VydEluc3RhbmNlIjpbIm1ha2VBc3NlcnRJbnN0YW5jZSJdLCJtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvIjpbIm1ha2VBc3NlcnRCcmFuZGVkUmF0aW8iXSwiYXNzZXJ0UmVsYXRpdmVUaW1lIjpbImFzc2VydFJlbGF0aXZlVGltZSJdLCJhc3NlcnRUaW1lc3RhbXAiOlsiYXNzZXJ0VGltZXN0YW1wIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGLRPX7UFQAA1BUAAD4AAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCIuLi9xdWVzdGlvbi5qcyJdLCJleHBvcnRzIjpbIm1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zIiwic2V0dXBBcGlHb3Zlcm5hbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEUsRmFyLGtleUVRLENob2ljZU1ldGhvZCxRdW9ydW1SdWxlLEVsZWN0aW9uVHlwZSxjb2VyY2VRdWVzdGlvblNwZWM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dXV0sW1wiLi4vcXVlc3Rpb24uanNcIiwgW1tcIkNob2ljZU1ldGhvZFwiLFskaM2PX2EgPT4gKENob2ljZU1ldGhvZCA9ICRozY9fYSldXSxbXCJRdW9ydW1SdWxlXCIsWyRozY9fYSA9PiAoUXVvcnVtUnVsZSA9ICRozY9fYSldXSxbXCJFbGVjdGlvblR5cGVcIixbJGjNj19hID0+IChFbGVjdGlvblR5cGUgPSAkaM2PX2EpXV0sW1wiY29lcmNlUXVlc3Rpb25TcGVjXCIsWyRozY9fYSA9PiAoY29lcmNlUXVlc3Rpb25TcGVjID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvbnRyYWN0TWV0YSwgSW5zdGFsbGF0aW9uLCBJbnN0YW5jZSwgSW52aXRhdGlvbiwgWkNGfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZSwgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge1Bvc2l0aW9uLCBBcGlHb3Zlcm5vciwgQXBpSW52b2NhdGlvbklzc3VlLCBQb3NlckZhY2V0LCBWb3RlT25BcGlJbnZvY2F0aW9uLCBHb3Zlcm5lZEFwaXN9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSAnQGFnb3JpYy90aW1lJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG4vKipcbiAqIE1ha2UgYSBwYWlyIG9mIHBvc2l0aW9ucyBmb3IgYSBxdWVzdGlvbiBhYm91dCB3aGV0aGVyIHRvIGludm9rZSBhbiBBUEkuIElmXG4gKiB0aGUgdm90ZSBwYXNzZXMsIHRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gdGhlIGdvdmVybmVkQXBpcyBmYWNldCB3aXRoIHRoZVxuICogYXJndW1lbnRzIHRoYXQgd2VyZSBwcm92aWRlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBpTWV0aG9kTmFtZVxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBtZXRob2RBcmdzXG4gKi9cbmNvbnN0IG1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zID0gKGFwaU1ldGhvZE5hbWUsIG1ldGhvZEFyZ3MpID0+IHtcbiAgY29uc3QgcG9zaXRpdmUgPSBoYXJkZW4oeyBhcGlNZXRob2ROYW1lLCBtZXRob2RBcmdzIH0pO1xuICBjb25zdCBuZWdhdGl2ZSA9IGhhcmRlbih7IGRvbnRJbnZva2U6IGFwaU1ldGhvZE5hbWUgfSk7XG4gIHJldHVybiBoYXJkZW4oeyBwb3NpdGl2ZSwgbmVnYXRpdmUgfSk7XG59O1xuXG4vKipcbiAqIG1hbmFnZSBjb250cmFjdHMgdGhhdCBhbGxvdyBnb3Zlcm5hbmNlIHRvIGludm9rZSBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHsoKSA9PiBFUmVmPEdvdmVybmVkQXBpcz59IGdldEdvdmVybmVkQXBpc1xuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPEFycmF5PHN0cmluZyB8IHN5bWJvbD4+fSBnZXRHb3Zlcm5lZE5hbWVzIG5hbWVzIG9mIHRoZSBnb3Zlcm5lZCBBUEkgbWV0aG9kc1xuICogQHBhcmFtIHtFUmVmPFRpbWVyU2VydmljZT59IHRpbWVyXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8UG9zZXJGYWNldD59IGdldFVwZGF0ZWRQb3NlckZhY2V0XG4gKiBAcmV0dXJucyB7QXBpR292ZXJub3J9XG4gKi8kaM2PX29uY2UubWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMobWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMpO1xuY29uc3Qgc2V0dXBBcGlHb3Zlcm5hbmNlID0gKFxuICBnZXRHb3Zlcm5lZEFwaXMsXG4gIGdldEdvdmVybmVkTmFtZXMsXG4gIHRpbWVyLFxuICBnZXRVcGRhdGVkUG9zZXJGYWNldCxcbikgPT4ge1xuICAvKiogQHR5cGUge1dlYWtTZXQ8SW5zdGFuY2U+fSAqL1xuICBjb25zdCB2b3RlQ291bnRlcnMgPSBuZXcgV2Vha1NldCgpO1xuXG4gIC8qKiBAdHlwZSB7Vm90ZU9uQXBpSW52b2NhdGlvbn0gKi9cbiAgY29uc3Qgdm90ZU9uQXBpSW52b2NhdGlvbiA9IGFzeW5jIChcbiAgICBhcGlNZXRob2ROYW1lLFxuICAgIG1ldGhvZEFyZ3MsXG4gICAgdm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sXG4gICAgZGVhZGxpbmUsXG4gICkgPT4ge1xuICAgIGNvbnN0IGdvdmVybmVkTmFtZXMgPSBhd2FpdCBnZXRHb3Zlcm5lZE5hbWVzKCk7XG4gICAgZ292ZXJuZWROYW1lcy5pbmNsdWRlcyhhcGlNZXRob2ROYW1lKSB8fFxuICAgICAgRmFpbGAke2FwaU1ldGhvZE5hbWV9IGlzIG5vdCBhIGdvdmVybmVkIEFQSS5gO1xuXG4gICAgY29uc3QgeyBwb3NpdGl2ZSwgbmVnYXRpdmUgfSA9IG1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zKFxuICAgICAgYXBpTWV0aG9kTmFtZSxcbiAgICAgIG1ldGhvZEFyZ3MsXG4gICAgKTtcblxuICAgIC8qKiBAdHlwZSB7QXBpSW52b2NhdGlvbklzc3VlfSAqL1xuICAgIGNvbnN0IGlzc3VlID0gaGFyZGVuKHsgYXBpTWV0aG9kTmFtZSwgbWV0aG9kQXJncyB9KTtcbiAgICBjb25zdCBxdWVzdGlvblNwZWMgPSBjb2VyY2VRdWVzdGlvblNwZWMoe1xuICAgICAgbWV0aG9kOiBDaG9pY2VNZXRob2QuVU5SQU5LRUQsXG4gICAgICBpc3N1ZSxcbiAgICAgIHBvc2l0aW9uczogW3Bvc2l0aXZlLCBuZWdhdGl2ZV0sXG4gICAgICBlbGVjdGlvblR5cGU6IEVsZWN0aW9uVHlwZS5BUElfSU5WT0NBVElPTixcbiAgICAgIG1heENob2ljZXM6IDEsXG4gICAgICBtYXhXaW5uZXJzOiAxLFxuICAgICAgY2xvc2luZ1J1bGU6IHsgdGltZXIsIGRlYWRsaW5lIH0sXG4gICAgICBxdW9ydW1SdWxlOiBRdW9ydW1SdWxlLk1BSk9SSVRZLFxuICAgICAgdGllT3V0Y29tZTogbmVnYXRpdmUsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHB1YmxpY0ZhY2V0OiBjb3VudGVyUHVibGljRmFjZXQsIGluc3RhbmNlOiB2b3RlQ291bnRlciB9ID0gYXdhaXQgRShcbiAgICAgIGdldFVwZGF0ZWRQb3NlckZhY2V0KCksXG4gICAgKS5hZGRRdWVzdGlvbih2b3RlQ291bnRlckluc3RhbGxhdGlvbiwgcXVlc3Rpb25TcGVjKTtcblxuICAgIHZvdGVDb3VudGVycy5hZGQodm90ZUNvdW50ZXIpO1xuXG4gICAgLyogQ1JVQ0lBTDogSGVyZSB3ZSB3YWl0IGZvciB0aGUgdm90ZUNvdW50ZXIgdG8gZGVjbGFyZSBhbiBvdXRjb21lLCBhbmQgdGhlbiovXG4gICAgLyogYXR0ZW1wdCB0byBpbnZva2UgdGhlIEFQSSBpZiB0aGF0J3Mgd2hhdCB0aGUgdm90ZSBjYWxsZWQgZm9yLiBXZSBuZWVkIHRvKi9cbiAgICAvKiBtYWtlIHN1cmUgdGhhdCBvdXRjb21lT2ZVcGRhdGVQIGlzIHVwZGF0ZWQgd2hhdGV2ZXIgaGFwcGVucy4qL1xuICAgIC8qKi9cbiAgICAvKiAqIElmIHRoZSB2b3RlIHBhc3NlZCwgaW52b2tlIHRoZSBBUEksIGFuZCByZXR1cm4gdGhlIHBvc2l0aXZlIHBvc2l0aW9uKi9cbiAgICAvKiAqIElmIHRoZSB2b3RlIHdhcyBuZWdhdGl2ZSwgcmV0dXJuIHRoZSBuZWdhdGl2ZSBwb3NpdGlvbiovXG4gICAgLyogKiBJZiB3ZSBjYW4ndCBkbyBlaXRoZXIsICh0aGUgdm90ZSBmYWlsZWQgb3IgdGhlIEFQSSBpbnZvY2F0aW9uIGZhaWxlZCkqL1xuICAgIC8qIHJldHVybiBhIGJyb2tlbiBwcm9taXNlLiovXG4gICAgY29uc3Qgb3V0Y29tZU9mVXBkYXRlID0gRShjb3VudGVyUHVibGljRmFjZXQpXG4gICAgICAuZ2V0T3V0Y29tZSgpXG4gICAgICAudGhlbihcbiAgICAgICAgLyoqIEB0eXBlIHsob3V0Y29tZTogUG9zaXRpb24pID0+IFByb21pc2U8UG9zaXRpb24+fSAqL1xuICAgICAgICBhc3luYyBvdXRjb21lID0+IHtcbiAgICAgICAgICBhd2FpdCBudWxsO1xuXG4gICAgICAgICAgaWYgKGtleUVRKHBvc2l0aXZlLCBvdXRjb21lKSkge1xuICAgICAgICAgICAga2V5RVEob3V0Y29tZSwgaGFyZGVuKHsgYXBpTWV0aG9kTmFtZSwgbWV0aG9kQXJncyB9KSkgfHxcbiAgICAgICAgICAgICAgRmFpbGBUaGUgcXVlc3Rpb24ncyBtZXRob2QgbmFtZSAoJHtxKFxuICAgICAgICAgICAgICAgIGFwaU1ldGhvZE5hbWUsXG4gICAgICAgICAgICAgICl9KSBhbmQgYXJncyAoJHttZXRob2RBcmdzfSkgZGlkbid0IG1hdGNoIHRoZSBvdXRjb21lICR7b3V0Y29tZX1gO1xuXG4gICAgICAgICAgICAvKiBFKHJlbW90ZSlbbmFtZV0oYXJncykgaW52b2tlcyB0aGUgbWV0aG9kIG5hbWVkICduYW1lJyBvbiByZW1vdGUuKi9cbiAgICAgICAgICAgIGNvbnN0IGdvdmVybmVkQXBpcyA9IGF3YWl0IGdldEdvdmVybmVkQXBpcygpO1xuICAgICAgICAgICAgcmV0dXJuIEUoZ292ZXJuZWRBcGlzKVxuICAgICAgICAgICAgICBbYXBpTWV0aG9kTmFtZV0oLi4ubWV0aG9kQXJncylcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwb3NpdGl2ZTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZWdhdGl2ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICBvdXRjb21lT2ZVcGRhdGUsXG4gICAgICBpbnN0YW5jZTogdm90ZUNvdW50ZXIsXG4gICAgICBkZXRhaWxzOiBFKGNvdW50ZXJQdWJsaWNGYWNldCkuZ2V0RGV0YWlscygpLFxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBGYXIoJ3BhcmFtR292ZXJub3InLCB7XG4gICAgdm90ZU9uQXBpSW52b2NhdGlvbixcbiAgICBjcmVhdGVkUXVlc3Rpb246IGIgPT4gdm90ZUNvdW50ZXJzLmhhcyhiKSxcbiAgfSk7XG59OyRozY9fb25jZS5zZXR1cEFwaUdvdmVybmFuY2Uoc2V0dXBBcGlHb3Zlcm5hbmNlKTtcblxuaGFyZGVuKHNldHVwQXBpR292ZXJuYW5jZSk7XG5oYXJkZW4obWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMiOlsibWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMiXSwic2V0dXBBcGlHb3Zlcm5hbmNlIjpbInNldHVwQXBpR292ZXJuYW5jZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABtReazuxIAALsSAABBAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5GaWx0ZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIi4uL3F1ZXN0aW9uLmpzIl0sImV4cG9ydHMiOlsibWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zIiwic2V0dXBGaWx0ZXJHb3Zlcm5hbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxGYXIsbXVzdE1hdGNoLGtleUVRLE0sQ2hvaWNlTWV0aG9kLFF1b3J1bVJ1bGUsRWxlY3Rpb25UeXBlLGNvZXJjZVF1ZXN0aW9uU3BlYzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIi4uL3F1ZXN0aW9uLmpzXCIsIFtbXCJDaG9pY2VNZXRob2RcIixbJGjNj19hID0+IChDaG9pY2VNZXRob2QgPSAkaM2PX2EpXV0sW1wiUXVvcnVtUnVsZVwiLFskaM2PX2EgPT4gKFF1b3J1bVJ1bGUgPSAkaM2PX2EpXV0sW1wiRWxlY3Rpb25UeXBlXCIsWyRozY9fYSA9PiAoRWxlY3Rpb25UeXBlID0gJGjNj19hKV1dLFtcImNvZXJjZVF1ZXN0aW9uU3BlY1wiLFskaM2PX2EgPT4gKGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDb250cmFjdE1ldGEsIEluc3RhbGxhdGlvbiwgSW5zdGFuY2UsIEludml0YXRpb24sIFpDRn0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7UG9zaXRpb24sIEFwaUdvdmVybm9yLCBBcGlJbnZvY2F0aW9uSXNzdWUsIFBvc2VyRmFjZXQsIFZvdGVPbkFwaUludm9jYXRpb24sIEZpbHRlckdvdmVybm9yLCBHb3Zlcm5lZENyZWF0b3JGYWNldCwgT2ZmZXJGaWx0ZXJJc3N1ZSwgVm90ZU9uT2ZmZXJGaWx0ZXJ9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSAnQGFnb3JpYy90aW1lJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG4vKipcbiAqIE1ha2UgYSBwYWlyIG9mIHBvc2l0aW9ucyBmb3IgYSBxdWVzdGlvbiBhYm91dCB3aGV0aGVyIHRvIHVwZGF0ZSB0aGUgb2ZmZXJcbiAqIGZpbHRlci4gSWYgdGhlIHZvdGUgcGFzc2VzLCB0aGUgbGlzdCBvZiBibG9ja2VkIGludml0YXRpb24gc3RyaW5ncyB3aWxsIGJlXG4gKiB1cGRhdGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IHN0cmluZ3NcbiAqL1xuY29uc3QgbWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zID0gc3RyaW5ncyA9PiB7XG4gIGNvbnN0IHBvc2l0aXZlID0gaGFyZGVuKHsgc3RyaW5ncyB9KTtcbiAgY29uc3QgbmVnYXRpdmUgPSBoYXJkZW4oeyBkb250VXBkYXRlOiBzdHJpbmdzIH0pO1xuICByZXR1cm4geyBwb3NpdGl2ZSwgbmVnYXRpdmUgfTtcbn07XG5cbi8qKlxuICogU2V0dXAgdG8gYWxsb3cgZ292ZXJuYW5jZSB0byBibG9jayBzb21lIGludml0YXRpb25zLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxUaW1lclNlcnZpY2U+fSB0aW1lclxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFBvc2VyRmFjZXQ+fSBnZXRVcGRhdGVkUG9zZXJGYWNldFxuICogQHBhcmFtIHtHb3Zlcm5lZENyZWF0b3JGYWNldDx7fT59IGdvdmVybmVkQ0ZcbiAqIEByZXR1cm5zIHtGaWx0ZXJHb3Zlcm5vcn1cbiAqLyRozY9fb25jZS5tYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMobWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zKTtcbmNvbnN0IHNldHVwRmlsdGVyR292ZXJuYW5jZSA9ICh0aW1lciwgZ2V0VXBkYXRlZFBvc2VyRmFjZXQsIGdvdmVybmVkQ0YpID0+IHtcbiAgLyoqIEB0eXBlIHtXZWFrU2V0PEluc3RhbmNlPn0gKi9cbiAgY29uc3Qgdm90ZUNvdW50ZXJzID0gbmV3IFdlYWtTZXQoKTtcblxuICAvKiogQHR5cGUge1ZvdGVPbk9mZmVyRmlsdGVyfSAqL1xuICBjb25zdCB2b3RlT25GaWx0ZXIgPSBhc3luYyAodm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sIGRlYWRsaW5lLCBzdHJpbmdzKSA9PiB7XG4gICAgbXVzdE1hdGNoKHN0cmluZ3MsIE0uYXJyYXlPZihNLnN0cmluZygpKSk7XG4gICAgY29uc3QgeyBwb3NpdGl2ZSwgbmVnYXRpdmUgfSA9IG1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyhzdHJpbmdzKTtcblxuICAgIC8qKiBAdHlwZSB7T2ZmZXJGaWx0ZXJJc3N1ZX0gKi9cbiAgICBjb25zdCBpc3N1ZSA9IGhhcmRlbih7IHN0cmluZ3MgfSk7XG4gICAgY29uc3QgcXVlc3Rpb25TcGVjID0gY29lcmNlUXVlc3Rpb25TcGVjKHtcbiAgICAgIG1ldGhvZDogQ2hvaWNlTWV0aG9kLlVOUkFOS0VELFxuICAgICAgaXNzdWUsXG4gICAgICBwb3NpdGlvbnM6IFtwb3NpdGl2ZSwgbmVnYXRpdmVdLFxuICAgICAgZWxlY3Rpb25UeXBlOiBFbGVjdGlvblR5cGUuT0ZGRVJfRklMVEVSLFxuICAgICAgbWF4Q2hvaWNlczogMSxcbiAgICAgIG1heFdpbm5lcnM6IDEsXG4gICAgICBjbG9zaW5nUnVsZTogeyB0aW1lciwgZGVhZGxpbmUgfSxcbiAgICAgIHF1b3J1bVJ1bGU6IFF1b3J1bVJ1bGUuTUFKT1JJVFksXG4gICAgICB0aWVPdXRjb21lOiBuZWdhdGl2ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcHVibGljRmFjZXQ6IGNvdW50ZXJQdWJsaWNGYWNldCwgaW5zdGFuY2U6IHZvdGVDb3VudGVyIH0gPSBhd2FpdCBFKFxuICAgICAgZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSxcbiAgICApLmFkZFF1ZXN0aW9uKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLCBxdWVzdGlvblNwZWMpO1xuXG4gICAgdm90ZUNvdW50ZXJzLmFkZCh2b3RlQ291bnRlcik7XG5cbiAgICAvKiBDUlVDSUFMOiBIZXJlIHdlIHdhaXQgZm9yIHRoZSB2b3RlQ291bnRlciB0byBkZWNsYXJlIGFuIG91dGNvbWUsIGFuZCB0aGVuKi9cbiAgICAvKiBhdHRlbXB0IHRvIGludm9rZSB0aGUgQVBJIGlmIHRoYXQncyB3aGF0IHRoZSB2b3RlIGNhbGxlZCBmb3IuIFdlIG5lZWQgdG8qL1xuICAgIC8qIG1ha2Ugc3VyZSB0aGF0IG91dGNvbWVPZlVwZGF0ZVAgaXMgdXBkYXRlZCB3aGF0ZXZlciBoYXBwZW5zLiovXG4gICAgLyoqL1xuICAgIC8qICogSWYgdGhlIHZvdGUgcGFzc2VkLCBpbnZva2UgdGhlIEFQSSwgYW5kIHJldHVybiB0aGUgcG9zaXRpdmUgcG9zaXRpb24qL1xuICAgIC8qICogSWYgdGhlIHZvdGUgd2FzIG5lZ2F0aXZlLCByZXR1cm4gdGhlIG5lZ2F0aXZlIHBvc2l0aW9uKi9cbiAgICAvKiAqIElmIHdlIGNhbid0IGRvIGVpdGhlciwgKHRoZSB2b3RlIGZhaWxlZCBvciB0aGUgQVBJIGludm9jYXRpb24gZmFpbGVkKSovXG4gICAgLyogcmV0dXJuIGEgYnJva2VuIHByb21pc2UuKi9cbiAgICBjb25zdCBvdXRjb21lT2ZVcGRhdGUgPSBFKGNvdW50ZXJQdWJsaWNGYWNldClcbiAgICAgIC5nZXRPdXRjb21lKClcbiAgICAgIC50aGVuKFxuICAgICAgICAvKiogQHR5cGUgeyhvdXRjb21lOiBQb3NpdGlvbikgPT4gRVJlZjxQb3NpdGlvbj59ICovXG4gICAgICAgIG91dGNvbWUgPT4ge1xuICAgICAgICAgIGlmIChrZXlFUShvdXRjb21lLCBwb3NpdGl2ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBFKGdvdmVybmVkQ0YpXG4gICAgICAgICAgICAgIC5zZXRPZmZlckZpbHRlcihzdHJpbmdzKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aXZlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGtleUVRKG91dGNvbWUsIG5lZ2F0aXZlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5lZ2F0aXZlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQuZmFpbCgndW5yZWNvZ25pemVkIG91dGNvbWUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICBvdXRjb21lT2ZVcGRhdGUsXG4gICAgICBpbnN0YW5jZTogdm90ZUNvdW50ZXIsXG4gICAgICBkZXRhaWxzOiBFKGNvdW50ZXJQdWJsaWNGYWNldCkuZ2V0RGV0YWlscygpLFxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBGYXIoJ2ZpbHRlckdvdmVybm9yJywge1xuICAgIHZvdGVPbkZpbHRlcixcbiAgICBjcmVhdGVkUXVlc3Rpb246IGIgPT4gdm90ZUNvdW50ZXJzLmhhcyhiKSxcbiAgfSk7XG59OyRozY9fb25jZS5zZXR1cEZpbHRlckdvdmVybmFuY2Uoc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlKTtcblxuaGFyZGVuKHNldHVwRmlsdGVyR292ZXJuYW5jZSk7XG5oYXJkZW4obWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyI6WyJtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMiXSwic2V0dXBGaWx0ZXJHb3Zlcm5hbmNlIjpbInNldHVwRmlsdGVyR292ZXJuYW5jZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADJNUggcRoAAHEaAABAAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCIuLi9xdWVzdGlvbi5qcyIsIi4uL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJDT05UUkFDVF9FTEVDVE9SQVRFIiwiYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSIsIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyIsInNldHVwUGFyYW1Hb3Zlcm5hbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxFLGRlZXBseUZ1bGZpbGxlZCxGYXIsbXVzdE1hdGNoLGtleUVRLENob2ljZU1ldGhvZCxjb2VyY2VRdWVzdGlvblNwZWMsRWxlY3Rpb25UeXBlLFF1b3J1bVJ1bGUsUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIixbJGjNj19hID0+IChkZWVwbHlGdWxmaWxsZWQgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV1dXSxbXCIuLi9xdWVzdGlvbi5qc1wiLCBbW1wiQ2hvaWNlTWV0aG9kXCIsWyRozY9fYSA9PiAoQ2hvaWNlTWV0aG9kID0gJGjNj19hKV1dLFtcImNvZXJjZVF1ZXN0aW9uU3BlY1wiLFskaM2PX2EgPT4gKGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICRozY9fYSldXSxbXCJFbGVjdGlvblR5cGVcIixbJGjNj19hID0+IChFbGVjdGlvblR5cGUgPSAkaM2PX2EpXV0sW1wiUXVvcnVtUnVsZVwiLFskaM2PX2EgPT4gKFF1b3J1bVJ1bGUgPSAkaM2PX2EpXV1dXSxbXCIuLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZVwiLFskaM2PX2EgPT4gKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q29udHJhY3RNZXRhLCBJbnN0YWxsYXRpb24sIEluc3RhbmNlLCBJbnZpdGF0aW9uLCBaQ0Z9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge1BhcmFtVmFsdWUsIFBhcmFtQ2hhbmdlUG9zaXRpb25zLCBRdWVzdGlvblNwZWMsIENoYW5nZVBhcmFtc1Bvc2l0aW9uLCBQYXJhbUNoYW5nZUlzc3VlLCBQYXJhbUdvdmVybm9yLCBQYXJhbU1hbmFnZXJSZXRyaWV2ZXIsIFBvc2VyRmFjZXQsIFZvdGVPblBhcmFtQ2hhbmdlc30gZnJvbSAnLi4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tICdAYWdvcmljL3RpbWUnO1xuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL21hcnNoYWwnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbi8qKlxuICogVGhlIGVsZWN0b3JhdGUgdGhhdCBnb3Zlcm5zIGNoYW5nZXMgdG8gdGhlIGNvbnRyYWN0J3MgcGFyYW1ldGVycy4gSXQgbXVzdCBiZVxuICogZGVjbGFyZWQgaW4gdGhlIGdvdmVybmVkIGNvbnRyYWN0LlxuICovXG5jb25zdCBDT05UUkFDVF9FTEVDVE9SQVRFID0gJ0VsZWN0b3JhdGUnO1xuXG4vKipcbiAqIFJldHVybiBhIHJlY29yZCBjb250YWluaW5nIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcG9zaXRpb25zIGZvciBhXG4gKiBxdWVzdGlvbiBvbiBjaGFuZ2luZyB0aGUgcGFyYW0gdG8gdGhlIHByb3Bvc2VkVmFsdWUuXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBQYXJhbVZhbHVlPn0gY2hhbmdlc1xuICogQHJldHVybnMge1BhcmFtQ2hhbmdlUG9zaXRpb25zfVxuICovJGjNj19vbmNlLkNPTlRSQUNUX0VMRUNUT1JBVEUoQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG5jb25zdCBtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMgPSBjaGFuZ2VzID0+IHtcbiAgLyoqIEB0eXBlIHtDaGFuZ2VQYXJhbXNQb3NpdGlvbn0gKi9cbiAgY29uc3QgcG9zaXRpdmUgPSB7IGNoYW5nZXMgfTtcbiAgY29uc3QgbmFtZXNPbmx5ID0gT2JqZWN0LmtleXMoY2hhbmdlcyk7XG4gIGNvbnN0IG5lZ2F0aXZlID0geyBub0NoYW5nZTogbmFtZXNPbmx5IH07XG4gIHJldHVybiBoYXJkZW4oeyBwb3NpdGl2ZSwgbmVnYXRpdmUgfSk7XG59O1xuXG4vKipcbiAqIGFzc2VydCB0aGF0IHRoZSBwYXJhbWV0ZXIgZGVzY3JpYmVkIGJ5IHBhcmFtU3BlYyBpcyBwcm9wb3NlZCB0byBiZSBjaGFuZ2VkIGluXG4gKiB0aGUgcXVlc3Rpb24gZGVzY3JpYmVkIGJ5IHF1ZXN0aW9uU3BlYy5cbiAqXG4gKiBAcGFyYW0ge3sgcGFyYW1ldGVyTmFtZTogc3RyaW5nLCBwYXJhbVBhdGg6IHVua25vd259fSBwYXJhbVNwZWNcbiAqIEBwYXJhbSB7UXVlc3Rpb25TcGVjPFBhcmFtQ2hhbmdlSXNzdWU+fSBxdWVzdGlvblNwZWNcbiAqLyRozY9fb25jZS5tYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMobWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zKTtcbmNvbnN0IGFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0gPSAocGFyYW1TcGVjLCBxdWVzdGlvblNwZWMpID0+IHtcbiAgbXVzdE1hdGNoKHF1ZXN0aW9uU3BlYywgUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG4gIGNvbnN0IHsgcGFyYW1ldGVyTmFtZSwgcGFyYW1QYXRoIH0gPSBwYXJhbVNwZWM7XG4gIGNvbnN0IHsgaXNzdWUgfSA9IHF1ZXN0aW9uU3BlYztcbiAgaXNzdWUuc3BlYy5jaGFuZ2VzW3BhcmFtZXRlck5hbWVdIHx8XG4gICAgRmFpbGBRdWVzdGlvbiAoJHtpc3N1ZS5zcGVjLmNoYW5nZXN9KSBkb2VzIG5vdCBjb25jZXJuICR7cGFyYW1ldGVyTmFtZX1gO1xuICBrZXlFUShpc3N1ZS5zcGVjLnBhcmFtUGF0aCwgcGFyYW1QYXRoKSB8fFxuICAgIEZhaWxgUXVlc3Rpb24gcGF0aCAoJHtpc3N1ZS5zcGVjLnBhcmFtUGF0aH0pIGRvZXNuJ3QgbWF0Y2ggcmVxdWVzdCAoJHtwYXJhbVBhdGh9KWA7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7KCkgPT4gRVJlZjxQYXJhbU1hbmFnZXJSZXRyaWV2ZXI+fSBwYXJhbU1hbmFnZXJSZXRyaWV2ZXJBY2Nlc3NvclxuICogQHBhcmFtIHtJbnN0YW5jZX0gY29udHJhY3RJbnN0YW5jZVxuICogQHBhcmFtIHtUaW1lclNlcnZpY2V9IHRpbWVyXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8UG9zZXJGYWNldD59IGdldFVwZGF0ZWRQb3NlckZhY2V0XG4gKiBAcmV0dXJucyB7UGFyYW1Hb3Zlcm5vcn1cbiAqLyRozY9fb25jZS5hc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtKGFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0pO1xuY29uc3Qgc2V0dXBQYXJhbUdvdmVybmFuY2UgPSAoXG4gIHBhcmFtTWFuYWdlclJldHJpZXZlckFjY2Vzc29yLFxuICBjb250cmFjdEluc3RhbmNlLFxuICB0aW1lcixcbiAgZ2V0VXBkYXRlZFBvc2VyRmFjZXQsXG4pID0+IHtcbiAgLyoqIEB0eXBlIHtXZWFrU2V0PEluc3RhbmNlPn0gKi9cbiAgY29uc3Qgdm90ZUNvdW50ZXJzID0gbmV3IFdlYWtTZXQoKTtcblxuICAvKiogQHR5cGUge1ZvdGVPblBhcmFtQ2hhbmdlc30gKi9cbiAgY29uc3Qgdm90ZU9uUGFyYW1DaGFuZ2VzID0gYXN5bmMgKFxuICAgIHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLFxuICAgIGRlYWRsaW5lLFxuICAgIHBhcmFtU3BlYyxcbiAgKSA9PiB7XG4gICAgY29uc3QgcGFyYW1NYW5hZ2VyUmV0cmlldmVyID0gcGFyYW1NYW5hZ2VyUmV0cmlldmVyQWNjZXNzb3IoKTtcbiAgICBjb25zdCBwYXJhbU1nciA9IGF3YWl0IEUocGFyYW1NYW5hZ2VyUmV0cmlldmVyKS5nZXQocGFyYW1TcGVjLnBhcmFtUGF0aCk7XG4gICAgLyoqIEB0eXBlIHtQYXNzYWJsZX0gKi9cbiAgICBjb25zdCBjaGFuZ2VQcyA9IHt9O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhwYXJhbVNwZWMuY2hhbmdlcykpIHtcbiAgICAgIGNvbnN0IHByb3Bvc2VkVmFsdWUgPSBFKHBhcmFtTWdyKS5nZXRWaXNpYmxlVmFsdWUoXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHBhcmFtU3BlYy5jaGFuZ2VzW25hbWVdLFxuICAgICAgKTtcbiAgICAgIGNoYW5nZVBzW25hbWVdID0gcHJvcG9zZWRWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgY2hhbmdlcyA9IGF3YWl0IGRlZXBseUZ1bGZpbGxlZChoYXJkZW4oY2hhbmdlUHMpKTtcblxuICAgIGNvbnN0IHsgcG9zaXRpdmUsIG5lZ2F0aXZlIH0gPSBtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMoY2hhbmdlcyk7XG5cbiAgICAvKiogQHR5cGUge1BhcmFtQ2hhbmdlSXNzdWV9ICovXG4gICAgY29uc3QgaXNzdWUgPSBoYXJkZW4oe1xuICAgICAgc3BlYzoge1xuICAgICAgICBwYXJhbVBhdGg6IHBhcmFtU3BlYy5wYXJhbVBhdGgsXG4gICAgICAgIGNoYW5nZXMsXG4gICAgICB9LFxuICAgICAgY29udHJhY3Q6IGNvbnRyYWN0SW5zdGFuY2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCBxdWVzdGlvblNwZWMgPSBjb2VyY2VRdWVzdGlvblNwZWMoe1xuICAgICAgbWV0aG9kOiBDaG9pY2VNZXRob2QuVU5SQU5LRUQsXG4gICAgICBpc3N1ZSxcbiAgICAgIHBvc2l0aW9uczogW3Bvc2l0aXZlLCBuZWdhdGl2ZV0sXG4gICAgICBlbGVjdGlvblR5cGU6IEVsZWN0aW9uVHlwZS5QQVJBTV9DSEFOR0UsXG4gICAgICBtYXhDaG9pY2VzOiAxLFxuICAgICAgbWF4V2lubmVyczogMSxcbiAgICAgIGNsb3NpbmdSdWxlOiB7IHRpbWVyLCBkZWFkbGluZSB9LFxuICAgICAgcXVvcnVtUnVsZTogUXVvcnVtUnVsZS5NQUpPUklUWSxcbiAgICAgIHRpZU91dGNvbWU6IG5lZ2F0aXZlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBwdWJsaWNGYWNldDogY291bnRlclB1YmxpY0ZhY2V0LCBpbnN0YW5jZTogdm90ZUNvdW50ZXIgfSA9IGF3YWl0IEUoXG4gICAgICBnZXRVcGRhdGVkUG9zZXJGYWNldCgpLFxuICAgICkuYWRkUXVlc3Rpb24odm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sIHF1ZXN0aW9uU3BlYyk7XG5cbiAgICB2b3RlQ291bnRlcnMuYWRkKHZvdGVDb3VudGVyKTtcblxuICAgIC8qIENSVUNJQUw6IEhlcmUgd2Ugd2FpdCBmb3IgdGhlIHZvdGVDb3VudGVyIHRvIGRlY2xhcmUgYW4gb3V0Y29tZSwgYW5kIHRoZW4qL1xuICAgIC8qIGF0dGVtcHQgdG8gdXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIGlmIHRoYXQncyB3aGF0IHRoZSB2b3RlKi9cbiAgICAvKiBkZWNpZGVkLiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IG91dGNvbWVPZlVwZGF0ZVAgaXMgdXBkYXRlZCB3aGF0ZXZlciovXG4gICAgLyogaGFwcGVucy4qL1xuICAgIC8qICogSWYgdGhlIHZvdGUgd2FzIG5lZ2F0aXZlLCByZXNvbHZlIHRvIHRoZSBvdXRjb21lKi9cbiAgICAvKiAqIElmIHdlIHVwZGF0ZSB0aGUgdmFsdWUsIHNheSBzbyovXG4gICAgLyogKiBJZiB0aGUgdXBkYXRlIGZhaWxzLCByZWplY3QgdGhlIHByb21pc2UqL1xuICAgIC8qICogaWYgdGhlIHZvdGUgb3V0Y29tZSBmYWlsZWQsIHJlamVjdCB0aGUgcHJvbWlzZS4qL1xuICAgIGNvbnN0IG91dGNvbWVPZlVwZGF0ZSA9IEUoY291bnRlclB1YmxpY0ZhY2V0KVxuICAgICAgLmdldE91dGNvbWUoKVxuICAgICAgLnRoZW4oYXN5bmMgb3V0Y29tZSA9PiB7XG4gICAgICAgIGlmIChrZXlFUShwb3NpdGl2ZSwgb3V0Y29tZSkpIHtcbiAgICAgICAgICByZXR1cm4gRS53aGVuKFxuICAgICAgICAgICAgRShwYXJhbU1ncikudXBkYXRlUGFyYW1zKHBhcmFtU3BlYy5jaGFuZ2VzKSxcbiAgICAgICAgICAgICgpID0+IHBvc2l0aXZlLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5lZ2F0aXZlO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgb3V0Y29tZU9mVXBkYXRlLFxuICAgICAgaW5zdGFuY2U6IHZvdGVDb3VudGVyLFxuICAgICAgZGV0YWlsczogRShjb3VudGVyUHVibGljRmFjZXQpLmdldERldGFpbHMoKSxcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBGYXIoJ3BhcmFtR292ZXJub3InLCB7XG4gICAgdm90ZU9uUGFyYW1DaGFuZ2VzLFxuICAgIGNyZWF0ZWRRdWVzdGlvbjogYiA9PiB2b3RlQ291bnRlcnMuaGFzKGIpLFxuICB9KTtcbn07JGjNj19vbmNlLnNldHVwUGFyYW1Hb3Zlcm5hbmNlKHNldHVwUGFyYW1Hb3Zlcm5hbmNlKTtcblxuaGFyZGVuKHNldHVwUGFyYW1Hb3Zlcm5hbmNlKTtcbmhhcmRlbihtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMpO1xuaGFyZGVuKGFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ09OVFJBQ1RfRUxFQ1RPUkFURSI6WyJDT05UUkFDVF9FTEVDVE9SQVRFIl0sIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyI6WyJtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMiXSwiYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSI6WyJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtIl0sInNldHVwUGFyYW1Hb3Zlcm5hbmNlIjpbInNldHVwUGFyYW1Hb3Zlcm5hbmNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEvWdhq2SQAAtkkAAEEAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy96b2Uvc3JjL2NsZWFuUHJvcG9zYWwuanMiLCJAZW5kby9uYXQiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBhZ29yaWMvaW50ZXJuYWwiLCIuLi9jb25zdGFudHMuanMiLCIuL2Fzc2VydGlvbnMuanMiLCIuL2dvdmVyblBhcmFtLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiLCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxGYXIscGFzc1N0eWxlT2YsQW1vdW50TWF0aCxhc3NlcnRLZXl3b3JkTmFtZSxOYXQsa2V5RVEsbWFrZVNjYWxhck1hcFN0b3JlLEUsYXNzZXJ0QWxsRGVmaW5lZCxQYXJhbVR5cGVzLGFzc2VydFRpbWVzdGFtcCxhc3NlcnRSZWxhdGl2ZVRpbWUsbWFrZUFzc2VydEJyYW5kZWRSYXRpbyxtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uLG1ha2VBc3NlcnRJbnN0YW5jZSxtYWtlTG9va3NMaWtlQnJhbmQsQ09OVFJBQ1RfRUxFQ1RPUkFURTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY2xlYW5Qcm9wb3NhbC5qc1wiLCBbW1wiYXNzZXJ0S2V5d29yZE5hbWVcIixbJGjNj19hID0+IChhc3NlcnRLZXl3b3JkTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIixbJGjNj19hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjNj19hKV1dXV0sW1wiLi4vY29uc3RhbnRzLmpzXCIsIFtbXCJQYXJhbVR5cGVzXCIsWyRozY9fYSA9PiAoUGFyYW1UeXBlcyA9ICRozY9fYSldXV1dLFtcIi4vYXNzZXJ0aW9ucy5qc1wiLCBbW1wiYXNzZXJ0VGltZXN0YW1wXCIsWyRozY9fYSA9PiAoYXNzZXJ0VGltZXN0YW1wID0gJGjNj19hKV1dLFtcImFzc2VydFJlbGF0aXZlVGltZVwiLFskaM2PX2EgPT4gKGFzc2VydFJlbGF0aXZlVGltZSA9ICRozY9fYSldXSxbXCJtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvXCIsWyRozY9fYSA9PiAobWFrZUFzc2VydEJyYW5kZWRSYXRpbyA9ICRozY9fYSldXSxbXCJtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uXCIsWyRozY9fYSA9PiAobWFrZUFzc2VydEluc3RhbGxhdGlvbiA9ICRozY9fYSldXSxbXCJtYWtlQXNzZXJ0SW5zdGFuY2VcIixbJGjNj19hID0+IChtYWtlQXNzZXJ0SW5zdGFuY2UgPSAkaM2PX2EpXV0sW1wibWFrZUxvb2tzTGlrZUJyYW5kXCIsWyRozY9fYSA9PiAobWFrZUxvb2tzTGlrZUJyYW5kID0gJGjNj19hKV1dXV0sW1wiLi9nb3Zlcm5QYXJhbS5qc1wiLCBbW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiLFskaM2PX2EgPT4gKENPTlRSQUNUX0VMRUNUT1JBVEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtDb250cmFjdE1ldGEsIEluc3RhbGxhdGlvbiwgSW5zdGFuY2UsIEludml0YXRpb24sIEtleXdvcmQsIFpDRiwgWm9lU2VydmljZX0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7QW55UGFyYW1NYW5hZ2VyLCBHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGUsIFBhcmFtTWFuYWdlckJhc2UsIFBhcmFtU3RhdGVSZWNvcmQsIFBhcmFtVmFsdWVUeXBlZCwgVXBkYXRlUGFyYW1zfSBmcm9tICcuLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtDb3B5UmVjb3JkfSBmcm9tICdAZW5kby9tYXJzaGFsJztcbiAqIEBpbXBvcnQge1RpbWVzdGFtcH0gZnJvbSAnQGFnb3JpYy90aW1lJztcbiAqIEBpbXBvcnQge1JlbGF0aXZlVGltZX0gZnJvbSAnQGFnb3JpYy90aW1lJztcbiAqIEBpbXBvcnQge1N0b3JlZFB1Ymxpc2hlcktpdH0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtQYXJhbVR5cGV9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XG4gKiBAaW1wb3J0IHtSYXRpb30gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge0Ftb3VudH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge0JyYW5kfSBmcm9tICdAYWdvcmljL2VydHAnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbi8qKlxuICogQHBhcmFtIHtQYXJhbU1hbmFnZXJCYXNlfSBwYXJhbU1hbmFnZXJcbiAqIEBwYXJhbSB7e1tDT05UUkFDVF9FTEVDVE9SQVRFXTogUGFyYW1WYWx1ZVR5cGVkPCdpbnZpdGF0aW9uJz59fSBnb3Zlcm5lZFBhcmFtc1xuICovXG5jb25zdCBhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyA9IChwYXJhbU1hbmFnZXIsIGdvdmVybmVkUGFyYW1zKSA9PiB7XG4gIGNvbnN0IG1hbmFnZXJFbGVjdG9yYXRlID1cbiAgICBwYXJhbU1hbmFnZXIuZ2V0SW52aXRhdGlvbkFtb3VudChDT05UUkFDVF9FTEVDVE9SQVRFKTtcbiAgY29uc3Qge1xuICAgIFtDT05UUkFDVF9FTEVDVE9SQVRFXTogeyB2YWx1ZTogcGFyYW1FbGVjdG9yYXRlIH0sXG4gIH0gPSBnb3Zlcm5lZFBhcmFtcztcbiAgcGFyYW1FbGVjdG9yYXRlIHx8XG4gICAgRmFpbGBNaXNzaW5nICR7cShDT05UUkFDVF9FTEVDVE9SQVRFKX0gdGVybSBpbiAke3EoZ292ZXJuZWRQYXJhbXMpfWA7XG4gIGtleUVRKG1hbmFnZXJFbGVjdG9yYXRlLCBwYXJhbUVsZWN0b3JhdGUpIHx8XG4gICAgRmFpbGBFbGVjdG9yYXRlIGluIG1hbmFnZXIgKCR7bWFuYWdlckVsZWN0b3JhdGV9KX0gaW5jb21wYXRpYmxlIHdpdGggdGVybXMgKCR7cGFyYW1FbGVjdG9yYXRlfWA7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtTWFuYWdlckJ1aWxkZXJcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEFtb3VudCkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkQW1vdW50XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBCcmFuZCkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkQnJhbmRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEluc3RhbGxhdGlvbikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkSW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBJbnN0YW5jZSkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkSW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEludml0YXRpb24pID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZEludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IGJpZ2ludCkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkTmF0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBSYXRpbykgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkUmF0aW9cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IENvcHlSZWNvcmQ8YW55PikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkUmVjb3JkXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZFN0cmluZ1xuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogVGltZXN0YW1wKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRUaW1lc3RhbXBcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IFJlbGF0aXZlVGltZSkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkUmVsYXRpdmVUaW1lXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZFVua25vd25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW55UGFyYW1NYW5hZ2VyfSBidWlsZFxuICovXG5cbi8qKlxuICogQHBhcmFtIHtTdG9yZWRQdWJsaXNoZXJLaXQ8R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gcHVibGlzaGVyS2l0XG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IFt6b2VdXG4gKi8kaM2PX29uY2UuYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMoYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMpO1xuY29uc3QgbWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIgPSAocHVibGlzaGVyS2l0LCB6b2UpID0+IHtcbiAgLyoqIEB0eXBlIHtNYXBTdG9yZTxLZXl3b3JkLCBhbnk+fSAqL1xuICBjb25zdCBuYW1lc1RvUGFyYW1zID0gbWFrZVNjYWxhck1hcFN0b3JlKCdQYXJhbWV0ZXIgTmFtZScpO1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gcHVibGlzaGVyS2l0O1xuICBhc3NlcnRBbGxEZWZpbmVkKHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0pO1xuXG4gIGNvbnN0IGdldHRlcnMgPSB7fTtcbiAgY29uc3Qgc2V0dGVycyA9IHt9O1xuICBjb25zdCB1bmZpbmlzaGVkUGFyYW1zID0gW107XG5cbiAgLyogWFhYIGxldCBwYXJhbXMgYmUgZmluaXNoZWQgYXN5bmMuIEEgY29uY2Vzc2lvbiB0byB1cGdyYWRhYmlsaXR5Ki9cbiAgLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzQzKi9cbiAgY29uc3QgZmluaXNoQnVpbGRpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodW5maW5pc2hlZFBhcmFtcyk7XG4gICAgdW5maW5pc2hlZFBhcmFtcy5sZW5ndGggPSAwO1xuICB9O1xuXG4gIGNvbnN0IHB1Ymxpc2ggPSAoKSA9PiB7XG4gICAgLyoqIEB0eXBlIHtQYXJhbVN0YXRlUmVjb3JkfSAqL1xuICAgIGNvbnN0IGN1cnJlbnQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBbLi4ubmFtZXNUb1BhcmFtcy5lbnRyaWVzKCldLm1hcCgoW2ssIHZdKSA9PiBbaywgdi5tYWtlRGVzY3JpcHRpb24oKV0pLFxuICAgICk7XG4gICAgcHVibGlzaGVyLnVwZGF0ZVN0YXRlKHsgY3VycmVudCB9KTtcbiAgfTtcblxuICAvKipcbiAqIFN1cHBvcnQgZm9yIHBhcmFtZXRlcnMgdGhhdCBhcmUgY29weSBvYmplY3RzXG4gKlxuICogQHNlZSBidWlsZEludml0YXRpb25QYXJhbVxuICpcbiAqIEBwYXJhbSB7S2V5d29yZH0gbmFtZVxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHBhcmFtIHsodmFsKSA9PiB2b2lkfSBhc3NlcnRpb25cbiAqIEBwYXJhbSB7UGFyYW1UeXBlfSB0eXBlXG4gKi9cbiAgY29uc3QgYnVpbGRDb3B5UGFyYW0gPSAobmFtZSwgdmFsdWUsIGFzc2VydGlvbiwgdHlwZSkgPT4ge1xuICAgIGxldCBjdXJyZW50O1xuICAgIGFzc2VydEtleXdvcmROYW1lKG5hbWUpO1xuICAgIHZhbHVlICE9PSB1bmRlZmluZWQgfHwgRmFpbGBwYXJhbSAke3EobmFtZSl9IG11c3QgYmUgZGVmaW5lZGA7XG5cbiAgICBjb25zdCBzZXRQYXJhbVZhbHVlID0gbmV3VmFsdWUgPT4ge1xuICAgICAgYXNzZXJ0aW9uKG5ld1ZhbHVlKTtcbiAgICAgIGN1cnJlbnQgPSBuZXdWYWx1ZTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBbbmFtZV06IG5ld1ZhbHVlIH0pO1xuICAgIH07XG4gICAgc2V0UGFyYW1WYWx1ZSh2YWx1ZSk7XG5cbiAgICBjb25zdCBnZXRWaXNpYmxlVmFsdWUgPSBwcm9wb3NlZCA9PiB7XG4gICAgICBhc3NlcnRpb24ocHJvcG9zZWQpO1xuICAgICAgcmV0dXJuIHByb3Bvc2VkO1xuICAgIH07XG5cbiAgICBjb25zdCBwdWJsaWNNZXRob2RzID0gRmFyKGBQYXJhbWV0ZXIgJHtuYW1lfWAsIHtcbiAgICAgIGdldFZhbHVlOiAoKSA9PiBjdXJyZW50LFxuICAgICAgYXNzZXJ0VHlwZTogYXNzZXJ0aW9uLFxuICAgICAgbWFrZURlc2NyaXB0aW9uOiAoKSA9PiAoeyB0eXBlLCB2YWx1ZTogY3VycmVudCB9KSxcbiAgICAgIGdldFZpc2libGVWYWx1ZSxcbiAgICAgIGdldFR5cGU6ICgpID0+IHR5cGUsXG4gICAgfSk7XG5cbiAgICAvKiBuYW1lcyBhcmUga2V5d29yZHMgc28gdGhleSB3aWxsIG5lY2Vzc2FyaWx5IGJlIFRpdGxlQ2FzZSovXG4gICAgZ2V0dGVyc1tgZ2V0JHtuYW1lfWBdID0gKCkgPT4gZ2V0VHlwZWRQYXJhbSh0eXBlLCBuYW1lKTtcbiAgICAvKiBDUlVDSUFMOiBoZXJlIHdlJ3JlIGNyZWF0aW5nIHRoZSB1cGRhdGUgZnVuY3Rpb25zIHRoYXQgY2FuIGNoYW5nZSB0aGUqL1xuICAgIC8qIHZhbHVlcyBvZiB0aGUgZ292ZXJuZWQgY29udHJhY3QncyBwYXJhbWV0ZXJzLiBXZSdsbCByZXR1cm4gdGhlIHVwZGF0ZUZucyovXG4gICAgLyogdG8gb3VyIGNhbGxlci4gVGhleSBtdXN0IGhhbmRsZSB0aGVtIGNhcmVmdWxseSB0byBlbnN1cmUgdGhhdCB0aGV5IGVuZCB1cCovXG4gICAgLyogaW4gYXBwcm9wcmlhdGUgaGFuZHMuKi9cbiAgICBzZXR0ZXJzW2B1cGRhdGUke25hbWV9YF0gPSBzZXRQYXJhbVZhbHVlO1xuICAgIHNldHRlcnNbYHByZXBhcmVUb1VwZGF0ZSR7bmFtZX1gXSA9IHByb3Bvc2VkVmFsdWUgPT4gcHJvcG9zZWRWYWx1ZTtcbiAgICBuYW1lc1RvUGFyYW1zLmluaXQobmFtZSwgcHVibGljTWV0aG9kcyk7XG4gIH07XG5cbiAgLyogSEFORExFUlMgRk9SIEVBQ0ggUEFSQU1FVEVSIFRZUEUgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEFtb3VudCwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbiAgY29uc3QgYWRkQW1vdW50ID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0QW1vdW50ID0gYSA9PiB7XG4gICAgICBhLmJyYW5kIHx8IEZhaWxgRXhwZWN0ZWQgYW4gQW1vdW50IGZvciAke3EobmFtZSl9LCBnb3Q6ICR7YX1gO1xuICAgICAgcmV0dXJuIEFtb3VudE1hdGguY29lcmNlKHZhbHVlLmJyYW5kLCBhKTtcbiAgICB9O1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRBbW91bnQsIFBhcmFtVHlwZXMuQU1PVU5UKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBCcmFuZCwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbiAgY29uc3QgYWRkQnJhbmQgPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBjb25zdCBhc3NlcnRCcmFuZCA9IG1ha2VMb29rc0xpa2VCcmFuZChuYW1lKTtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0QnJhbmQsIFBhcmFtVHlwZXMuQlJBTkQpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEluc3RhbGxhdGlvbjx1bmtub3duPiwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbiAgY29uc3QgYWRkSW5zdGFsbGF0aW9uID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0SW5zdGFsbGF0aW9uID0gbWFrZUFzc2VydEluc3RhbGxhdGlvbihuYW1lKTtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0SW5zdGFsbGF0aW9uLCBQYXJhbVR5cGVzLklOU1RBTExBVElPTik7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogSW5zdGFuY2UsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG4gIGNvbnN0IGFkZEluc3RhbmNlID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0SW5zdGFuY2UgPSBtYWtlQXNzZXJ0SW5zdGFuY2UobmFtZSk7XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydEluc3RhbmNlLCBQYXJhbVR5cGVzLklOU1RBTkNFKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBiaWdpbnQsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG4gIGNvbnN0IGFkZE5hdCA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydE5hdCA9IHYgPT4ge1xuICAgICAgYXNzZXJ0LnR5cGVvZih2LCAnYmlnaW50Jyk7XG4gICAgICBOYXQodik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnROYXQsIFBhcmFtVHlwZXMuTkFUKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBSYXRpbywgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbiAgY29uc3QgYWRkUmF0aW8gPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBjb25zdCBhc3NlcnRCcmFuZGVkUmF0aW8gPSBtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvKG5hbWUsIHZhbHVlKTtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0QnJhbmRlZFJhdGlvLCBQYXJhbVR5cGVzLlJBVElPKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBDb3B5UmVjb3JkLCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuICBjb25zdCBhZGRSZWNvcmQgPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBjb25zdCBhc3NlcnRSZWNvcmQgPSB2ID0+IHtcbiAgICAgIHBhc3NTdHlsZU9mKHYpO1xuICAgICAgYXNzZXJ0LnR5cGVvZih2LCAnb2JqZWN0Jyk7XG4gICAgfTtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0UmVjb3JkLCBQYXJhbVR5cGVzLlBBU1NBQkxFX1JFQ09SRCk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuICBjb25zdCBhZGRTdHJpbmcgPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBjb25zdCBhc3NlcnRTdHJpbmcgPSB2ID0+IGFzc2VydC50eXBlb2YodiwgJ3N0cmluZycpO1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRTdHJpbmcsIFBhcmFtVHlwZXMuU1RSSU5HKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBUaW1lc3RhbXAsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG4gIGNvbnN0IGFkZFRpbWVzdGFtcCA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRUaW1lc3RhbXAsIFBhcmFtVHlwZXMuVElNRVNUQU1QKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBSZWxhdGl2ZVRpbWUsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG4gIGNvbnN0IGFkZFJlbGF0aXZlVGltZSA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRSZWxhdGl2ZVRpbWUsIFBhcmFtVHlwZXMuUkVMQVRJVkVfVElNRSk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuICBjb25zdCBhZGRVbmtub3duID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0VW5rbm93biA9IF92ID0+IHRydWU7XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydFVua25vd24sIFBhcmFtVHlwZXMuVU5LTk9XTik7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0SW52aXRhdGlvbiA9IGFzeW5jIGkgPT4ge1xuICAgIGlmICghem9lKSB7XG4gICAgICB0aHJvdyBGYWlsYHpvZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBnb3Zlcm5lZCBJbnZpdGF0aW9ucyAke3pvZX1gO1xuICAgIH1cblxuICAgIC8qIGxvY2FsIGNoZWNrIG9uIGlzTGl2ZSgpIGdpdmVzIGJldHRlciByZXBvcnQgdGhhbiAuZ2V0SW52aXRhdGlvbkRldGFpbHMoKSovXG4gICAgY29uc3QgaXNMaXZlID0gYXdhaXQgRShFKHpvZSkuZ2V0SW52aXRhdGlvbklzc3VlcigpKS5pc0xpdmUoaSk7XG4gICAgaXNMaXZlIHx8IEZhaWxgSW52aXRhdGlvbiBwYXNzZWQgdG8gcGFyYW1NYW5hZ2VyIGlzIG5vdCBsaXZlICR7aX1gO1xuICB9O1xuXG4gIC8qKlxuICogSW52aXRhdGlvbnMgYXJlIGNsb3NlbHkgaGVsZCwgc28gd2Ugc2hvdWxkIHB1YmxpY2x5IHJldmVhbCBvbmx5IHRoZSBhbW91bnQuXG4gKiBUaGUgYXBwcm9hY2ggaGVyZSBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgY29udHJhY3RzIHRvIGdldCB0aGUgYWN0dWFsXG4gKiBpbnZpdGF0aW9uIHByaXZhdGVseSwgYW5kIGxlZ2libHkgYXNzdXJlIGNsaWVudHMgdGhhdCBpdCBtYXRjaGVzIHRoZVxuICogcHVibGljbHkgdmlzaWJsZSBpbnZpdGF0aW9uIGFtb3VudC4gQ29udHJhY3QgcmV2aWV3ZXJzIHN0aWxsIGhhdmUgdG9cbiAqIG1hbnVhbGx5IHZlcmlmeSB0aGF0IHRoZSBhY3R1YWwgaW52aXRhdGlvbiBpcyBoYW5kbGVkIGNhcmVmdWxseS5cbiAqIGBnZXRJbnRlcm5hbFZhbHVlKClgIHdpbGwgb25seSBiZSBhY2Nlc3NpYmxlIHdpdGhpbiB0aGUgY29udHJhY3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7SW52aXRhdGlvbn0gaW52aXRhdGlvblxuICovXG4gIGNvbnN0IGJ1aWxkSW52aXRhdGlvblBhcmFtID0gKG5hbWUsIGludml0YXRpb24pID0+IHtcbiAgICBpZiAoIXpvZSkge1xuICAgICAgdGhyb3cgRmFpbGB6b2UgbXVzdCBiZSBwcm92aWRlZCBmb3IgZ292ZXJuZWQgSW52aXRhdGlvbnMgJHt6b2V9YDtcbiAgICB9XG4gICAgbGV0IGN1cnJlbnRJbnZpdGF0aW9uO1xuICAgIGxldCBjdXJyZW50QW1vdW50O1xuXG4gICAgLyoqXG4gKiBAdHlwZWRlZiB7W0ludml0YXRpb24sIEFtb3VudF19IFNldEludml0YXRpb25QYXJhbVxuICovXG5cbiAgICAvKipcbiAqIEFzeW5jIHBoYXNlIHRvIHByZXBhcmUgZm9yIHN5bmNocm9ub3VzIHNldHRpbmdcbiAqXG4gKiBAcGFyYW0ge0ludml0YXRpb259IGludml0ZVxuICogQHJldHVybnMge1Byb21pc2U8U2V0SW52aXRhdGlvblBhcmFtPn1cbiAqL1xuICAgIGNvbnN0IHByZXBhcmVUb1NldEludml0YXRpb24gPSBhc3luYyBpbnZpdGUgPT4ge1xuICAgICAgY29uc3QgW3ByZXBhcmVkQW1vdW50XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgRShFKHpvZSkuZ2V0SW52aXRhdGlvbklzc3VlcigpKS5nZXRBbW91bnRPZihpbnZpdGUpLFxuICAgICAgICBhc3NlcnRJbnZpdGF0aW9uKGludml0ZSksXG4gICAgICBdKTtcblxuICAgICAgcmV0dXJuIFtpbnZpdGUsIHByZXBhcmVkQW1vdW50XTtcbiAgICB9O1xuXG4gICAgLyoqXG4gKiBTeW5jaHJvbm91cyBwaGFzZSBvZiB2YWx1ZSBzZXR0aW5nXG4gKlxuICogQHBhcmFtIHtTZXRJbnZpdGF0aW9uUGFyYW19IHBhcmFtMFxuICovXG4gICAgY29uc3Qgc2V0SW52aXRhdGlvbiA9IChbbmV3SW52aXRhdGlvbiwgYW1vdW50XSkgPT4ge1xuICAgICAgY3VycmVudEFtb3VudCA9IGFtb3VudDtcbiAgICAgIGN1cnJlbnRJbnZpdGF0aW9uID0gbmV3SW52aXRhdGlvbjtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBbbmFtZV06IGN1cnJlbnRBbW91bnQgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IG1ha2VEZXNjcmlwdGlvbiA9ICgpID0+IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFBhcmFtVHlwZXMuSU5WSVRBVElPTiwgdmFsdWU6IGN1cnJlbnRBbW91bnQgfTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0VmlzaWJsZVZhbHVlID0gYXN5bmMgYWxsZWdlZEludml0YXRpb24gPT5cbiAgICAgIEUoRSh6b2UpLmdldEludml0YXRpb25Jc3N1ZXIoKSkuZ2V0QW1vdW50T2YoYWxsZWdlZEludml0YXRpb24pO1xuXG4gICAgY29uc3QgcHVibGljTWV0aG9kcyA9IEZhcihgUGFyYW1ldGVyICR7bmFtZX1gLCB7XG4gICAgICBnZXRWYWx1ZTogKCkgPT4gY3VycmVudEFtb3VudCxcbiAgICAgIGdldEludGVybmFsVmFsdWU6ICgpID0+IGN1cnJlbnRJbnZpdGF0aW9uLFxuICAgICAgYXNzZXJ0VHlwZTogYXNzZXJ0SW52aXRhdGlvbixcbiAgICAgIG1ha2VEZXNjcmlwdGlvbixcbiAgICAgIGdldFR5cGU6ICgpID0+IFBhcmFtVHlwZXMuSU5WSVRBVElPTixcbiAgICAgIGdldFZpc2libGVWYWx1ZSxcbiAgICB9KTtcblxuICAgIGdldHRlcnNbYGdldCR7bmFtZX1gXSA9ICgpID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5JTlZJVEFUSU9OLCBuYW1lKTtcbiAgICAvKiBDUlVDSUFMOiBoZXJlIHdlJ3JlIGNyZWF0aW5nIHRoZSB1cGRhdGUgZnVuY3Rpb25zIHRoYXQgY2FuIGNoYW5nZSB0aGUqL1xuICAgIC8qIHZhbHVlcyBvZiB0aGUgZ292ZXJuZWQgY29udHJhY3QncyBwYXJhbWV0ZXJzLiBXZSdsbCByZXR1cm4gdXBkYXRlUGFyYW1zKi9cbiAgICAvKiAod2hpY2ggY2FuIGludm9rZSBhbGwgb2YgdGhlbSkgdG8gb3VyIGNhbGxlci4gVGhleSBtdXN0IGhhbmRsZSBpdCovXG4gICAgLyogY2FyZWZ1bGx5IHRvIGVuc3VyZSB0aGF0IHRoZXkgZW5kIHVwIGluIGFwcHJvcHJpYXRlIGhhbmRzLiovXG4gICAgc2V0dGVyc1tgcHJlcGFyZVRvVXBkYXRlJHtuYW1lfWBdID0gcHJlcGFyZVRvU2V0SW52aXRhdGlvbjtcbiAgICBzZXR0ZXJzW2B1cGRhdGUke25hbWV9YF0gPSBzZXRJbnZpdGF0aW9uO1xuXG4gICAgLyogWFhYIGxldCB0aGUgdmFsdWUgYmUgc2V0IGFzeW5jLiBBIGNvbmNlc3Npb24gdG8gdXBncmFkYWJpbGl0eSovXG4gICAgLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzQzKi9cbiAgICBjb25zdCBmaW5pc2hJbnZpdGF0aW9uUGFyYW0gPSBFLndoZW4oXG4gICAgICBwcmVwYXJlVG9TZXRJbnZpdGF0aW9uKGludml0YXRpb24pLFxuICAgICAgaW52aXRhdGlvbkFuZEFtb3VudCA9PiB7XG4gICAgICAgIHNldEludml0YXRpb24oaW52aXRhdGlvbkFuZEFtb3VudCk7XG4gICAgICAgIC8qIGRlbGF5IHVudGlsIGN1cnJlbnRBbW91bnQgaXMgZGVmaW5lZCBiZWNhdXNlIHJlYWRlcnMgZXhwZWN0IGEgdmFsaWQgdmFsdWUqL1xuICAgICAgICBuYW1lc1RvUGFyYW1zLmluaXQobmFtZSwgcHVibGljTWV0aG9kcyk7XG4gICAgICB9LFxuICAgICk7XG4gICAgdW5maW5pc2hlZFBhcmFtcy5wdXNoKGZpbmlzaEludml0YXRpb25QYXJhbSk7XG5cbiAgICByZXR1cm4gbmFtZTtcbiAgfTtcblxuICAvKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBJbnZpdGF0aW9uLCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuICBjb25zdCBhZGRJbnZpdGF0aW9uID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgYXNzZXJ0S2V5d29yZE5hbWUobmFtZSk7XG4gICAgdmFsdWUgIT09IG51bGwgfHwgRmFpbGBwYXJhbSAke3EobmFtZSl9IG11c3QgYmUgZGVmaW5lZGA7XG5cbiAgICBidWlsZEludml0YXRpb25QYXJhbShuYW1lLCB2YWx1ZSk7XG5cbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiBQQVJBTSBNQU5BR0VSIE1FVEhPRFMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgY29uc3QgZ2V0VHlwZWRQYXJhbSA9ICh0eXBlLCBuYW1lKSA9PiB7XG4gICAgY29uc3QgcGFyYW0gPSBuYW1lc1RvUGFyYW1zLmdldChuYW1lKTtcbiAgICB0eXBlID09PSBwYXJhbS5nZXRUeXBlKCkgfHwgRmFpbGAke25hbWV9IGlzIG5vdCAke3R5cGV9YDtcbiAgICByZXR1cm4gcGFyYW0uZ2V0VmFsdWUoKTtcbiAgfTtcblxuICBjb25zdCBnZXRWaXNpYmxlVmFsdWUgPSAobmFtZSwgcHJvcG9zZWQpID0+IHtcbiAgICBjb25zdCBwYXJhbSA9IG5hbWVzVG9QYXJhbXMuZ2V0KG5hbWUpO1xuICAgIHJldHVybiBwYXJhbS5nZXRWaXNpYmxlVmFsdWUocHJvcG9zZWQpO1xuICB9O1xuXG4gIC8qIHNob3VsZCBiZSBleHBvc2VkIHdpdGhpbiBjb250cmFjdHMsIGFuZCBub3QgZXh0ZXJuYWxseSwgZm9yIGludml0YXRpb25zKi9cbiAgLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPEludml0YXRpb24+fSAqL1xuICBjb25zdCBnZXRJbnRlcm5hbFBhcmFtVmFsdWUgPSBhc3luYyBuYW1lID0+IHtcbiAgICBhd2FpdCBmaW5pc2hCdWlsZGluZygpO1xuICAgIHJldHVybiBuYW1lc1RvUGFyYW1zLmdldChuYW1lKS5nZXRJbnRlcm5hbFZhbHVlKCk7XG4gIH07XG5cbiAgY29uc3QgZ2V0UGFyYW1zID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGZpbmlzaEJ1aWxkaW5nKCk7XG4gICAgLyoqIEB0eXBlIHtQYXJhbVN0YXRlUmVjb3JkfSAqL1xuICAgIGNvbnN0IGRlc2NyaXB0aW9ucyA9IHt9O1xuICAgIGZvciAoY29uc3QgW25hbWUsIHBhcmFtXSBvZiBuYW1lc1RvUGFyYW1zLmVudHJpZXMoKSkge1xuICAgICAgZGVzY3JpcHRpb25zW25hbWVdID0gcGFyYW0ubWFrZURlc2NyaXB0aW9uKCk7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZGVzY3JpcHRpb25zKTtcbiAgfTtcblxuICAvKiogQHR5cGUge1VwZGF0ZVBhcmFtc30gKi9cbiAgY29uc3QgdXBkYXRlUGFyYW1zID0gYXN5bmMgcGFyYW1DaGFuZ2VzID0+IHtcbiAgICBhd2FpdCBmaW5pc2hCdWlsZGluZygpO1xuICAgIGNvbnN0IHBhcmFtTmFtZXMgPSBPYmplY3Qua2V5cyhwYXJhbUNoYW5nZXMpO1xuXG4gICAgLyogcHJvbWlzZXMgdG8gcHJlcGFyZSBldmVyeSB1cGRhdGUqL1xuICAgIGNvbnN0IGFzeW5jUmVzdWx0cyA9IHBhcmFtTmFtZXMubWFwKG5hbWUgPT5cbiAgICAgIHNldHRlcnNbYHByZXBhcmVUb1VwZGF0ZSR7bmFtZX1gXShwYXJhbUNoYW5nZXNbbmFtZV0pLFxuICAgICk7XG4gICAgLyogaWYgYW55IHVwZGF0ZSBkb2Vzbid0IHN1Y2NlZWQsIGZhaWwgdGhlIHJlcXVlc3QqL1xuICAgIGNvbnN0IHByZXBhcmVkID0gYXdhaXQgUHJvbWlzZS5hbGwoYXN5bmNSZXN1bHRzKTtcblxuICAgIC8qIGFjdHVhbGx5IHVwZGF0ZSovXG4gICAgZm9yIChjb25zdCBbaSwgbmFtZV0gb2YgcGFyYW1OYW1lcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHNldEZuID0gc2V0dGVyc1tgdXBkYXRlJHtuYW1lfWBdO1xuICAgICAgc2V0Rm4ocHJlcGFyZWRbaV0pO1xuICAgIH1cbiAgICBwdWJsaXNoKCk7XG4gIH07XG5cbiAgLyogQ2FsbGVkIGFmdGVyIGFsbCBwYXJhbXMgaGF2ZSBiZWVuIGFkZGVkIHdpdGggdGhlaXIgaW5pdGlhbCB2YWx1ZXMqL1xuICBjb25zdCBidWlsZCA9ICgpID0+IHtcbiAgICAvKiBYWFggbGV0IHBhcmFtcyBiZSBmaW5pc2hlZCBhc3luYy4gQSBjb25jZXNzaW9uIHRvIHVwZ3JhZGFiaWxpdHkqL1xuICAgIC8qIFVOVElMIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDM0MyovXG4gICAgdm9pZCBFLndoZW4oZmluaXNoQnVpbGRpbmcoKSwgKCkgPT4gcHVibGlzaCgpKTtcblxuICAgIC8qIENSVUNJQUw6IENvbnRyYWN0cyB0aGF0IGNhbGwgYnVpbGRQYXJhbU1hbmFnZXIgc2hvdWxkIG9ubHkgZXhwb3J0IHRoZSovXG4gICAgLyogcmVzdWx0aW5nIHBhcmFtTWFuYWdlciB0byB0aGVpciBjcmVhdG9yRmFjZXQsIHdoZXJlIGl0IHdpbGwgYmUgcGlja2VkIHVwIGJ5Ki9cbiAgICAvKiBjb250cmFjdEdvdmVybm9yLiBUaGUgZ2V0UGFyYW1zIG1ldGhvZCBjYW4gYmUgc2hhcmVkIHdpZGVseS4qL1xuICAgIHJldHVybiBGYXIoJ3BhcmFtIG1hbmFnZXInLCB7XG4gICAgICBnZXRQYXJhbXMsXG4gICAgICBnZXRTdWJzY3JpcHRpb246ICgpID0+IHN1YnNjcmliZXIsXG4gICAgICBnZXRBbW91bnQ6IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLkFNT1VOVCwgbmFtZSksXG4gICAgICBnZXRCcmFuZDogbmFtZSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuQlJBTkQsIG5hbWUpLFxuICAgICAgZ2V0SW5zdGFuY2U6IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLklOU1RBTkNFLCBuYW1lKSxcbiAgICAgIGdldEluc3RhbGxhdGlvbjogbmFtZSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuSU5TVEFMTEFUSU9OLCBuYW1lKSxcbiAgICAgIGdldEludml0YXRpb25BbW91bnQ6IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLklOVklUQVRJT04sIG5hbWUpLFxuICAgICAgZ2V0TmF0OiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5OQVQsIG5hbWUpLFxuICAgICAgZ2V0UmF0aW86IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLlJBVElPLCBuYW1lKSxcbiAgICAgIGdldFJlY29yZDogbmFtZSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuUEFTU0FCTEVfUkVDT1JELCBuYW1lKSxcbiAgICAgIGdldFN0cmluZzogbmFtZSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuU1RSSU5HLCBuYW1lKSxcbiAgICAgIGdldFRpbWVzdGFtcDogbmFtZSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuVElNRVNUQU1QLCBuYW1lKSxcbiAgICAgIGdldFJlbGF0aXZlVGltZTogbmFtZSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuUkVMQVRJVkVfVElNRSwgbmFtZSksXG4gICAgICBnZXRVbmtub3duOiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5VTktOT1dOLCBuYW1lKSxcbiAgICAgIGdldFZpc2libGVWYWx1ZSxcbiAgICAgIGdldEludGVybmFsUGFyYW1WYWx1ZSxcbiAgICAgIC8qIEdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGVhY2ggcGFyYW0gdmFsdWUqL1xuICAgICAgLi4uZ2V0dGVycyxcbiAgICAgIHVwZGF0ZVBhcmFtcyxcbiAgICAgIC8qIENvbGxlY3Rpb24gb2YgYWxsIGdldHRlcnMgZm9yIHBhc3NpbmcgdG8gcmVhZC1vbmx5IGNvbnRleHRzKi9cbiAgICAgIHJlYWRvbmx5OiAoKSA9PiBoYXJkZW4oZ2V0dGVycyksXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHtQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuICBjb25zdCBidWlsZGVyID0ge1xuICAgIGFkZEFtb3VudDogKG4sIHYpID0+IGFkZEFtb3VudChuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRCcmFuZDogKG4sIHYpID0+IGFkZEJyYW5kKG4sIHYsIGJ1aWxkZXIpLFxuICAgIGFkZEluc3RhbGxhdGlvbjogKG4sIHYpID0+IGFkZEluc3RhbGxhdGlvbihuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRJbnN0YW5jZTogKG4sIHYpID0+IGFkZEluc3RhbmNlKG4sIHYsIGJ1aWxkZXIpLFxuICAgIGFkZFVua25vd246IChuLCB2KSA9PiBhZGRVbmtub3duKG4sIHYsIGJ1aWxkZXIpLFxuICAgIGFkZEludml0YXRpb246IChuLCB2KSA9PiBhZGRJbnZpdGF0aW9uKG4sIHYsIGJ1aWxkZXIpLFxuICAgIGFkZE5hdDogKG4sIHYpID0+IGFkZE5hdChuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRSYXRpbzogKG4sIHYpID0+IGFkZFJhdGlvKG4sIHYsIGJ1aWxkZXIpLFxuICAgIGFkZFJlY29yZDogKG4sIHYpID0+IGFkZFJlY29yZChuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRTdHJpbmc6IChuLCB2KSA9PiBhZGRTdHJpbmcobiwgdiwgYnVpbGRlciksXG4gICAgYWRkUmVsYXRpdmVUaW1lOiAobiwgdikgPT4gYWRkUmVsYXRpdmVUaW1lKG4sIHYsIGJ1aWxkZXIpLFxuICAgIGFkZFRpbWVzdGFtcDogKG4sIHYpID0+IGFkZFRpbWVzdGFtcChuLCB2LCBidWlsZGVyKSxcbiAgICBidWlsZCxcbiAgfTtcbiAgcmV0dXJuIGJ1aWxkZXI7XG59OyRozY9fb25jZS5tYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcihtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcik7XG5cbmhhcmRlbihhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyk7XG5oYXJkZW4obWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiOlsiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiXSwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiOlsibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAppftTrwbAAC8GwAARgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL2Vycm9ycyIsIi4uL2NvbnN0YW50cy5qcyIsIi4vZ292ZXJuUGFyYW0uanMiLCIuL3BhcmFtTWFuYWdlci5qcyJdLCJleHBvcnRzIjpbIm1ha2VQYXJhbU1hbmFnZXIiLCJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zIiwibWFrZVBhcmFtTWFuYWdlclN5bmMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhaWwscSxQYXJhbVR5cGVzLENPTlRSQUNUX0VMRUNUT1JBVEUsbWFrZVBhcmFtTWFuYWdlckJ1aWxkZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuLi9jb25zdGFudHMuanNcIiwgW1tcIlBhcmFtVHlwZXNcIixbJGjNj19hID0+IChQYXJhbVR5cGVzID0gJGjNj19hKV1dXV0sW1wiLi9nb3Zlcm5QYXJhbS5qc1wiLCBbW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiLFskaM2PX2EgPT4gKENPTlRSQUNUX0VMRUNUT1JBVEUgPSAkaM2PX2EpXV1dXSxbXCIuL3BhcmFtTWFuYWdlci5qc1wiLCBbW1wibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXJcIixbJGjNj19hID0+IChtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDb250cmFjdE1ldGEsIEluc3RhbGxhdGlvbiwgSW5zdGFuY2UsIEludml0YXRpb24sIEtleXdvcmQsIFpDRn0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXQsIFZvdGVDb3VudGVyUHVibGljRmFjZXQsIFF1ZXN0aW9uU3BlYywgT3V0Y29tZVJlY29yZCwgQWRkUXVlc3Rpb24sIEFkZFF1ZXN0aW9uUmV0dXJuLCBHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGUsIEdvdmVybmFuY2VUZXJtcywgUGFyYW1NYW5hZ2VyQmFzZSwgUGFyYW1TdGF0ZVJlY29yZCwgUGFyYW1WYWx1ZUZvclR5cGUsIFVwZGF0ZVBhcmFtc30gZnJvbSAnLi4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7UGFyYW1UeXBlfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xuICogQGltcG9ydCB7U3RvcmVkUHVibGlzaGVyS2l0fSBmcm9tICdAYWdvcmljL25vdGlmaWVyJztcbiAqIEBpbXBvcnQge0Ftb3VudH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgUGFyYW1UeXBlPn0gUGFyYW1UeXBlc01hcFxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1TdGF0ZVJlY29yZH0gTVxuICogQHR5cGVkZWYge3sgW1IgaW4ga2V5b2YgTV06IE1bUl1bJ3R5cGUnXX19IFBhcmFtVHlwZXNNYXBGcm9tUmVjb3JkXG4gKi9cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGVzTWFwfSBNXG4gKiBAdHlwZWRlZiB7eyBbVCBpbiBrZXlvZiBNXTogeyB0eXBlOiBNW1RdLCB2YWx1ZTogUGFyYW1WYWx1ZUZvclR5cGU8TVtUXT4gfSB9fSBQYXJhbVJlY29yZHNGcm9tVHlwZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlc01hcH0gTVxuICogQHR5cGVkZWYge3tcbiAqICAgW0sgaW4ga2V5b2YgTSBhcyBgZ2V0JHtzdHJpbmcgJiBLfWBdOiAoKSA9PiBQYXJhbVZhbHVlRm9yVHlwZTxNW0tdPlxuICogfX0gR2V0dGVyc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGVzTWFwfSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICBbSyBpbiBrZXlvZiBUIGFzIGB1cGRhdGUke3N0cmluZyAmIEt9YF06ICh2YWx1ZTogUGFyYW1WYWx1ZUZvclR5cGU8VFtLXT4pID0+IHZvaWRcbiAqIH19IFVwZGF0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZXNNYXB9IE1cbiAqIEB0eXBlZGVmIHtQYXJhbU1hbmFnZXJCYXNlICYgR2V0dGVyczxNPiAmIFVwZGF0ZXJzPE0+ICYge3JlYWRvbmx5OiAoKSA9PiBHZXR0ZXJzPE0+fSAmIHt1cGRhdGVQYXJhbXM6IFVwZGF0ZVBhcmFtc319IFR5cGVkUGFyYW1NYW5hZ2VyXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1BhcmFtVHlwZX0gdHlwZVxuICovXG5jb25zdCBidWlsZGVyTWV0aG9kTmFtZSA9IHR5cGUgPT5cbiAgYGFkZCR7dHlwZVswXS50b1VwcGVyQ2FzZSgpICsgdHlwZS5zdWJzdHJpbmcoMSl9YDtcblxuLyoqIEB0eXBlIHtQYXJ0aWFsPFJlY29yZDxQYXJhbVR5cGUsIGJvb2xlYW4+Pn0gKi9cbmNvbnN0IGlzQXN5bmMgPSB7XG4gIGludml0YXRpb246IHRydWUsXG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlfSBUXG4gKiBAdHlwZWRlZiB7W3R5cGU6IFQsIHZhbHVlOiBQYXJhbVZhbHVlRm9yVHlwZTxUPl19IFNUIHBhcmFtIHNwZWMgdHVwbGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7IHR5cGU6ICdpbnZpdGF0aW9uJywgdmFsdWU6IEFtb3VudDwnc2V0Jz4gfX0gSW52aXRhdGlvblBhcmFtXG4gKi9cblxuLyogWFhYIGJldHRlciB0byB1c2UgdGhlIG1hbmlmZXN0IGNvbnN0YW50IFBhcmFtVHlwZXMqL1xuLyogYnV0IGltcG9ydGluZyB0aGF0IGhlcmUgdHVybnMgdGhpcyBmaWxlIGludG8gYSBtb2R1bGUsKi9cbi8qIGJyZWFraW5nIHRoZSBhbWJpZW50IHR5cGluZyovXG4vKipcbiAqIEB0eXBlZGVmIHtTVDwnYW1vdW50Jz5cbiAqIHwgU1Q8J2JyYW5kJz5cbiAqIHwgU1Q8J2luc3RhbGxhdGlvbic+XG4gKiB8IFNUPCdpbnN0YW5jZSc+XG4gKiB8IFNUPCduYXQnPlxuICogfCBTVDwncmF0aW8nPlxuICogfCBTVDwnc3RyaW5nJz5cbiAqIHwgU1Q8J3RpbWVzdGFtcCc+XG4gKiB8IFNUPCdyZWxhdGl2ZVRpbWUnPlxuICogfCBTVDwndW5rbm93bic+fSBTeW5jU3BlY1R1cGxlXG4gKlxuICogQHR5cGVkZWYge1snaW52aXRhdGlvbicsIEludml0YXRpb25dfSBBc3luY1NwZWNUdXBsZVxuICovXG5cbi8qKlxuICogQHNlZSBtYWtlUGFyYW1NYW5hZ2VyU3luY1xuICogQHRlbXBsYXRlIHtSZWNvcmQ8S2V5d29yZCwgQXN5bmNTcGVjVHVwbGUgfCBTeW5jU3BlY1R1cGxlPn0gVFxuICogQHBhcmFtIHtTdG9yZWRQdWJsaXNoZXJLaXQ8R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gcHVibGlzaGVyS2l0XG4gKiBAcGFyYW0ge1R9IHNwZWNcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEByZXR1cm5zIHtUeXBlZFBhcmFtTWFuYWdlcjx7W0sgaW4ga2V5b2YgVF06IFRbS11bMF19Pn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQYXJhbU1hbmFnZXIgPSAocHVibGlzaGVyS2l0LCBzcGVjLCB6Y2YpID0+IHtcbiAgY29uc3QgYnVpbGRlciA9IG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyKHB1Ymxpc2hlcktpdCwgemNmLmdldFpvZVNlcnZpY2UoKSk7XG5cbiAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgW3R5cGUsIHZhbHVlXV0gb2YgT2JqZWN0LmVudHJpZXMoc3BlYykpIHtcbiAgICBjb25zdCBhZGQgPSBidWlsZGVyW2J1aWxkZXJNZXRob2ROYW1lKHR5cGUpXTtcbiAgICBpZiAoaXNBc3luY1t0eXBlXSkge1xuICAgICAgcHJvbWlzZXMucHVzaChhZGQobmFtZSwgdmFsdWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkKG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgLyogWFhYIGtpY2sgb2ZmIHByb21pc2VzIGJ1dCBkb24ndCBibG9jay4gVGhpcyBpcyBhIGNvbmNlc3Npb24gdG8gY29udHJhY3QgcmVpbmNhcm5hdGlvbiovXG4gIC8qIHdoaWNoIGNhbm5vdCBibG9jayBvbiBhIHJlbW90ZSBjYWxsLiovXG4gIC8qIFVOVElMIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDM0MyovXG4gIHZvaWQgRS53aGVuKFByb21pc2UuYWxsKHByb21pc2VzKSwgdW5kZWZpbmVkLCByZWFzb24gPT5cbiAgICB6Y2Yuc2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pLFxuICApO1xuXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7XG59OyRozY9fb25jZS5tYWtlUGFyYW1NYW5hZ2VyKG1ha2VQYXJhbU1hbmFnZXIpO1xuaGFyZGVuKG1ha2VQYXJhbU1hbmFnZXIpO1xuXG4vKipcbiAqIFVzZWQgb25seSB3aGVuIHRoZSBjb250cmFjdCBoYXMgbXVsdGlwbGUgcGFyYW0gbWFuYWdlcnMuXG4gKiBFeGFjdGx5IG9uZSBtdXN0IG1hbmFnZSB0aGUgZWxlY3RvcmF0ZSwgd2hpY2ggcmVxdWlyZXMgdGhlIGFzeW5jIHZlcnNpb24uXG4gKlxuICogQHNlZSBtYWtlUGFyYW1NYW5hZ2VyXG4gKiBAdGVtcGxhdGUge1JlY29yZDxLZXl3b3JkLCBTeW5jU3BlY1R1cGxlPn0gVFxuICogQHBhcmFtIHtTdG9yZWRQdWJsaXNoZXJLaXQ8R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gcHVibGlzaGVyS2l0XG4gKiBAcGFyYW0ge1R9IHNwZWNcbiAqIEByZXR1cm5zIHtUeXBlZFBhcmFtTWFuYWdlcjx7W0sgaW4ga2V5b2YgVF06IFRbS11bMF19Pn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQYXJhbU1hbmFnZXJTeW5jID0gKHB1Ymxpc2hlcktpdCwgc3BlYykgPT4ge1xuICBjb25zdCBidWlsZGVyID0gbWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIocHVibGlzaGVyS2l0KTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBbdHlwZSwgdmFsdWVdXSBvZiBPYmplY3QuZW50cmllcyhzcGVjKSkge1xuICAgIGNvbnN0IGFkZCA9IGJ1aWxkZXJbYnVpbGRlck1ldGhvZE5hbWUodHlwZSldO1xuICAgIGFkZCB8fCBGYWlsYE5vIGJ1aWxkZXIgbWV0aG9kIGZvciBwYXJhbSB0eXBlICR7cSh0eXBlKX1gO1xuICAgIGFkZChuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICByZXR1cm4gYnVpbGRlci5idWlsZCgpO1xufTskaM2PX29uY2UubWFrZVBhcmFtTWFuYWdlclN5bmMobWFrZVBhcmFtTWFuYWdlclN5bmMpO1xuaGFyZGVuKG1ha2VQYXJhbU1hbmFnZXJTeW5jKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIEludml0YXRpb24+ICYge0VsZWN0b3JhdGU6IEludml0YXRpb259fSBJIFByaXZhdGUgaW52aXRhdGlvbiB2YWx1ZXNcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlc01hcH0gTSBNYXAgb2YgdHlwZXMgb2YgY3VzdG9tIGdvdmVybmVkIHRlcm1zXG4gKiBAcGFyYW0ge1N0b3JlZFB1Ymxpc2hlcktpdDxHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGU+fSBwdWJsaXNoZXJLaXRcbiAqIEBwYXJhbSB7WkNGPEdvdmVybmFuY2VUZXJtczxNPj59IHpjZlxuICogQHBhcmFtIHtJfSBpbnZpdGF0aW9ucyBpbnZpdGF0aW9uIG9iamVjdHMsIHdoaWNoIG11c3QgY29tZSBmcm9tIHByaXZhdGVBcmdzXG4gKiBAcGFyYW0ge019IHBhcmFtVHlwZXNNYXBcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3ZlcnJpZGVzXVxuICogQHJldHVybnMge1R5cGVkUGFyYW1NYW5hZ2VyPE0gJiB7W0sgaW4ga2V5b2YgSV06ICdpbnZpdGF0aW9uJ30+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyA9IChcbiAgcHVibGlzaGVyS2l0LFxuICB6Y2YsXG4gIGludml0YXRpb25zLFxuICBwYXJhbVR5cGVzTWFwLFxuICBvdmVycmlkZXMsXG4pID0+IHtcbiAgaWYgKG92ZXJyaWRlcykge1xuICAgIGNvbnNvbGUubG9nKCdUUE0gJywgeyBvdmVycmlkZXMgfSk7XG4gIH1cblxuICBjb25zdCB7IGdvdmVybmVkUGFyYW1zIH0gPSB6Y2YuZ2V0VGVybXMoKTtcbiAgLyoqIEB0eXBlIHtBcnJheTxbS2V5d29yZCwgKFN5bmNTcGVjVHVwbGUgfCBBc3luY1NwZWNUdXBsZSldPn0gKi9cbiAgY29uc3QgbWFrZXJTcGVjRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHBhcmFtVHlwZXNNYXApLm1hcChcbiAgICAoW3BhcmFtS2V5LCBwYXJhbVR5cGVdKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgIG92ZXJyaWRlcyAmJiBvdmVycmlkZXNbcGFyYW1LZXldXG4gICAgICAgICAgPyBvdmVycmlkZXNbcGFyYW1LZXldXG4gICAgICAgICAgOiBnb3Zlcm5lZFBhcmFtc1twYXJhbUtleV0udmFsdWU7XG5cbiAgICAgIHJldHVybiBbcGFyYW1LZXksIC8qKiBAdHlwZSB7U3luY1NwZWNUdXBsZX0gKi8gKFtwYXJhbVR5cGUsIHZhbHVlXSldO1xuICAgIH0sXG4gICk7XG4gIC8qIEV2ZXJ5IGdvdmVybmVkIGNvbnRyYWN0IGhhcyBhbiBFbGVjdG9yYXRlIHBhcmFtIHRoYXQgc3RhcnRzIGFzIGBpbml0aWFsUG9zZXJJbnZpdGF0aW9uYCBwcml2YXRlIGFyZyovXG4gIGZvciAoY29uc3QgW25hbWUsIGludml0YXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKGludml0YXRpb25zKSkge1xuICAgIG1ha2VyU3BlY0VudHJpZXMucHVzaChbbmFtZSwgW1BhcmFtVHlwZXMuSU5WSVRBVElPTiwgaW52aXRhdGlvbl1dKTtcbiAgfVxuICBjb25zdCBtYWtlclNwZWMgPSBPYmplY3QuZnJvbUVudHJpZXMobWFrZXJTcGVjRW50cmllcyk7XG4gIG1ha2VyU3BlY1tDT05UUkFDVF9FTEVDVE9SQVRFXSB8fFxuICAgIEZhaWxgbWlzc2luZyBFbGVjdG9yYXRlIGludml0YXRpb24gcGFyYW0gdmFsdWVgO1xuXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIHJldHVybiBtYWtlUGFyYW1NYW5hZ2VyKHB1Ymxpc2hlcktpdCwgbWFrZXJTcGVjLCB6Y2YpO1xufTskaM2PX29uY2UubWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyhtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zKTtcbmhhcmRlbihtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQYXJhbU1hbmFnZXIiOlsibWFrZVBhcmFtTWFuYWdlciJdLCJtYWtlUGFyYW1NYW5hZ2VyU3luYyI6WyJtYWtlUGFyYW1NYW5hZ2VyU3luYyJdLCJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zIjpbIm1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwRXEfxwmAAAcJgAAMgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybm9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIiwiLi9jb250cmFjdEdvdmVybm9yS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsibWV0YSIsInN0YXJ0IiwidmFsaWRhdGVRdWVzdGlvbkRldGFpbHMiLCJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEUsbXVzdE1hdGNoLG1ha2VUcmFjZXIscHJvdmlkZVNpbmdsZXRvbixDT05UUkFDVF9FTEVDVE9SQVRFLHByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0LFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanNcIiwgW1tcInByb3ZpZGVTaW5nbGV0b25cIixbJGjNj19hID0+IChwcm92aWRlU2luZ2xldG9uID0gJGjNj19hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanNcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIixbJGjNj19hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjNj19hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybm9yS2l0LmpzXCIsIFtbXCJwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0ID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZVwiLFskaM2PX2EgPT4gKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q29udHJhY3RNZXRhLCBJbnN0YWxsYXRpb24sIEluc3RhbmNlLCBJbnZpdGF0aW9uLCBJc3N1ZXJLZXl3b3JkUmVjb3JkLCBTdGFuZGFyZFRlcm1zLCBaQ0YsIFpvZVNlcnZpY2V9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0dvdmVybmFibGVTdGFydEZuLCBHb3Zlcm5vckNyZWF0b3JGYWNldCwgR292ZXJub3JQdWJsaWMsIFBhcmFtQ2hhbmdlSXNzdWVEZXRhaWxzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSAnQGFnb3JpYy90aW1lJztcbiAqIEBpbXBvcnQge0ludml0YXRpb25QYXJhbX0gZnJvbSAnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy92YXQtZGF0YSc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdDR292JywgZmFsc2UpO1xuXG4vKiogQHR5cGUge0NvbnRyYWN0TWV0YTx0eXBlb2Ygc3RhcnQ+fSAqL1xuICAgICAgIGNvbnN0IG1ldGEgPSB7XG4gIHVwZ3JhZGFiaWxpdHk6ICdjYW5VcGdyYWRlJyxcbn07JGjNj19vbmNlLm1ldGEobWV0YSk7XG5oYXJkZW4obWV0YSk7XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCB0aGUgcXVlc3Rpb24gZGV0YWlscyBjb3JyZXNwb25kIHRvIGEgcGFyYW1ldGVyIGNoYW5nZSBxdWVzdGlvblxuICogdGhhdCB0aGUgZWxlY3RvcmF0ZSBob3N0cywgYW5kIHRoYXQgdGhlIHZvdGVDb3VudGVyIGFuZCBvdGhlciBkZXRhaWxzIGFyZVxuICogY29uc2lzdGVudCB3aXRoIGl0LlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBlbGVjdG9yYXRlXG4gKiBAcGFyYW0ge1BhcmFtQ2hhbmdlSXNzdWVEZXRhaWxzfSBkZXRhaWxzXG4gKi9cbiAgICAgICBjb25zdCB2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyA9IGFzeW5jICh6b2UsIGVsZWN0b3JhdGUsIGRldGFpbHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGNvdW50ZXJJbnN0YW5jZSxcbiAgICBpc3N1ZTogeyBjb250cmFjdDogZ292ZXJuZWRJbnN0YW5jZSB9LFxuICB9ID0gZGV0YWlscztcbiAgbXVzdE1hdGNoKGRldGFpbHMsIFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuICBjb25zdCBnb3Zlcm5vckluc3RhbmNlID0gYXdhaXQgRS5nZXQoRSh6b2UpLmdldFRlcm1zKGdvdmVybmVkSW5zdGFuY2UpKVxuICAgIC5lbGVjdGlvbk1hbmFnZXI7XG4gIGNvbnN0IGdvdmVybm9yUHVibGljID0gRSh6b2UpLmdldFB1YmxpY0ZhY2V0KGdvdmVybm9ySW5zdGFuY2UpO1xuXG4gIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgRShnb3Zlcm5vclB1YmxpYykudmFsaWRhdGVWb3RlQ291bnRlcihjb3VudGVySW5zdGFuY2UpLFxuICAgIEUoZ292ZXJub3JQdWJsaWMpLnZhbGlkYXRlRWxlY3RvcmF0ZShlbGVjdG9yYXRlKSxcbiAgICBFKGdvdmVybm9yUHVibGljKS52YWxpZGF0ZVRpbWVyKGRldGFpbHMuY2xvc2luZ1J1bGUpLFxuICBdKTtcbn07JGjNj19vbmNlLnZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzKHZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzKTtcbmhhcmRlbih2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyk7XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCB0aGUgcXVlc3Rpb25zIGNvdW50ZWQgYnkgdGhlIHZvdGVDb3VudGVyIGNvcnJlc3BvbmQgdG8gYVxuICogcGFyYW1ldGVyIGNoYW5nZSBxdWVzdGlvbiB0aGF0IHRoZSBlbGVjdG9yYXRlIGhvc3RzLCBhbmQgdGhhdCB0aGVcbiAqIHZvdGVDb3VudGVyIGFuZCBvdGhlciBkZXRhaWxzIGFyZSBjb25zaXN0ZW50LlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBlbGVjdG9yYXRlXG4gKiBAcGFyYW0ge0luc3RhbmNlfSB2b3RlQ291bnRlclxuICovXG4gICAgICAgY29uc3QgdmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyID0gYXN5bmMgKFxuICB6b2UsXG4gIGVsZWN0b3JhdGUsXG4gIHZvdGVDb3VudGVyLFxuKSA9PiB7XG4gIC8qKiBAdHlwZSB7UHJvbWlzZTxhbnk+fSAqL1xuICBjb25zdCBjb3VudGVyUHVibGljUCA9IEUoem9lKS5nZXRQdWJsaWNGYWNldCh2b3RlQ291bnRlcik7XG4gIGNvbnN0IHF1ZXN0aW9uRGV0YWlscyA9IGF3YWl0IEUoY291bnRlclB1YmxpY1ApLmdldERldGFpbHMoKTtcblxuICByZXR1cm4gdmFsaWRhdGVRdWVzdGlvbkRldGFpbHMoem9lLCBlbGVjdG9yYXRlLCBxdWVzdGlvbkRldGFpbHMpO1xufTskaM2PX29uY2UudmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyKHZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlcik7XG5oYXJkZW4odmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7U3RhbmRhcmRUZXJtc30gQ29udHJhY3RHb3Zlcm5vclRlcm1zXG4gKiBAcHJvcGVydHkge1RpbWVyU2VydmljZX0gdGltZXJcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbGF0aW9ufSBnb3Zlcm5lZENvbnRyYWN0SW5zdGFsbGF0aW9uXG4gKi9cblxuLyoqXG4gKiBDb250cmFjdEdvdmVybm9yIGlzIGFuIEVsZWN0aW9uTWFuYWdlciB0aGF0IHN0YXJ0cyB1cCBhIGNvbnRyYWN0IGFuZCBoYW5kc1xuICogaXRzIG93biBjcmVhdG9yIGEgZmFjZXQgdGhhdCBhbGxvd3MgdGhlbSB0byBtYW5hZ2UgdGhhdCBjb250cmFjdCdzIEFQSXMsXG4gKiBvZmZlciBmaWx0ZXJzLCBhbmQgcGFyYW1ldGVycy5cbiAqXG4gKiBUaGUgdGVybXMgZm9yIHRoaXMgY29udHJhY3QgaW5jbHVkZSB0aGUgVGltZXIsIGFuZCB0aGUgSW5zdGFsbGF0aW9uIHRvIGJlXG4gKiBzdGFydGVkLCBhcyB3ZWxsIGFzIGFuIGlzc3VlcktleXdvcmRSZWNvcmQgb3IgdGVybXMgbmVlZGVkIGJ5IHRoZSBnb3Zlcm5lZFxuICogY29udHJhY3QuIFRob3NlIGRldGFpbHMgZm9yIHRoZSBnb3Zlcm5lZCBjb250cmFjdCBhcmUgaW5jbHVkZWQgaW4gdGhpc1xuICogY29udHJhY3QncyB0ZXJtcyBhcyBhIFwiZ292ZXJuZWRcIiByZWNvcmQuIElmIHRoZSBjb250cmFjdCBleHBlY3RzIHByaXZhdGVBcmdzLFxuICogdGhvc2Ugd2lsbCBiZSBwcm92aWRlZCBpbiB0aGlzIGNvbnRyYWN0J3MgYHByaXZhdGVBcmdzYCB1bmRlciAnZ292ZXJuZWQ6Jy5cbiAqXG4gKiB0ZXJtcyA9IHtcbiAqICAgIHRpbWVyLFxuICogICAgZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbixcbiAqICAgIGdvdmVybmVkOiB7IGlzc3VlcktleXdvcmRSZWNvcmQsIHRlcm1zIH0sXG4gKiB9O1xuICpcbiAqIFRoZSBlbGVjdG9yYXRlIHRoYXQgd2lsbCB2b3RlIG9uIGdvdmVybmFuY2UgcXVlc3Rpb25zIGlzIGl0c2VsZiBhIGdvdmVybmVkXG4gKiBwYXJhbWV0ZXIuIEl0cyB2YWx1ZSBpcyBhdmFpbGFibGUgZnJvbSB0aGUgcHVibGljRmFjZXQgdXNpbmdcbiAqIGdldEVsZWN0b3JhdGVJbnN0YW5jZSgpLiBXaGVuIGNyZWF0aW5nIG5ldyBxdWVzdGlvbnMsIHdlIHVzZVxuICogZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSB0byBpbmZvcm0gdGhlIGVsZWN0b3JhdGUgYWJvdXQgdGhlIG5ldyBxdWVzdGlvbi5cbiAqXG4gKiBUaGUgZ292ZXJuZWRDb250cmFjdCBpcyByZXNwb25zaWJsZSBmb3Igc3VwcGx5aW5nIGdldFBhcmFtTWdyUmV0cmlldmVyKCkgaW5cbiAqIGl0cyBjcmVhdG9yRmFjZXQuIGdldFBhcmFtTWdyUmV0cmlldmVyKCkgdGFrZXMgYSBQYXJhbVNwZWNpZmljYXRpb24sIHdoaWNoXG4gKiBpZGVudGlmaWVzIHRoZSBwYXJhbWV0ZXIgdG8gYmUgdm90ZWQgb24uIEEgbWluaW1hbCBQYXJhbVNwZWNpZmljYXRpb25cbiAqIHNwZWNpZmllcyB0aGUga2V5IHdoaWNoIGlkZW50aWZpZXMgYSBwYXJ0aWN1bGFyIHBhcmFtTWFuYWdlciAoZXZlbiBpZiB0aGVyZSdzXG4gKiBvbmx5IG9uZSkgYW5kIHRoZSBwYXJhbWV0ZXJOYW1lLiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgUGFyYW1TcGVjaWZpY2F0aW9uIGlzXG4gKiB1cCB0byB0aGUgY29udHJhY3QuXG4gKlxuICogVGhlIGNvbnRyYWN0R292ZXJub3IgY3JlYXRvckZhY2V0IGluY2x1ZGVzIGB2b3RlT25QYXJhbUNoYW5nZXNgLFxuICogYHZvdGVPbkZpbHRlcmAsIGFuZCBgdm90ZU9uQXBpSW52b2NhdGlvbmAuIGB2b3RlT25QYXJhbUNoYW5nZXNgIGlzIHVzZWQgdG9cbiAqIGNyZWF0ZSBxdWVzdGlvbnMgdGhhdCB3aWxsIGF1dG9tYXRpY2FsbHkgdXBkYXRlIGNvbnRyYWN0IHBhcmFtZXRlcnMgaWZcbiAqIHBhc3NlZC4gYHZvdGVPbkZpbHRlcmAgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHF1ZXN0aW9ucyB0aGF0IHdpbGwgcHJldmVudCB0aGVcbiAqIGV4ZXJjaXNlIG9mIGNlcnRhaW4gaW52aXRhdGlvbnMgaWYgcGFzc2VkLiBgdm90ZU9uQXBpSW52b2NhdGlvbmAgY3JlYXRlc1xuICogcXVlc3Rpb25zIHRoYXQgd2lsbCBpbnZva2UgcHJlLWRlZmluZWQgQVBJcyBpbiB0aGUgY29udHJhY3QuXG4gKlxuICogVGhpcyBmYWNldCB3aWxsIHVzdWFsbHkgYmUgY2xvc2VseSBoZWxkLiBUaGUgY3JlYXRvckZhY2V0IGNhbiBhbHNvIGJlIHVzZWQgdG9cbiAqIHJldHJpZXZlIHRoZSBnb3Zlcm5lZCBpbnN0YW5jZSwgcHVibGljRmFjZXQsIGFuZCBpdHMgY3JlYXRvckZhY2V0IHdpdGhcbiAqIHRoZSB2b3RlT24qKCkgbWV0aG9kcyBvbWl0dGVkLlxuICpcbiAqIFRoZSBnb3Zlcm5lZCBjb250cmFjdCdzIHRlcm1zIGluY2x1ZGUgdGhlIGluc3RhbmNlIG9mIHRoaXMgKGdvdmVybmluZylcbiAqIGNvbnRyYWN0IChhcyBlbGVjdGlvbk1hbmFnZXIpIHNvIGNsaWVudHMgd2lsbCBiZSBhYmxlIHRvIGxvb2sgdXAgdGhlIHN0YXRlXG4gKiBvZiB0aGUgZ292ZXJuZWQgcGFyYW1ldGVycy5cbiAqXG4gKiB0ZW1wbGF0ZSB7e319IFBGIFB1YmxpYyBmYWNldCBvZiBnb3Zlcm5lZFxuICogdGVtcGxhdGUge0NvbnRyYWN0UG93ZXJmdWxDcmVhdG9yRmFjZXR9IENGIENyZWF0b3IgZmFjZXQgb2YgZ292ZXJuZWRcbiAqIHR5cGUge0NvbnRyYWN0U3RhcnRGbjxcbiAqIEdvdmVybm9yUHVibGljLFxuICogR292ZXJub3JDcmVhdG9yRmFjZXQ8UEYsQ0Y+LFxuICoge1xuICogICB0aW1lcjogVGltZXJTZXJ2aWNlLFxuICogICBnb3Zlcm5lZENvbnRyYWN0SW5zdGFsbGF0aW9uOiBJbnN0YWxsYXRpb248Q0Y+LFxuICogICBnb3Zlcm5lZDoge1xuICogICAgIGlzc3VlcktleXdvcmRSZWNvcmQ6IElzc3VlcktleXdvcmRSZWNvcmQsXG4gKiAgICAgdGVybXM6IHtnb3Zlcm5lZFBhcmFtczoge1tDT05UUkFDVF9FTEVDVE9SQVRFXTogSW52aXRhdGlvblBhcmFtfX0sXG4gKiAgIH1cbiAqIH0+fVxuICovXG5cbi8qKlxuICogU3RhcnQgYW4gaW5zdGFuY2Ugb2YgYSBnb3Zlcm5vciwgZ292ZXJuaW5nIGEgXCJnb3Zlcm5lZFwiIGNvbnRyYWN0IHNwZWNpZmllZCBpbiB0ZXJtcy5cbiAqXG4gKiBAdGVtcGxhdGUge0dvdmVybmFibGVTdGFydEZufSBTRiBTdGFydCBmdW5jdGlvbiBvZiBnb3Zlcm5lZCBjb250cmFjdFxuICogQHBhcmFtIHtaQ0Y8e1xuICogICB0aW1lcjogVGltZXJTZXJ2aWNlLFxuICogICBnb3Zlcm5lZENvbnRyYWN0SW5zdGFsbGF0aW9uOiBJbnN0YWxsYXRpb248U0Y+LFxuICogICBnb3Zlcm5lZDoge1xuICogICAgIGlzc3VlcktleXdvcmRSZWNvcmQ6IElzc3VlcktleXdvcmRSZWNvcmQsXG4gKiAgICAgdGVybXM6IHtnb3Zlcm5lZFBhcmFtczoge1tDT05UUkFDVF9FTEVDVE9SQVRFXTogSW52aXRhdGlvblBhcmFtfX0sXG4gKiAgICAgbGFiZWw/OiBzdHJpbmcsXG4gKiAgIH1cbiAqIH0+fSB6Y2ZcbiAqIEBwYXJhbSB7e1xuICogICBnb3Zlcm5lZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAqIH19IHByaXZhdGVBcmdzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7XG4gKiAgIGNyZWF0b3JGYWNldDogR292ZXJub3JDcmVhdG9yRmFjZXQ8U0Y+LFxuICogICBwdWJsaWNGYWNldDogR292ZXJub3JQdWJsaWMsXG4gKiB9Pn1cbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICovXG4gICAgICAgY29uc3Qgc3RhcnQgPSBhc3luYyAoemNmLCBwcml2YXRlQXJncywgYmFnZ2FnZSkgPT4ge1xuICB0cmFjZSgnc3RhcnQnKTtcbiAgY29uc3Qgem9lID0gemNmLmdldFpvZVNlcnZpY2UoKTtcbiAgdHJhY2UoJ2dldFRlcm1zJywgemNmLmdldFRlcm1zKCkpO1xuICBjb25zdCB7XG4gICAgdGltZXIsXG4gICAgZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbixcbiAgICBnb3Zlcm5lZDoge1xuICAgICAgaXNzdWVyS2V5d29yZFJlY29yZDogZ292ZXJuZWRJc3N1ZXJLZXl3b3JkUmVjb3JkLFxuICAgICAgdGVybXM6IGNvbnRyYWN0VGVybXMsXG4gICAgICBsYWJlbDogZ292ZXJuZWRDb250cmFjdExhYmVsLFxuICAgIH0sXG4gIH0gPSB6Y2YuZ2V0VGVybXMoKTtcbiAgdHJhY2UoJ2NvbnRyYWN0VGVybXMnLCBjb250cmFjdFRlcm1zKTtcbiAgY29udHJhY3RUZXJtcy5nb3Zlcm5lZFBhcmFtc1tDT05UUkFDVF9FTEVDVE9SQVRFXSB8fFxuICAgIEZhaWxgQ29udHJhY3QgbXVzdCBkZWNsYXJlICR7Q09OVFJBQ1RfRUxFQ1RPUkFURX0gYXMgYSBnb3Zlcm5lZCBwYXJhbWV0ZXJgO1xuXG4gIGNvbnN0IG1ha2VDb250cmFjdEdvdmVybm9yS2l0ID0gcHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQoYmFnZ2FnZSwge1xuICAgIHRpbWVyLFxuICAgIHpvZSxcbiAgfSk7XG5cbiAgdHJhY2UoJ2F3YWl0aW5nIHByb3ZpZGVTaW5nbGV0b24oKScpO1xuICBjb25zdCBnb3Zlcm5vcktpdCA9IGF3YWl0IHByb3ZpZGVTaW5nbGV0b24oXG4gICAgYmFnZ2FnZSxcbiAgICAnY29udHJhY3RHb3Zlcm5vcktpdCcsXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYXVnbWVudGVkVGVybXMgPSBoYXJkZW4oe1xuICAgICAgICAuLi5jb250cmFjdFRlcm1zLFxuICAgICAgICBlbGVjdGlvbk1hbmFnZXI6IHpjZi5nZXRJbnN0YW5jZSgpLFxuICAgICAgfSk7XG5cbiAgICAgIHRyYWNlKCdzdGFydGluZyBnb3Zlcm5lZENvbnRyYWN0SW5zdGFsbGF0aW9uIG9mJywgZ292ZXJuZWRDb250cmFjdExhYmVsKTtcbiAgICAgIGNvbnN0IHN0YXJ0ZWRJbnN0YW5jZUtpdCA9IGF3YWl0IEUoem9lKS5zdGFydEluc3RhbmNlKFxuICAgICAgICBnb3Zlcm5lZENvbnRyYWN0SW5zdGFsbGF0aW9uLFxuICAgICAgICBnb3Zlcm5lZElzc3VlcktleXdvcmRSZWNvcmQsXG5cbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggZ292ZXJuYW5jZSB0eXBlcyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzcxNzgqL1xuICAgICAgICBhdWdtZW50ZWRUZXJtcyxcbiAgICAgICAgcHJpdmF0ZUFyZ3MuZ292ZXJuZWQsXG4gICAgICAgIGdvdmVybmVkQ29udHJhY3RMYWJlbCxcbiAgICAgICk7XG4gICAgICB0cmFjZSgnYXdhaXRpbmcgcmVtb3RlIGxpbWl0ZWRDcmVhdG9yRmFjZXQnKTtcbiAgICAgIGNvbnN0IGxpbWl0ZWRDcmVhdG9yRmFjZXQgPSBhd2FpdCBFKFxuICAgICAgICBzdGFydGVkSW5zdGFuY2VLaXQuY3JlYXRvckZhY2V0LFxuICAgICAgKS5nZXRMaW1pdGVkQ3JlYXRvckZhY2V0KCk7XG5cbiAgICAgIHJldHVybiBtYWtlQ29udHJhY3RHb3Zlcm5vcktpdChzdGFydGVkSW5zdGFuY2VLaXQsIGxpbWl0ZWRDcmVhdG9yRmFjZXQpO1xuICAgIH0sXG4gICk7XG5cbiAgLyogQXQgdGhpcyBwb2ludCwgc29tZSByZW1vdGUgY2FsbHMgc3RpbGwgbmVlZCB0byBiZSBtYWRlIHdpdGhpbiB0aGUgZ292ZXJub3JLaXQuKi9cbiAgLyogU3BlY2lmaWNhbGx5LCB0byB0aGUgdmF0IG9mIHRoZSBnb3Zlcm5lZCBjb250cmFjdCBmb3IgaXRzIEFQSSBuYW1lcy4gVGhlIGV4byovXG4gIC8qIGRlZmVycyB0aGF0IHVudGlsIEFQSSBnb3Zlcm5hbmNlIGlzIHJlcXVlc3RlZCB0byBiZSBpbnZva2VkIG9yIHZhbGlkYXRlZC4qL1xuXG4gIHRyYWNlKCdzdGFydCBjb21wbGV0ZScpO1xuXG4gIC8qIENSVUNJQUw6IG9ubHkgY29udHJhY3RHb3Zlcm5vciBzaG91bGQgZ2V0IHRoZSBhYmlsaXR5IHRvIHVwZGF0ZSBwYXJhbXMqL1xuICByZXR1cm4geyBjcmVhdG9yRmFjZXQ6IGdvdmVybm9yS2l0LmNyZWF0b3IsIHB1YmxpY0ZhY2V0OiBnb3Zlcm5vcktpdC5wdWJsaWMgfTtcbn07JGjNj19vbmNlLnN0YXJ0KHN0YXJ0KTtcbmhhcmRlbihzdGFydCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZXRhIjpbIm1ldGEiXSwidmFsaWRhdGVRdWVzdGlvbkRldGFpbHMiOlsidmFsaWRhdGVRdWVzdGlvbkRldGFpbHMiXSwidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIjpbInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciJdLCJzdGFydCI6WyJzdGFydCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACdbcMd5S4AAOUuAAA1AAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJub3JLaXQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL3RpbWUiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5BcGkuanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5GaWx0ZXIuanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbInByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxVbmd1YXJkZWRIZWxwZXJJLG1ha2VUcmFjZXIsTSxwcmVwYXJlRXhvQ2xhc3NLaXQsRSxJbnZpdGF0aW9uU2hhcGUsSW5zdGFuY2VIYW5kbGVTaGFwZSxJbnN0YWxsYXRpb25TaGFwZSxUaW1lc3RhbXBTaGFwZSxzZXR1cEFwaUdvdmVybmFuY2Usc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlLENPTlRSQUNUX0VMRUNUT1JBVEUsc2V0dXBQYXJhbUdvdmVybmFuY2UsQ2xvc2luZ1J1bGVTaGFwZSxQYXJhbUNoYW5nZXNTcGVjU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiVW5ndWFyZGVkSGVscGVySVwiLFskaM2PX2EgPT4gKFVuZ3VhcmRlZEhlbHBlckkgPSAkaM2PX2EpXV0sW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJJbnZpdGF0aW9uU2hhcGVcIixbJGjNj19hID0+IChJbnZpdGF0aW9uU2hhcGUgPSAkaM2PX2EpXV0sW1wiSW5zdGFuY2VIYW5kbGVTaGFwZVwiLFskaM2PX2EgPT4gKEluc3RhbmNlSGFuZGxlU2hhcGUgPSAkaM2PX2EpXV0sW1wiSW5zdGFsbGF0aW9uU2hhcGVcIixbJGjNj19hID0+IChJbnN0YWxsYXRpb25TaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIixbJGjNj19hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRozY9fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qc1wiLCBbW1wic2V0dXBBcGlHb3Zlcm5hbmNlXCIsWyRozY9fYSA9PiAoc2V0dXBBcGlHb3Zlcm5hbmNlID0gJGjNj19hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuRmlsdGVyLmpzXCIsIFtbXCJzZXR1cEZpbHRlckdvdmVybmFuY2VcIixbJGjNj19hID0+IChzZXR1cEZpbHRlckdvdmVybmFuY2UgPSAkaM2PX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qc1wiLCBbW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiLFskaM2PX2EgPT4gKENPTlRSQUNUX0VMRUNUT1JBVEUgPSAkaM2PX2EpXV0sW1wic2V0dXBQYXJhbUdvdmVybmFuY2VcIixbJGjNj19hID0+IChzZXR1cFBhcmFtR292ZXJuYW5jZSA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiQ2xvc2luZ1J1bGVTaGFwZVwiLFskaM2PX2EgPT4gKENsb3NpbmdSdWxlU2hhcGUgPSAkaM2PX2EpXV0sW1wiUGFyYW1DaGFuZ2VzU3BlY1NoYXBlXCIsWyRozY9fYSA9PiAoUGFyYW1DaGFuZ2VzU3BlY1NoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZXR1cm59IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtDb250cmFjdE1ldGEsIEluc3RhbGxhdGlvbiwgSW5zdGFuY2UsIEludml0YXRpb24sIFpDRiwgWm9lU2VydmljZX0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7Q2xvc2luZ1J1bGUsIEdvdmVybmFibGVTdGFydEZuLCBMaW1pdGVkQ0YsIFBvc2VyRmFjZXQsIFZvdGVPbkFwaUludm9jYXRpb24sIFZvdGVPbk9mZmVyRmlsdGVyLCBWb3RlT25QYXJhbUNoYW5nZXN9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy92YXQtZGF0YSc7XG4gKiBAaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gJ0BhZ29yaWMvdGltZSc7XG4gKiBAaW1wb3J0IHtTdGFydGVkSW5zdGFuY2VLaXR9IGZyb20gJ0BhZ29yaWMvem9lL3NyYy96b2VTZXJ2aWNlL3V0aWxzLmpzJztcbiAqIEBpbXBvcnQge1R5cGVkUGFyYW1NYW5hZ2VyfSBmcm9tICcuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdDR0snLCBmYWxzZSk7XG5cbmNvbnN0IENvbnRyYWN0R292ZXJub3JLaXRJID0ge1xuICBoZWxwZXI6IFVuZ3VhcmRlZEhlbHBlckksXG4gIGNyZWF0b3I6IE0uaW50ZXJmYWNlKCdDb250cmFjdCBHb3Zlcm5vciBLaXQgY3JlYXRvcicsIHtcbiAgICByZXBsYWNlRWxlY3RvcmF0ZTogTS5jYWxsKEludml0YXRpb25TaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgdm90ZU9uUGFyYW1DaGFuZ2VzOiBNLmNhbGwoXG4gICAgICBJbnN0YWxsYXRpb25TaGFwZSxcbiAgICAgIFRpbWVzdGFtcFNoYXBlLFxuICAgICAgUGFyYW1DaGFuZ2VzU3BlY1NoYXBlLFxuICAgICkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgdm90ZU9uQXBpSW52b2NhdGlvbjogTS5jYWxsKFxuICAgICAgTS5zdHJpbmcoKSxcbiAgICAgIE0uYXJyYXlPZihNLmFueSgpKSxcbiAgICAgIEluc3RhbGxhdGlvblNoYXBlLFxuICAgICAgVGltZXN0YW1wU2hhcGUsXG4gICAgKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICB2b3RlT25PZmZlckZpbHRlcjogTS5jYWxsKFxuICAgICAgSW5zdGFsbGF0aW9uU2hhcGUsXG4gICAgICBUaW1lc3RhbXBTaGFwZSxcbiAgICAgIE0uYXJyYXlPZihNLnN0cmluZygpKSxcbiAgICApLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIGdldENyZWF0b3JGYWNldDogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnRWxlY3RvcmF0ZUNyZWF0b3InKSksXG4gICAgZ2V0QWRtaW5GYWNldDogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnRWxlY3RvcmF0ZUFkbWluJykpLFxuICAgIGdldEluc3RhbmNlOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpLFxuICAgIGdldFB1YmxpY0ZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdFbGVjdG9yYXRlUHVibGljJykpLFxuICB9KSxcbiAgcHVibGljOiBNLmludGVyZmFjZSgnQ29udHJhY3QgR292ZXJub3IgS2l0IHB1YmxpYycsIHtcbiAgICBnZXRFbGVjdG9yYXRlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgvKiBJbnN0YW5jZSAqLykpLFxuICAgIGdldEdvdmVybmVkQ29udHJhY3Q6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSksXG4gICAgdmFsaWRhdGVWb3RlQ291bnRlcjogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIHZhbGlkYXRlRWxlY3RvcmF0ZTogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIHZhbGlkYXRlVGltZXI6IE0uY2FsbChDbG9zaW5nUnVsZVNoYXBlKS5yZXR1cm5zKCksXG4gIH0pLFxufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3tcbiAqICAgdGltZXI6IFRpbWVyU2VydmljZSxcbiAqICAgem9lOiBFUmVmPFpvZVNlcnZpY2U+LFxuICogfX0gcG93ZXJzXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdCA9IChiYWdnYWdlLCBwb3dlcnMpID0+IHtcbiAgLyogVGhlc2UgYXJlIHByb2R1Y2VkIGp1c3QtaW4tdGltZSBiZWNhdXNlIEFQSSBnb3Zlcm5hbmNlIG1ha2VzIHJlbW90ZSBjYWxscywgd2hpY2ggcHJldmVudCB2YXQgcmVzdGFydC4qL1xuICAvKiBUaGUgb3RoZXIgdHdvIGNvdWxkIGhhcHBlbiBkdXJpbmcgcmVzdGFydCBidXQgdGhleSdkIG5lZWQgdG8gaGF2ZSBhIHNlcGFyYXRlIGhvb2ssIHNvIGZvciBjb25zaXN0ZW5jeSovXG4gIC8qIHRoZXkncmUgYWxsIGxhenkuKi9cbiAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXR1cEZpbHRlckdvdmVybmFuY2U+fSAqL1xuICBsZXQgZmlsdGVyR292ZXJuYW5jZTtcbiAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXR1cFBhcmFtR292ZXJuYW5jZT59ICovXG4gIGxldCBwYXJhbUdvdmVybmFuY2U7XG4gIC8qKiBAdHlwZSB7RVJldHVybjx0eXBlb2Ygc2V0dXBBcGlHb3Zlcm5hbmNlPn0gKi9cbiAgbGV0IGFwaUdvdmVybmFuY2U7XG5cbiAgLyoqIEB0eXBlIHthbnl9ICovXG4gIGxldCBwb3NlckZhY2V0O1xuXG4gIGNvbnN0IG1ha2VDb250cmFjdEdvdmVybm9yS2l0ID0gcHJlcGFyZUV4b0NsYXNzS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ0NvbnRyYWN0R292ZXJub3JLaXQnLFxuICAgIENvbnRyYWN0R292ZXJub3JLaXRJLFxuICAgIC8qKlxuICogQHBhcmFtIHtTdGFydGVkSW5zdGFuY2VLaXQ8R292ZXJuYWJsZVN0YXJ0Rm4+fSBzdGFydGVkSW5zdGFuY2VLaXRcbiAqIEBwYXJhbSB7TGltaXRlZENGPHVua25vd24+fSBsaW1pdGVkQ3JlYXRvckZhY2V0XG4gKi9cbiAgICAoc3RhcnRlZEluc3RhbmNlS2l0LCBsaW1pdGVkQ3JlYXRvckZhY2V0KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGFydGVkSW5zdGFuY2VLaXQsXG4gICAgICAgIGxpbWl0ZWRDcmVhdG9yRmFjZXQsXG4gICAgICAgIGN1cnJlbnRJbnZpdGF0aW9uOiAvKiogQHR5cGUge0ludml0YXRpb248dW5rbm93biwgbmV2ZXI+P30gKi8gKG51bGwpLFxuICAgICAgfTtcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlbHBlcjoge1xuICAgICAgICAvKiogQHR5cGUgeygpID0+IFByb21pc2U8SW5zdGFuY2U+fSAqL1xuICAgICAgICBhc3luYyBnZXRFbGVjdG9yYXRlSW5zdGFuY2UoKSB7XG4gICAgICAgICAgY29uc3QgeyBwdWJsaWNGYWNldCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBjb25zdCBpbnZpdGF0aW9uQW1vdW50ID1cbiAgICAgICAgICAgIGF3YWl0IEUocHVibGljRmFjZXQpLmdldEludml0YXRpb25BbW91bnQoQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG4gICAgICAgICAgcmV0dXJuIGludml0YXRpb25BbW91bnQudmFsdWVbMF0uaW5zdGFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKiBAdHlwZSB7KCkgPT4gUHJvbWlzZTxQb3NlckZhY2V0Pn0gKi9cbiAgICAgICAgYXN5bmMgZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSB7XG4gICAgICAgICAgY29uc3QgeyBjcmVhdG9yRmFjZXQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3QgbmV3SW52aXRhdGlvbiA9IGF3YWl0IEUoXG4gICAgICAgICAgICBFKEUoY3JlYXRvckZhY2V0KS5nZXRQYXJhbU1nclJldHJpZXZlcigpKS5nZXQoe1xuICAgICAgICAgICAgICBrZXk6ICdnb3Zlcm5lZFBhcmFtcycsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLmdldEludGVybmFsUGFyYW1WYWx1ZShDT05UUkFDVF9FTEVDVE9SQVRFKTtcblxuICAgICAgICAgIGlmIChuZXdJbnZpdGF0aW9uICE9PSB0aGlzLnN0YXRlLmN1cnJlbnRJbnZpdGF0aW9uKSB7XG4gICAgICAgICAgICBwb3NlckZhY2V0ID0gRShFKHBvd2Vycy56b2UpLm9mZmVyKG5ld0ludml0YXRpb24pKS5nZXRPZmZlclJlc3VsdCgpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5jdXJyZW50SW52aXRhdGlvbiA9IG5ld0ludml0YXRpb247XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwb3NlckZhY2V0O1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBwcm92aWRlQXBpR292ZXJuYW5jZSgpIHtcbiAgICAgICAgICBjb25zdCB7IHRpbWVyIH0gPSBwb3dlcnM7XG4gICAgICAgICAgY29uc3QgeyBjcmVhdG9yRmFjZXQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgYXdhaXQgbnVsbDtcbiAgICAgICAgICBpZiAoIWFwaUdvdmVybmFuY2UpIHtcbiAgICAgICAgICAgIHRyYWNlKCdhd2FpdGluZyBnb3Zlcm5lZCBBUEkgZGVwZW5kZW5jaWVzJyk7XG4gICAgICAgICAgICBjb25zdCBnb3Zlcm5lZE5hbWVzID0gYXdhaXQgRShjcmVhdG9yRmFjZXQpLmdldEdvdmVybmVkQXBpTmFtZXMoKTtcbiAgICAgICAgICAgIHRyYWNlKCdzZXR1cEFwaUdvdmVybmFuY2UnKTtcbiAgICAgICAgICAgIGFwaUdvdmVybmFuY2UgPSBnb3Zlcm5lZE5hbWVzLmxlbmd0aFxuICAgICAgICAgICAgICA/IHNldHVwQXBpR292ZXJuYW5jZShcbiAgICAgICAgICAgICAgICAgICgpID0+IEUoY3JlYXRvckZhY2V0KS5nZXRHb3Zlcm5lZEFwaXMoKSxcbiAgICAgICAgICAgICAgICAgICgpID0+IEUoY3JlYXRvckZhY2V0KS5nZXRHb3Zlcm5lZEFwaU5hbWVzKCksXG4gICAgICAgICAgICAgICAgICB0aW1lcixcbiAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMuZmFjZXRzLmhlbHBlci5nZXRVcGRhdGVkUG9zZXJGYWNldCgpLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAvKiBpZiB3ZSBhcmVuJ3QgZ292ZXJuaW5nIEFQSXMsIHZvdGVPbkFwaUludm9jYXRpb24gc2hvdWxkbid0IGJlIGNhbGxlZCovXG4gICAgICAgICAgICAgICAgICB2b3RlT25BcGlJbnZvY2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdhcGkgZ292ZXJuYW5jZSBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZWRRdWVzdGlvbjogKCkgPT4gZmFsc2UsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFwaUdvdmVybmFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIHByb3ZpZGVGaWx0ZXJHb3Zlcm5hbmNlKCkge1xuICAgICAgICAgIGlmICghZmlsdGVyR292ZXJuYW5jZSkge1xuICAgICAgICAgICAgY29uc3QgeyB0aW1lciB9ID0gcG93ZXJzO1xuICAgICAgICAgICAgY29uc3QgeyBjcmVhdG9yRmFjZXQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgICBmaWx0ZXJHb3Zlcm5hbmNlID0gc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlKFxuICAgICAgICAgICAgICB0aW1lcixcbiAgICAgICAgICAgICAgKCkgPT4gdGhpcy5mYWNldHMuaGVscGVyLmdldFVwZGF0ZWRQb3NlckZhY2V0KCksXG4gICAgICAgICAgICAgIGNyZWF0b3JGYWNldCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaWx0ZXJHb3Zlcm5hbmNlO1xuICAgICAgICB9LFxuICAgICAgICBwcm92aWRlUGFyYW1Hb3Zlcm5hbmNlKCkge1xuICAgICAgICAgIGlmICghcGFyYW1Hb3Zlcm5hbmNlKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVyIH0gPSBwb3dlcnM7XG4gICAgICAgICAgICBjb25zdCB7IGNyZWF0b3JGYWNldCwgaW5zdGFuY2UgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgICBwYXJhbUdvdmVybmFuY2UgPSBzZXR1cFBhcmFtR292ZXJuYW5jZShcbiAgICAgICAgICAgICAgKCkgPT4gRShjcmVhdG9yRmFjZXQpLmdldFBhcmFtTWdyUmV0cmlldmVyKCksXG4gICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICB0aW1lcixcbiAgICAgICAgICAgICAgKCkgPT4gdGhpcy5mYWNldHMuaGVscGVyLmdldFVwZGF0ZWRQb3NlckZhY2V0KCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcGFyYW1Hb3Zlcm5hbmNlO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNyZWF0b3I6IHtcbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge0ludml0YXRpb259IHBvc2VySW52aXRhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbiAgICAgICAgcmVwbGFjZUVsZWN0b3JhdGUocG9zZXJJbnZpdGF0aW9uKSB7XG4gICAgICAgICAgY29uc3QgeyBjcmVhdG9yRmFjZXQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgLyoqIEB0eXBlIHtQcm9taXNlPFR5cGVkUGFyYW1NYW5hZ2VyPHsnRWxlY3RvcmF0ZSc6ICdpbnZpdGF0aW9uJ30+Pn0gKi9cblxuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gICAgICAgICAgY29uc3QgcGFyYW1NZ3IgPSBFKEUoY3JlYXRvckZhY2V0KS5nZXRQYXJhbU1nclJldHJpZXZlcigpKS5nZXQoe1xuICAgICAgICAgICAga2V5OiAnZ292ZXJuZWRQYXJhbXMnLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLyogVE9ETyB1c2UgdXBkYXRlRWxlY3RvcmF0ZSovXG4gICAgICAgICAgcmV0dXJuIEUocGFyYW1NZ3IpLnVwZGF0ZVBhcmFtcyh7XG4gICAgICAgICAgICBFbGVjdG9yYXRlOiBwb3Nlckludml0YXRpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKiBAdHlwZSB7Vm90ZU9uUGFyYW1DaGFuZ2VzfSAqL1xuICAgICAgICB2b3RlT25QYXJhbUNoYW5nZXModm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sIGRlYWRsaW5lLCBwYXJhbVNwZWMpIHtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgcmV0dXJuIGhlbHBlclxuICAgICAgICAgICAgLnByb3ZpZGVQYXJhbUdvdmVybmFuY2UoKVxuICAgICAgICAgICAgLnZvdGVPblBhcmFtQ2hhbmdlcyh2b3RlQ291bnRlckluc3RhbGxhdGlvbiwgZGVhZGxpbmUsIHBhcmFtU3BlYyk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKiBAdHlwZSB7Vm90ZU9uQXBpSW52b2NhdGlvbn0gKi9cbiAgICAgICAgdm90ZU9uQXBpSW52b2NhdGlvbihcbiAgICAgICAgICBhcGlNZXRob2ROYW1lLFxuICAgICAgICAgIG1ldGhvZEFyZ3MsXG4gICAgICAgICAgdm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sXG4gICAgICAgICAgZGVhZGxpbmUsXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICByZXR1cm4gRShoZWxwZXIucHJvdmlkZUFwaUdvdmVybmFuY2UoKSkudm90ZU9uQXBpSW52b2NhdGlvbihcbiAgICAgICAgICAgIGFwaU1ldGhvZE5hbWUsXG4gICAgICAgICAgICBtZXRob2RBcmdzLFxuICAgICAgICAgICAgdm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sXG4gICAgICAgICAgICBkZWFkbGluZSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQHR5cGUge1ZvdGVPbk9mZmVyRmlsdGVyfSAqL1xuICAgICAgICB2b3RlT25PZmZlckZpbHRlcih2b3RlQ291bnRlckluc3RhbGxhdGlvbiwgZGVhZGxpbmUsIHN0cmluZ3MpIHtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgcmV0dXJuIGhlbHBlclxuICAgICAgICAgICAgLnByb3ZpZGVGaWx0ZXJHb3Zlcm5hbmNlKClcbiAgICAgICAgICAgIC52b3RlT25GaWx0ZXIodm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sIGRlYWRsaW5lLCBzdHJpbmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Q3JlYXRvckZhY2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmxpbWl0ZWRDcmVhdG9yRmFjZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEFkbWluRmFjZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYWRtaW5GYWNldDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaW5zdGFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFB1YmxpY0ZhY2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnB1YmxpY0ZhY2V0O1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHB1YmxpYzoge1xuICAgICAgICBnZXRFbGVjdG9yYXRlKCkge1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICByZXR1cm4gaGVscGVyLmdldEVsZWN0b3JhdGVJbnN0YW5jZSgpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRHb3Zlcm5lZENvbnRyYWN0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmluc3RhbmNlO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQHBhcmFtIHtJbnN0YW5jZX0gY291bnRlciAqL1xuICAgICAgICBhc3luYyB2YWxpZGF0ZVZvdGVDb3VudGVyKGNvdW50ZXIpIHtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IFtcbiAgICAgICAgICAgIEUuZ2V0KGhlbHBlci5wcm92aWRlQXBpR292ZXJuYW5jZSgpKSxcbiAgICAgICAgICAgIGhlbHBlci5wcm92aWRlRmlsdGVyR292ZXJuYW5jZSgpLFxuICAgICAgICAgICAgaGVscGVyLnByb3ZpZGVQYXJhbUdvdmVybmFuY2UoKSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIGNvbnN0IGNoZWNrcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgdmFsaWRhdG9ycy5tYXAodmFsaWRhdGUgPT4gRSh2YWxpZGF0ZS5jcmVhdGVkUXVlc3Rpb24pKGNvdW50ZXIpKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY2hlY2tzLnNvbWUoQm9vbGVhbikgfHxcbiAgICAgICAgICAgIEZhaWxgVm90ZUNvdW50ZXIgd2FzIG5vdCBjcmVhdGVkIGJ5IHRoaXMgY29udHJhY3RHb3Zlcm5vcmA7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKiBAcGFyYW0ge0luc3RhbmNlfSByZWdQICovXG4gICAgICAgIHZhbGlkYXRlRWxlY3RvcmF0ZShyZWdQKSB7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIHJldHVybiBFLndoZW4ocmVnUCwgYXN5bmMgcmVnID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZWN0b3JhdGVJbnN0YW5jZSA9IGF3YWl0IGhlbHBlci5nZXRFbGVjdG9yYXRlSW5zdGFuY2UoKTtcbiAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgcmVnID09PSBlbGVjdG9yYXRlSW5zdGFuY2UsXG4gICAgICAgICAgICAgIFwiRWxlY3RvcmF0ZSBkb2Vzbid0IG1hdGNoIG15IEVsZWN0b3JhdGVcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKiBAcGFyYW0ge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZSAqL1xuICAgICAgICB2YWxpZGF0ZVRpbWVyKGNsb3NpbmdSdWxlKSB7XG4gICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgY2xvc2luZ1J1bGUudGltZXIgPT09IHBvd2Vycy50aW1lcixcbiAgICAgICAgICAgICdjbG9zaW5nIHJ1bGUgbXVzdCB1c2UgbXkgdGltZXInLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIG1ha2VDb250cmFjdEdvdmVybm9yS2l0O1xufTtcblxuLyoqIEB0eXBlZGVmIHtFUmV0dXJuPEVSZXR1cm48dHlwZW9mIHByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0Pj59IENvbnRyYWN0R292ZXJub3JLaXQgKi8kaM2PX29uY2UucHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQocHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQiOlsicHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA47HTKeExAADhMQAAMAAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEhlbHBlci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL3RpbWUiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qcyJdLCJleHBvcnRzIjpbIkdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkiLCJoYW5kbGVQYXJhbUdvdmVybmFuY2UiLCJwdWJsaWNNaXhpbkFQSSIsInZhbGlkYXRlRWxlY3RvcmF0ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRmFyLGdldE1ldGhvZE5hbWVzLG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQsb2JqZWN0TWFwLGlnbm9yZUNvbnRleHQscHJlcGFyZUV4byxNLEFtb3VudFNoYXBlLEJyYW5kU2hhcGUsUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsVGltZXN0YW1wUmVjb3JkU2hhcGUsRSxtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zLEdvdmVybm9yRmFjZXRTaGFwZSxDT05UUkFDVF9FTEVDVE9SQVRFOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0XCIsWyRozY9fYSA9PiAobWFrZVN0b3JlZFB1Ymxpc2hlcktpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImlnbm9yZUNvbnRleHRcIixbJGjNj19hID0+IChpZ25vcmVDb250ZXh0ID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9cIixbJGjNj19hID0+IChwcmVwYXJlRXhvID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudFNoYXBlXCIsWyRozY9fYSA9PiAoQW1vdW50U2hhcGUgPSAkaM2PX2EpXV0sW1wiQnJhbmRTaGFwZVwiLFskaM2PX2EgPT4gKEJyYW5kU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV0sW1wiVGltZXN0YW1wUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChUaW1lc3RhbXBSZWNvcmRTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanNcIiwgW1tcIm1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXNcIixbJGjNj19hID0+IChtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJHb3Zlcm5vckZhY2V0U2hhcGVcIixbJGjNj19hID0+IChHb3Zlcm5vckZhY2V0U2hhcGUgPSAkaM2PX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qc1wiLCBbW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiLFskaM2PX2EgPT4gKENPTlRSQUNUX0VMRUNUT1JBVEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZW1vdGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7RU1hcnNoYWxsZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzJztcbiAqIEBpbXBvcnQge0NvbnRyYWN0TWV0YSwgSW5zdGFsbGF0aW9uLCBJbnN0YW5jZSwgSW52aXRhdGlvbiwgWkNGfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtWb3RlQ291bnRlckNyZWF0b3JGYWNldCwgVm90ZUNvdW50ZXJQdWJsaWNGYWNldCwgUXVlc3Rpb25TcGVjLCBPdXRjb21lUmVjb3JkLCBBZGRRdWVzdGlvbiwgQWRkUXVlc3Rpb25SZXR1cm4sIEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZSwgR292ZXJuYW5jZVRlcm1zLCBHb3Zlcm5lZEFwaXMsIEdvdmVybmVkQ3JlYXRvckZhY2V0LCBHb3Zlcm5lZFB1YmxpY0ZhY2V0fSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvdmF0LWRhdGEnO1xuICogQGltcG9ydCB7VHlwZWRQYXJhbU1hbmFnZXJ9IGZyb20gJy4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzJztcbiAqIEBpbXBvcnQge1BhcmFtVHlwZXNNYXB9IGZyb20gJy4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzJztcbiAqIEBpbXBvcnQge0Z1bmN0aW9uc1BsdXNDb250ZXh0fSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtTdG9yZWRQdWJsaXNoZXJLaXR9IGZyb20gJ0BhZ29yaWMvbm90aWZpZXInO1xuICogQGltcG9ydCB7U3RvcmFnZU5vZGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICovXG5cbiAgICAgICBjb25zdCBHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZID0gJ2dvdmVybmFuY2UnOyRozY9fb25jZS5HT1ZFUk5BTkNFX1NUT1JBR0VfS0VZKEdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkpO1xuXG5jb25zdCBwdWJsaWNNaXhpbkFQSSA9IGhhcmRlbih7XG4gIGdldFN1YnNjcmlwdGlvbjogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnU3RvcmVkU3Vic2NyaXB0aW9uJykpLFxuICBnZXRHb3Zlcm5lZFBhcmFtczogTS5jYWxsKCkucmV0dXJucyhNLm9yKE0ucmVjb3JkKCksIE0ucHJvbWlzZSgpKSksXG4gIGdldEFtb3VudDogTS5jYWxsKCkucmV0dXJucyhBbW91bnRTaGFwZSksXG4gIGdldEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKEJyYW5kU2hhcGUpLFxuICBnZXRJbnN0YW5jZTogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnSW5zdGFuY2UnKSksXG4gIGdldEluc3RhbGxhdGlvbjogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpLFxuICBnZXRJbnZpdGF0aW9uQW1vdW50OiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0TmF0OiBNLmNhbGwoKS5yZXR1cm5zKE0uYmlnaW50KCkpLFxuICBnZXRSYXRpbzogTS5jYWxsKCkucmV0dXJucyhNLnJlY29yZCgpKSxcbiAgZ2V0U3RyaW5nOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuICBnZXRUaW1lc3RhbXA6IE0uY2FsbCgpLnJldHVybnMoVGltZXN0YW1wUmVjb3JkU2hhcGUpLFxuICBnZXRSZWxhdGl2ZVRpbWU6IE0uY2FsbCgpLnJldHVybnMoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpLFxuICBnZXRVbmtub3duOiBNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxufSk7XG5cbi8qKlxuICogVmVyaWZ5IHRoYXQgdGhlIGVsZWN0b3JhdGUgaXMgcmVwcmVzZW50ZWQgYnkgYSBsaXZlIGludml0YXRpb24uXG4gKlxuICogQHBhcmFtIHtaQ0Y8R292ZXJuYW5jZVRlcm1zPHt9PiAmIHt9Pn0gemNmXG4gKiBAcGFyYW0ge1R5cGVkUGFyYW1NYW5hZ2VyPGFueT59IHBhcmFtTWFuYWdlclxuICovJGjNj19vbmNlLnB1YmxpY01peGluQVBJKHB1YmxpY01peGluQVBJKTtcbiAgICAgICBjb25zdCB2YWxpZGF0ZUVsZWN0b3JhdGUgPSAoemNmLCBwYXJhbU1hbmFnZXIpID0+IHtcbiAgY29uc3QgaW52aXRhdGlvbiA9IHBhcmFtTWFuYWdlci5nZXRJbnRlcm5hbFBhcmFtVmFsdWUoQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG4gIHJldHVybiBFLndoZW4oXG4gICAgRSh6Y2YuZ2V0SW52aXRhdGlvbklzc3VlcigpKS5pc0xpdmUoaW52aXRhdGlvbiksXG4gICAgaXNMaXZlID0+IGlzTGl2ZSB8fCBGYWlsYEVsZWN0b3JhdGUgaW52aXRhdGlvbiBpcyBub3QgbGl2ZS5gLFxuICApO1xufTskaM2PX29uY2UudmFsaWRhdGVFbGVjdG9yYXRlKHZhbGlkYXRlRWxlY3RvcmF0ZSk7XG5oYXJkZW4odmFsaWRhdGVFbGVjdG9yYXRlKTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBgbWFrZVBhcmFtR292ZXJuYW5jZWAuXG4gKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGVzTWFwfSBUXG4gKiBAcGFyYW0ge1pDRjxHb3Zlcm5hbmNlVGVybXM8e30+ICYge30+fSB6Y2ZcbiAqIEBwYXJhbSB7VHlwZWRQYXJhbU1hbmFnZXI8VD59IHBhcmFtTWFuYWdlclxuICovXG5jb25zdCBmYWNldEhlbHBlcnMgPSAoemNmLCBwYXJhbU1hbmFnZXIpID0+IHtcbiAgLyogdmFsaWRhdGUgYXN5bmMgdG8gd2FpdCBmb3IgcGFyYW1zIHRvIGJlIGZpbmlzaGVkKi9cbiAgLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzQzKi9cbiAgdm9pZCB2YWxpZGF0ZUVsZWN0b3JhdGUoemNmLCBwYXJhbU1hbmFnZXIpO1xuXG4gIGNvbnN0IHR5cGVkQWNjZXNzb3JzID0ge1xuICAgIGdldEFtb3VudDogcGFyYW1NYW5hZ2VyLmdldEFtb3VudCxcbiAgICBnZXRCcmFuZDogcGFyYW1NYW5hZ2VyLmdldEJyYW5kLFxuICAgIGdldEluc3RhbmNlOiBwYXJhbU1hbmFnZXIuZ2V0SW5zdGFuY2UsXG4gICAgZ2V0SW5zdGFsbGF0aW9uOiBwYXJhbU1hbmFnZXIuZ2V0SW5zdGFsbGF0aW9uLFxuICAgIGdldEludml0YXRpb25BbW91bnQ6IHBhcmFtTWFuYWdlci5nZXRJbnZpdGF0aW9uQW1vdW50LFxuICAgIGdldE5hdDogcGFyYW1NYW5hZ2VyLmdldE5hdCxcbiAgICBnZXRSYXRpbzogcGFyYW1NYW5hZ2VyLmdldFJhdGlvLFxuICAgIGdldFN0cmluZzogcGFyYW1NYW5hZ2VyLmdldFN0cmluZyxcbiAgICBnZXRUaW1lc3RhbXA6IHBhcmFtTWFuYWdlci5nZXRUaW1lc3RhbXAsXG4gICAgZ2V0UmVsYXRpdmVUaW1lOiBwYXJhbU1hbmFnZXIuZ2V0UmVsYXRpdmVUaW1lLFxuICAgIGdldFVua25vd246IHBhcmFtTWFuYWdlci5nZXRVbmtub3duLFxuICB9O1xuXG4gIGNvbnN0IGNvbW1vblB1YmxpY01ldGhvZHMgPSB7XG4gICAgZ2V0U3Vic2NyaXB0aW9uOiAoKSA9PiBwYXJhbU1hbmFnZXIuZ2V0U3Vic2NyaXB0aW9uKCksXG4gICAgZ2V0R292ZXJuZWRQYXJhbXM6ICgpID0+IHBhcmFtTWFuYWdlci5nZXRQYXJhbXMoKSxcbiAgfTtcblxuICAvKipcbiAqIEFkZCByZXF1aXJlZCBtZXRob2RzIHRvIHB1YmxpY0ZhY2V0XG4gKlxuICogQHRlbXBsYXRlIHt7fX0gUEYgcHVibGljIGZhY2V0XG4gKiBAcGFyYW0ge1BGfSBvcmlnaW5hbFB1YmxpY0ZhY2V0XG4gKiBAcmV0dXJucyB7R292ZXJuZWRQdWJsaWNGYWNldDxQRj59XG4gKi9cbiAgY29uc3QgYXVnbWVudFB1YmxpY0ZhY2V0ID0gb3JpZ2luYWxQdWJsaWNGYWNldCA9PiB7XG4gICAgcmV0dXJuIEZhcigncHVibGljRmFjZXQnLCB7XG4gICAgICAuLi5vcmlnaW5hbFB1YmxpY0ZhY2V0LFxuICAgICAgLi4uY29tbW9uUHVibGljTWV0aG9kcyxcbiAgICAgIC4uLnR5cGVkQWNjZXNzb3JzLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICogQWRkIHJlcXVpcmVkIG1ldGhvZHMgdG8gcHVibGljRmFjZXQsIGZvciBhIHZpcnR1YWwvZHVyYWJsZSBjb250cmFjdFxuICpcbiAqIEBwYXJhbSB7T1BGfSBvcmlnaW5hbFB1YmxpY0ZhY2V0XG4gKiBAdGVtcGxhdGUge3t9fSBPUEZcbiAqL1xuICBjb25zdCBhdWdtZW50VmlydHVhbFB1YmxpY0ZhY2V0ID0gb3JpZ2luYWxQdWJsaWNGYWNldCA9PiB7XG4gICAgcmV0dXJuIEZhcigncHVibGljRmFjZXQnLCB7XG4gICAgICAuLi5vcmlnaW5hbFB1YmxpY0ZhY2V0LFxuICAgICAgLi4uY29tbW9uUHVibGljTWV0aG9kcyxcbiAgICAgIC4uLm9iamVjdE1hcCh0eXBlZEFjY2Vzc29ycywgaWdub3JlQ29udGV4dCksXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge3t9fSBDRlxuICogQHBhcmFtIHtDRn0gbGltaXRlZENyZWF0b3JGYWNldFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCAoLi4uYW55KSA9PiB1bmtub3duPn0gW2dvdmVybmVkQXBpc11cbiAqIEByZXR1cm5zIHtHb3Zlcm5lZENyZWF0b3JGYWNldDxDRj59XG4gKi9cbiAgY29uc3QgbWFrZUZhckdvdmVybm9yRmFjZXQgPSAobGltaXRlZENyZWF0b3JGYWNldCwgZ292ZXJuZWRBcGlzID0ge30pID0+IHtcbiAgICBjb25zdCBnb3Zlcm5vckZhY2V0ID0gRmFyKCdnb3Zlcm5vckZhY2V0Jywge1xuICAgICAgZ2V0UGFyYW1NZ3JSZXRyaWV2ZXI6ICgpID0+XG4gICAgICAgIEZhcigncGFyYW1SZXRyaWV2ZXInLCB7IGdldDogKCkgPT4gcGFyYW1NYW5hZ2VyIH0pLFxuICAgICAgZ2V0SW52aXRhdGlvbjogbmFtZSA9PiBwYXJhbU1hbmFnZXIuZ2V0SW50ZXJuYWxQYXJhbVZhbHVlKG5hbWUpLFxuICAgICAgZ2V0TGltaXRlZENyZWF0b3JGYWNldDogKCkgPT4gbGltaXRlZENyZWF0b3JGYWNldCxcbiAgICAgIC8qIFRoZSBjb250cmFjdCBwcm92aWRlcyBhIGZhY2V0IHdpdGggdGhlIEFQSXMgdGhhdCBjYW4gYmUgaW52b2tlZCBieSovXG4gICAgICAvKiBnb3Zlcm5hbmNlKi9cbiAgICAgIC8qKiBAdHlwZSB7KCkgPT4gR292ZXJuZWRBcGlzfSAqL1xuICAgICAgZ2V0R292ZXJuZWRBcGlzOiAoKSA9PiBGYXIoJ2dvdmVybmVkQVBJcycsIGdvdmVybmVkQXBpcyksXG4gICAgICAvKiBUaGUgZmFjZXQgcmV0dXJuZWQgYnkgZ2V0R292ZXJuZWRBcGlzIGlzIEZhciwgc28gd2UgY2FuJ3Qgc2VlIHdoYXQqL1xuICAgICAgLyogbWV0aG9kcyBpdCBoYXMuIFRoZXJlJ3Mgbm8gY2xlYW4gd2F5IHRvIGhhdmUgY29udHJhY3RzIHNwZWNpZnkgdGhlIEFQSXMqL1xuICAgICAgLyogd2l0aG91dCBhbHNvIHNlcGFyYXRlbHkgcHJvdmlkaW5nIHRoZWlyIG5hbWVzLiovXG4gICAgICBnZXRHb3Zlcm5lZEFwaU5hbWVzOiAoKSA9PiBPYmplY3Qua2V5cyhnb3Zlcm5lZEFwaXMpLFxuICAgICAgc2V0T2ZmZXJGaWx0ZXI6IHN0cmluZ3MgPT4gemNmLnNldE9mZmVyRmlsdGVyKHN0cmluZ3MpLFxuICAgIH0pO1xuXG4gICAgLyogZXhjbHVzaXZlbHkgZm9yIGNvbnRyYWN0R292ZXJub3IsIHdoaWNoIG9ubHkgcmV2ZWFscyBsaW1pdGVkQ3JlYXRvckZhY2V0Ki9cbiAgICByZXR1cm4gZ292ZXJub3JGYWNldDtcbiAgfTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGXG4gKiBAcGFyYW0ge0NGfSBvcmlnaW5hbENyZWF0b3JGYWNldFxuICogQHBhcmFtIHt7fX0gW2dvdmVybmVkQXBpc11cbiAqIEByZXR1cm5zIHtHb3Zlcm5lZENyZWF0b3JGYWNldDxDRj59XG4gKi9cbiAgY29uc3QgbWFrZUdvdmVybm9yRmFjZXQgPSAob3JpZ2luYWxDcmVhdG9yRmFjZXQsIGdvdmVybmVkQXBpcyA9IHt9KSA9PiB7XG4gICAgcmV0dXJuIG1ha2VGYXJHb3Zlcm5vckZhY2V0KG9yaWdpbmFsQ3JlYXRvckZhY2V0LCBnb3Zlcm5lZEFwaXMpO1xuICB9O1xuXG4gIC8qKlxuICogQWRkIHJlcXVpcmVkIG1ldGhvZHMgdG8gYSBjcmVhdG9yRmFjZXQgZm9yIGEgZHVyYWJsZSBjb250cmFjdC5cbiAqXG4gKiBAc2VlIHttYWtlRHVyYWJsZUdvdmVybm9yRmFjZXR9XG4gKlxuICogQHRlbXBsYXRlIHt7IFttZXRob2ROYW1lOiBzdHJpbmddOiAoY29udGV4dD86IHVua25vd24sIC4uLnJlc3Q6IHVua25vd25bXSkgPT4gdW5rbm93bn19IExDRlxuICogQHBhcmFtIHtMQ0Z9IGxpbWl0ZWRDcmVhdG9yRmFjZXRcbiAqL1xuICBjb25zdCBtYWtlVmlydHVhbEdvdmVybm9yRmFjZXQgPSBsaW1pdGVkQ3JlYXRvckZhY2V0ID0+IHtcbiAgICAvKiogQHR5cGUge0Z1bmN0aW9uc1BsdXNDb250ZXh0PHVua25vd24sIEdvdmVybmVkQ3JlYXRvckZhY2V0PHR5cGVvZiBsaW1pdGVkQ3JlYXRvckZhY2V0Pj59ICovXG4gICAgY29uc3QgZ292ZXJub3JGYWNldCA9IGhhcmRlbih7XG4gICAgICBnZXRQYXJhbU1nclJldHJpZXZlcjogKCkgPT5cbiAgICAgICAgRmFyKCdwYXJhbVJldHJpZXZlcicsIHsgZ2V0OiAoKSA9PiBwYXJhbU1hbmFnZXIgfSksXG4gICAgICBnZXRJbnZpdGF0aW9uOiAoX2NvbnRleHQsIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBuYW1lKSA9PlxuICAgICAgICBwYXJhbU1hbmFnZXIuZ2V0SW50ZXJuYWxQYXJhbVZhbHVlKG5hbWUpLFxuICAgICAgZ2V0TGltaXRlZENyZWF0b3JGYWNldDogKHsgZmFjZXRzIH0pID0+IGZhY2V0cy5saW1pdGVkQ3JlYXRvckZhY2V0LFxuICAgICAgLyogVGhlIGNvbnRyYWN0IHByb3ZpZGVzIGEgZmFjZXQgd2l0aCB0aGUgQVBJcyB0aGF0IGNhbiBiZSBpbnZva2VkIGJ5Ki9cbiAgICAgIC8qIGdvdmVybmFuY2UqL1xuICAgICAgZ2V0R292ZXJuZWRBcGlzOiAoeyBmYWNldHMgfSkgPT4gZmFjZXRzLmdvdmVybmVkQXBpcyxcbiAgICAgIC8qIFRoZSBmYWNldCByZXR1cm5lZCBieSBnZXRHb3Zlcm5lZEFwaXMgaXMgRmFyLCBzbyB3ZSBjYW4ndCBzZWUgd2hhdCovXG4gICAgICAvKiBtZXRob2RzIGl0IGhhcy4gVGhlcmUncyBubyBjbGVhbiB3YXkgdG8gaGF2ZSBjb250cmFjdHMgc3BlY2lmeSB0aGUgQVBJcyovXG4gICAgICAvKiB3aXRob3V0IGFsc28gc2VwYXJhdGVseSBwcm92aWRpbmcgdGhlaXIgbmFtZXMuKi9cbiAgICAgIGdldEdvdmVybmVkQXBpTmFtZXM6ICh7IGZhY2V0cyB9KSA9PlxuICAgICAgICBnZXRNZXRob2ROYW1lcyhmYWNldHMuZ292ZXJuZWRBcGlzIHx8IHt9KSxcbiAgICAgIHNldE9mZmVyRmlsdGVyOiAoX2NvbnRleHQsIHN0cmluZ3MpID0+IHpjZi5zZXRPZmZlckZpbHRlcihzdHJpbmdzKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGdvdmVybm9yRmFjZXQsIGxpbWl0ZWRDcmVhdG9yRmFjZXQgfTtcbiAgfTtcblxuICAvKipcbiAqIEFkZCByZXF1aXJlZCBtZXRob2RzIHRvIGEgY3JlYXRvckZhY2V0IGZvciBhIGR1cmFibGUgY29udHJhY3QuXG4gKlxuICogQHNlZSB7bWFrZVZpcnR1YWxHb3Zlcm5vckZhY2V0fVxuICpcbiAqIEB0ZW1wbGF0ZSBDRlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge0NGfSBsaW1pdGVkQ3JlYXRvckZhY2V0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsICguLi5hbnkpID0+IHVua25vd24+fSBbZ292ZXJuZWRBcGlzXVxuICovXG4gIGNvbnN0IG1ha2VEdXJhYmxlR292ZXJub3JGYWNldCA9IChcbiAgICBiYWdnYWdlLFxuICAgIGxpbWl0ZWRDcmVhdG9yRmFjZXQsXG4gICAgZ292ZXJuZWRBcGlzID0ge30sXG4gICkgPT4ge1xuICAgIGNvbnN0IGZhckdvdmVybmVkQXBpcyA9IEZhcignZ292ZXJuZWRBUElzJywgeyAuLi5nb3Zlcm5lZEFwaXMgfSk7XG4gICAgY29uc3QgZ292ZXJub3JGYWNldCA9IHByZXBhcmVFeG8oXG4gICAgICBiYWdnYWdlLFxuICAgICAgJ2dvdmVybm9yRmFjZXQnLFxuICAgICAgTS5pbnRlcmZhY2UoJ2dvdmVybm9yRmFjZXQnLCBHb3Zlcm5vckZhY2V0U2hhcGUpLFxuICAgICAge1xuICAgICAgICBnZXRQYXJhbU1nclJldHJpZXZlcjogKCkgPT5cbiAgICAgICAgICBGYXIoJ3BhcmFtUmV0cmlldmVyJywgeyBnZXQ6ICgpID0+IHBhcmFtTWFuYWdlciB9KSxcbiAgICAgICAgZ2V0SW52aXRhdGlvbjogbmFtZSA9PiBwYXJhbU1hbmFnZXIuZ2V0SW50ZXJuYWxQYXJhbVZhbHVlKG5hbWUpLFxuICAgICAgICBnZXRMaW1pdGVkQ3JlYXRvckZhY2V0OiAoKSA9PiBsaW1pdGVkQ3JlYXRvckZhY2V0LFxuICAgICAgICAvKiBUaGUgY29udHJhY3QgcHJvdmlkZXMgYSBmYWNldCB3aXRoIHRoZSBBUElzIHRoYXQgY2FuIGJlIGludm9rZWQgYnkqL1xuICAgICAgICAvKiBnb3Zlcm5hbmNlKi9cbiAgICAgICAgLyoqIEB0eXBlIHsoKSA9PiBHb3Zlcm5lZEFwaXN9ICovXG4gICAgICAgIGdldEdvdmVybmVkQXBpczogKCkgPT4gZmFyR292ZXJuZWRBcGlzLFxuICAgICAgICAvKiBUaGUgZmFjZXQgcmV0dXJuZWQgYnkgZ2V0R292ZXJuZWRBcGlzIGlzIEZhciwgc28gd2UgY2FuJ3Qgc2VlIHdoYXQqL1xuICAgICAgICAvKiBtZXRob2RzIGl0IGhhcy4gVGhlcmUncyBubyBjbGVhbiB3YXkgdG8gaGF2ZSBjb250cmFjdHMgc3BlY2lmeSB0aGUgQVBJcyovXG4gICAgICAgIC8qIHdpdGhvdXQgYWxzbyBzZXBhcmF0ZWx5IHByb3ZpZGluZyB0aGVpciBuYW1lcy4qL1xuICAgICAgICBnZXRHb3Zlcm5lZEFwaU5hbWVzOiAoKSA9PiBPYmplY3Qua2V5cyhnb3Zlcm5lZEFwaXMgfHwge30pLFxuICAgICAgICBzZXRPZmZlckZpbHRlcjogc3RyaW5ncyA9PiB6Y2Yuc2V0T2ZmZXJGaWx0ZXIoc3RyaW5ncyksXG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXR1cm4geyBnb3Zlcm5vckZhY2V0LCBsaW1pdGVkQ3JlYXRvckZhY2V0IH07XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgcHVibGljTWl4aW46IHtcbiAgICAgIC4uLmNvbW1vblB1YmxpY01ldGhvZHMsXG4gICAgICAuLi50eXBlZEFjY2Vzc29ycyxcbiAgICB9LFxuICAgIGF1Z21lbnRQdWJsaWNGYWNldCxcbiAgICBhdWdtZW50VmlydHVhbFB1YmxpY0ZhY2V0LFxuICAgIG1ha2VHb3Zlcm5vckZhY2V0LFxuXG4gICAgbWFrZUZhckdvdmVybm9yRmFjZXQsXG4gICAgbWFrZVZpcnR1YWxHb3Zlcm5vckZhY2V0LFxuICAgIG1ha2VEdXJhYmxlR292ZXJub3JGYWNldCxcblxuICAgIHBhcmFtczogcGFyYW1NYW5hZ2VyLnJlYWRvbmx5KCksXG4gIH0pO1xufTtcblxuLyoqXG4gKiBIZWxwZXIgZm9yIHRoZSA5MCUgb2YgY29udHJhY3RzIHRoYXQgd2lsbCBoYXZlIG9ubHkgYSBzaW5nbGUgc2V0IG9mXG4gKiBwYXJhbWV0ZXJzLiBVc2luZyB0aGlzIGZvciBtYW5hZ2VkIHBhcmFtZXRlcnMsIGEgY29udHJhY3Qgb25seSBoYXMgdG9cbiAqXG4gKiAtIERlZmluZSB0aGUgcGFyYW1ldGVyIHRlbXBsYXRlLCB3aGljaCBpbmNsdWRlcyBuYW1lLCB0eXBlIGFuZCB2YWx1ZVxuICogLSBBZGQgYW55IG1ldGhvZHMgbmVlZGVkIGluIHRoZSBwdWJsaWMgYW5kIGNyZWF0b3IgZmFjZXRzLlxuICpcbiAqIEl0J3MgYWxzbyBjcnVjaWFsIHRoYXQgdGhlIGdvdmVybmVkIGNvbnRyYWN0IG5vdCBpbnRlcmFjdCB3aXRoIHRoZSBwcm9kdWN0IG9mXG4gKiBtYWtlR292ZXJub3JGYWNldCgpLiBUaGUgd3JhcHBlZCBjcmVhdG9yRmFjZXQgaGFzIHRoZSBwb3dlciB0byBjaGFuZ2VcbiAqIHBhcmFtZXRlciB2YWx1ZXMsIGFuZCB0aGUgZ292ZXJuYW5jZSBndWFyYW50ZWVzIG9ubHkgaG9sZCBpZiB0aGV5J3JlIG5vdCB1c2VkXG4gKiBkaXJlY3RseSBieSB0aGUgZ292ZXJuZWQgY29udHJhY3QuXG4gKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGVzTWFwfSBNXG4gKiAgIE1hcCBvZiB0eXBlcyBvZiBjdXN0b20gZ292ZXJuZWQgdGVybXNcbiAqIEBwYXJhbSB7WkNGPEdvdmVybmFuY2VUZXJtczxNPj59IHpjZlxuICogQHBhcmFtIHtJbnZpdGF0aW9ufSBpbml0aWFsUG9zZXJJbnZpdGF0aW9uXG4gKiBAcGFyYW0ge019IHBhcmFtVHlwZXNNYXBcbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT59IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IFttYXJzaGFsbGVyXVxuICogQHBhcmFtIHtvYmplY3R9IFtvdmVycmlkZXNdXG4gKi9cbmNvbnN0IGhhbmRsZVBhcmFtR292ZXJuYW5jZSA9IChcbiAgemNmLFxuICBpbml0aWFsUG9zZXJJbnZpdGF0aW9uLFxuICBwYXJhbVR5cGVzTWFwLFxuICBzdG9yYWdlTm9kZSxcbiAgbWFyc2hhbGxlcixcbiAgb3ZlcnJpZGVzLFxuKSA9PiB7XG4gIC8qKiBAdHlwZSB7U3RvcmVkUHVibGlzaGVyS2l0PEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZT59ICovXG4gIGNvbnN0IHB1Ymxpc2hlcktpdCA9IG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQoXG4gICAgc3RvcmFnZU5vZGUsXG4gICAgbWFyc2hhbGxlcixcbiAgICBHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZLFxuICApO1xuICBjb25zdCBwYXJhbU1hbmFnZXIgPSBtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zKFxuICAgIHB1Ymxpc2hlcktpdCxcbiAgICB6Y2YsXG4gICAgeyBFbGVjdG9yYXRlOiBpbml0aWFsUG9zZXJJbnZpdGF0aW9uIH0sXG4gICAgcGFyYW1UeXBlc01hcCxcbiAgICBvdmVycmlkZXMsXG4gICk7XG5cbiAgcmV0dXJuIGZhY2V0SGVscGVycyh6Y2YsIHBhcmFtTWFuYWdlcik7XG59OyRozY9fb25jZS5oYW5kbGVQYXJhbUdvdmVybmFuY2UoaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlKTtcblxuaGFyZGVuKGhhbmRsZVBhcmFtR292ZXJuYW5jZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwdWJsaWNNaXhpbkFQSSI6WyJwdWJsaWNNaXhpbkFQSSJdLCJoYW5kbGVQYXJhbUdvdmVybmFuY2UiOlsiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIl0sIkdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkiOlsiR09WRVJOQU5DRV9TVE9SQUdFX0tFWSJdLCJ2YWxpZGF0ZUVsZWN0b3JhdGUiOlsidmFsaWRhdGVFbGVjdG9yYXRlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALlkfWprCQAAawkAACcAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9xdWVzdGlvbi5qcyIsIi4vY29udHJhY3RHb3Zlcm5vci5qcyIsIi4vY29udHJhY3RIZWxwZXIuanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzIiwiLi92YWxpZGF0b3JzLmpzIiwiLi9jb25zdGFudHMuanMiLCIuL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiRWxlY3Rpb25UeXBlIiwiRWxlY3Rpb25UeXBlIiwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIiwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIiwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIiwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIiwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiLCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciIsIm1ha2VQYXJhbU1hbmFnZXJTeW5jIiwibWFrZVBhcmFtTWFuYWdlclN5bmMiLCJwdWJsaWNNaXhpbkFQSSIsInB1YmxpY01peGluQVBJIiwidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIiwidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIixudWxsXSwicmVleHBvcnRzIjpbIi4vdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9xdWVzdGlvbi5qc1wiLCBbXV0sW1wiLi9jb250cmFjdEdvdmVybm9yLmpzXCIsIFtdXSxbXCIuL2NvbnRyYWN0SGVscGVyLmpzXCIsIFtdXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qc1wiLCBbXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzXCIsIFtdXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qc1wiLCBbXV0sW1wiLi92YWxpZGF0b3JzLmpzXCIsIFtdXSxbXCIuL2NvbnN0YW50cy5qc1wiLCBbXV0sW1wiLi90eXBlcy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vcXVlc3Rpb24uanMiOltbIkNob2ljZU1ldGhvZCIsIkNob2ljZU1ldGhvZCJdLFsiRWxlY3Rpb25UeXBlIiwiRWxlY3Rpb25UeXBlIl0sWyJRdW9ydW1SdWxlIiwiUXVvcnVtUnVsZSJdLFsiY29lcmNlUXVlc3Rpb25TcGVjIiwiY29lcmNlUXVlc3Rpb25TcGVjIl0sWyJwb3NpdGlvbkluY2x1ZGVkIiwicG9zaXRpb25JbmNsdWRlZCJdLFsiYnVpbGRRdWVzdGlvbiIsImJ1aWxkUXVlc3Rpb24iXV0sIi4vY29udHJhY3RHb3Zlcm5vci5qcyI6W1sidmFsaWRhdGVRdWVzdGlvbkRldGFpbHMiLCJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyJdLFsidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIiwidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIl1dLCIuL2NvbnRyYWN0SGVscGVyLmpzIjpbWyJoYW5kbGVQYXJhbUdvdmVybmFuY2UiLCJoYW5kbGVQYXJhbUdvdmVybmFuY2UiXSxbInB1YmxpY01peGluQVBJIiwicHVibGljTWl4aW5BUEkiXV0sIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIjpbWyJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtIiwiYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSJdLFsibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIiwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIl0sWyJzZXR1cFBhcmFtR292ZXJuYW5jZSIsInNldHVwUGFyYW1Hb3Zlcm5hbmNlIl0sWyJDT05UUkFDVF9FTEVDVE9SQVRFIiwiQ09OVFJBQ1RfRUxFQ1RPUkFURSJdXSwiLi9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzIjpbWyJhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyIsImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzIl0sWyJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciIsIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyIl1dLCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyI6W1sibWFrZVBhcmFtTWFuYWdlciIsIm1ha2VQYXJhbU1hbmFnZXIiXSxbIm1ha2VQYXJhbU1hbmFnZXJTeW5jIiwibWFrZVBhcmFtTWFuYWdlclN5bmMiXV0sIi4vdmFsaWRhdG9ycy5qcyI6W1siYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlIiwiYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlIl0sWyJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiLCJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiXV0sIi4vY29uc3RhbnRzLmpzIjpbWyJQYXJhbVR5cGVzIiwiUGFyYW1UeXBlcyJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAt5hiXQMRAAADEQAAKgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9xdWVzdGlvbi5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy96b2Uvc3JjL21ha2VIYW5kbGUuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJDaG9pY2VNZXRob2QiLCJFbGVjdGlvblR5cGUiLCJRdW9ydW1SdWxlIiwiYnVpbGRRdWVzdGlvbiIsImNvZXJjZVF1ZXN0aW9uU3BlYyIsInBvc2l0aW9uSW5jbHVkZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlRXhvLG11c3RNYXRjaCxrZXlFUSxNLG1ha2VIYW5kbGUsUXVlc3Rpb25JLFF1ZXN0aW9uU3BlY1NoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZUV4b1wiLFskaM2PX2EgPT4gKG1ha2VFeG8gPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvbWFrZUhhbmRsZS5qc1wiLCBbW1wibWFrZUhhbmRsZVwiLFskaM2PX2EgPT4gKG1ha2VIYW5kbGUgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlF1ZXN0aW9uSVwiLFskaM2PX2EgPT4gKFF1ZXN0aW9uSSA9ICRozY9fYSldXSxbXCJRdWVzdGlvblNwZWNTaGFwZVwiLFskaM2PX2EgPT4gKFF1ZXN0aW9uU3BlY1NoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtCdWlsZFF1ZXN0aW9uLCBQb3NpdGlvbkluY2x1ZGVkLCBRdWVzdGlvbiwgUXVlc3Rpb25TcGVjfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKiBUb3BpY3MgYmVpbmcgdm90ZWQgb24gYXJlICdRdWVzdGlvbnMnLiBCZWZvcmUgYSBRdWVzdGlvbiBpcyBrbm93biB0byBhKi9cbi8qIGVsZWN0b3JhdGUsIHRoZSBwYXJhbWV0ZXJzIGNhbiBiZSBkZXNjcmliZWQgd2l0aCBhIFF1ZXN0aW9uU3BlYy4gT25jZSB0aGUqL1xuLyogcXVlc3Rpb24gaGFzIGJlZW4gcHJlc2VudGVkIHRvIGFuIEVsZWN0b3JhdGUsIHRoZXJlIGlzIGEgUXVlc3Rpb25EZXRhaWxzKi9cbi8qIHJlY29yZCB0aGF0IGFsc28gaW5jbHVkZXMgdGhlIFZvdGVDb3VudGVyIHdoaWNoIHdpbGwgZGV0ZXJtaW5lIHRoZSBvdXRjb21lKi9cbi8qIGFuZCB0aGUgcXVlc3Rpb25IYW5kbGUgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGl0LiovXG5cbi8qKlxuICogXCJ1bnJhbmtlZFwiIGlzIG1vcmUgZm9ybWFsbHkga25vd24gYXMgXCJhcHByb3ZhbFwiIHZvdGluZywgYnV0IHRoaXMgaXMgaGFyZCBmb3JcbiAqIHBlb3BsZSB0byBpbnR1aXQgd2hlbiB0aGVyZSBhcmUgb25seSB0d28gYWx0ZXJuYXRpdmVzLlxuICovXG5jb25zdCBDaG9pY2VNZXRob2QgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBVTlJBTktFRDogJ3VucmFua2VkJyxcbiAgT1JERVI6ICdvcmRlcicsXG4gIFBMVVJBTElUWTogJ3BsdXJhbGl0eScsXG59KTskaM2PX29uY2UuQ2hvaWNlTWV0aG9kKENob2ljZU1ldGhvZCk7XG5cbmNvbnN0IEVsZWN0aW9uVHlwZSA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIC8qIEEgcGFyYW1ldGVyIGlzIG5hbWVkLCBhbmQgYSBuZXcgdmFsdWUgcHJvcG9zZWQqL1xuICBQQVJBTV9DSEFOR0U6ICdwYXJhbV9jaGFuZ2UnLFxuICAvKiBjaG9vc2Ugb25lIG9yIG11bHRpcGxlIHdpbm5lcnMsIGRlcGVuZGluZyBvbiBDaG9pY2VNZXRob2QqL1xuICBFTEVDVElPTjogJ2VsZWN0aW9uJyxcbiAgU1VSVkVZOiAnc3VydmV5JyxcbiAgLyogd2hldGhlciBvciBub3QgdG8gaW52b2tlIGFuIEFQSSBtZXRob2QqL1xuICBBUElfSU5WT0NBVElPTjogJ2FwaV9pbnZvY2F0aW9uJyxcbiAgT0ZGRVJfRklMVEVSOiAnb2ZmZXJfZmlsdGVyJyxcbn0pOyRozY9fb25jZS5FbGVjdGlvblR5cGUoRWxlY3Rpb25UeXBlKTtcblxuY29uc3QgUXVvcnVtUnVsZSA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIE1BSk9SSVRZOiAnbWFqb3JpdHknLFxuICBOT19RVU9SVU06ICdub19xdW9ydW0nLFxuICAvKiBUaGUgZWxlY3Rpb24gaXNuJ3QgdmFsaWQgdW5sZXNzIGFsbCB2b3RlcnMgdm90ZSovXG4gIEFMTDogJ2FsbCcsXG59KTtcblxuLyoqIEB0eXBlIHtQb3NpdGlvbkluY2x1ZGVkfSAqLyRozY9fb25jZS5RdW9ydW1SdWxlKFF1b3J1bVJ1bGUpO1xuY29uc3QgcG9zaXRpb25JbmNsdWRlZCA9IChwb3NpdGlvbnMsIHApID0+IHBvc2l0aW9ucy5zb21lKGUgPT4ga2V5RVEoZSwgcCkpO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtRdWVzdGlvblNwZWN9IGFsbGVnZWRRdWVzdGlvblNwZWNcbiAqIEByZXR1cm5zIHtRdWVzdGlvblNwZWN9XG4gKi8kaM2PX29uY2UucG9zaXRpb25JbmNsdWRlZChwb3NpdGlvbkluY2x1ZGVkKTtcbmNvbnN0IGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICh7XG4gIG1ldGhvZCxcbiAgaXNzdWUsXG4gIHBvc2l0aW9ucyxcbiAgZWxlY3Rpb25UeXBlLFxuICBtYXhDaG9pY2VzLFxuICBtYXhXaW5uZXJzLFxuICBjbG9zaW5nUnVsZSxcbiAgcXVvcnVtUnVsZSxcbiAgdGllT3V0Y29tZSxcbn0pID0+IHtcbiAgY29uc3QgcXVlc3Rpb24gPSBoYXJkZW4oe1xuICAgIG1ldGhvZCxcbiAgICBpc3N1ZSxcbiAgICBwb3NpdGlvbnMsXG4gICAgbWF4Q2hvaWNlczogTnVtYmVyKG1heENob2ljZXMpLFxuICAgIG1heFdpbm5lcnM6IE51bWJlcihtYXhXaW5uZXJzKSxcbiAgICBlbGVjdGlvblR5cGUsXG4gICAgY2xvc2luZ1J1bGUsXG4gICAgcXVvcnVtUnVsZSxcbiAgICB0aWVPdXRjb21lLFxuICB9KTtcblxuICBtdXN0TWF0Y2gocXVlc3Rpb24sIFF1ZXN0aW9uU3BlY1NoYXBlKTtcblxuICAvKiBYWFggSXQgd291bGQgYmUgbmljZSB0byBlbmZvcmNlIHRoaXMgdXNpbmcgcGFyYW1ldGVyaXplZCB0eXBlcywgYnV0IHRoYXQqL1xuICAvKiBzZWVtcyB0byBvbmx5IGVuZm9yY2UgdHlwZSBjb25zdHJhaW50cywgKGkuZS4gdGhlIHRpZU91dGNvbWUgd2lsbCBiZSB0aGUqL1xuICAvKiBzYW1lIHR5cGUgYXMgYW55IG9mIHRoZSBwb3NpdGlvbnMpIHVubGVzcyB5b3UgY2FuIHByb3ZpZGUgdGhlIGNvbmNyZXRlKi9cbiAgLyogdmFsdWUgYXQgcGF0dGVybiBjcmVhdGlvbiB0aW1lLiovXG4gIG11c3RNYXRjaChxdWVzdGlvbi50aWVPdXRjb21lLCBNLm9yKC4uLnF1ZXN0aW9uLnBvc2l0aW9ucykpO1xuXG4gIHJldHVybiBxdWVzdGlvbjtcbn07XG5cbi8qKiBAdHlwZSB7QnVpbGRRdWVzdGlvbn0gKi8kaM2PX29uY2UuY29lcmNlUXVlc3Rpb25TcGVjKGNvZXJjZVF1ZXN0aW9uU3BlYyk7XG5jb25zdCBidWlsZFF1ZXN0aW9uID0gKHF1ZXN0aW9uU3BlYywgY291bnRlckluc3RhbmNlKSA9PiB7XG4gIGNvbnN0IHF1ZXN0aW9uSGFuZGxlID0gbWFrZUhhbmRsZSgnUXVlc3Rpb24nKTtcblxuICAvKiogQHR5cGUge1F1ZXN0aW9ufSAqL1xuICByZXR1cm4gbWFrZUV4bygncXVlc3Rpb24gZGV0YWlscycsIFF1ZXN0aW9uSSwge1xuICAgIGdldFZvdGVDb3VudGVyKCkge1xuICAgICAgcmV0dXJuIGNvdW50ZXJJbnN0YW5jZTtcbiAgICB9LFxuICAgIGdldERldGFpbHMoKSB7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgLi4ucXVlc3Rpb25TcGVjLFxuICAgICAgICBxdWVzdGlvbkhhbmRsZSxcbiAgICAgICAgY291bnRlckluc3RhbmNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5idWlsZFF1ZXN0aW9uKGJ1aWxkUXVlc3Rpb24pO1xuXG5oYXJkZW4oYnVpbGRRdWVzdGlvbik7XG5oYXJkZW4oQ2hvaWNlTWV0aG9kKTtcbmhhcmRlbihFbGVjdGlvblR5cGUpO1xuaGFyZGVuKGNvZXJjZVF1ZXN0aW9uU3BlYyk7XG5oYXJkZW4ocG9zaXRpb25JbmNsdWRlZCk7XG5oYXJkZW4oUXVvcnVtUnVsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDaG9pY2VNZXRob2QiOlsiQ2hvaWNlTWV0aG9kIl0sIkVsZWN0aW9uVHlwZSI6WyJFbGVjdGlvblR5cGUiXSwiUXVvcnVtUnVsZSI6WyJRdW9ydW1SdWxlIl0sInBvc2l0aW9uSW5jbHVkZWQiOlsicG9zaXRpb25JbmNsdWRlZCJdLCJjb2VyY2VRdWVzdGlvblNwZWMiOlsiY29lcmNlUXVlc3Rpb25TcGVjIl0sImJ1aWxkUXVlc3Rpb24iOlsiYnVpbGRRdWVzdGlvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACbQMhtLEAAACxAAAAsAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdGltZSIsIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9ub3RpZmllciJdLCJleHBvcnRzIjpbIkFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSIsIkFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSIsIkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSIsIkJpbmFyeVZvdGVDb3VudGVyQWRtaW5JIiwiQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkiLCJCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kiLCJDaG9pY2VNZXRob2RTaGFwZSIsIkNsb3NpbmdSdWxlU2hhcGUiLCJFbGVjdGlvblR5cGVTaGFwZSIsIkVsZWN0b3JhdGVDcmVhdG9ySSIsIkVsZWN0b3JhdGVQdWJsaWNJIiwiR292ZXJub3JGYWNldFNoYXBlIiwiSW52aXRhdGlvblNoYXBlIiwiTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSIsIk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIiwiTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIiwiTm9TaW1wbGVQb3NpdGlvblNoYXBlIiwiT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlIiwiT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSIsIk9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlIiwiUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSIsIlBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlIiwiUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSIsIlBhcmFtQ2hhbmdlc1NwZWNTaGFwZSIsIlBhcmFtUGF0aFNoYXBlIiwiUG9zaXRpb25TaGFwZSIsIlF1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiUXVlc3Rpb25IYW5kbGVTaGFwZSIsIlF1ZXN0aW9uSSIsIlF1ZXN0aW9uU3BlY1NoYXBlIiwiUXVlc3Rpb25TdGF0c1NoYXBlIiwiUXVvcnVtUnVsZVNoYXBlIiwiU2ltcGxlSXNzdWVTaGFwZSIsIlNpbXBsZVBvc2l0aW9uc1NoYXBlIiwiU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSIsIlZvdGVDb3VudGVyQWRtaW5JIiwiVm90ZUNvdW50ZXJDbG9zZUkiLCJWb3RlQ291bnRlclB1YmxpY0kiLCJWb3RlckhhbmRsZSIsIlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIiwiWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIiwiWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSIsIlllc1NpbXBsZVBvc2l0aW9uU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNLFRpbWVzdGFtcFNoYXBlLEluc3RhbmNlSGFuZGxlU2hhcGUsVGltZXJTaGFwZSxtYWtlSGFuZGxlU2hhcGUsU3Vic2NyaWJlclNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlRpbWVzdGFtcFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiSW5zdGFuY2VIYW5kbGVTaGFwZVwiLFskaM2PX2EgPT4gKEluc3RhbmNlSGFuZGxlU2hhcGUgPSAkaM2PX2EpXV0sW1wiVGltZXJTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVyU2hhcGUgPSAkaM2PX2EpXV0sW1wibWFrZUhhbmRsZVNoYXBlXCIsWyRozY9fYSA9PiAobWFrZUhhbmRsZVNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsWyRozY9fYSA9PiAoU3Vic2NyaWJlclNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4gICAgICAgY29uc3QgQ2hvaWNlTWV0aG9kU2hhcGUgPSBNLm9yKCd1bnJhbmtlZCcsICdvcmRlcicsICdwbHVyYWxpdHknKTskaM2PX29uY2UuQ2hvaWNlTWV0aG9kU2hhcGUoQ2hvaWNlTWV0aG9kU2hhcGUpO1xuICAgICAgIGNvbnN0IFF1b3J1bVJ1bGVTaGFwZSA9IE0ub3IoJ21ham9yaXR5JywgJ25vX3F1b3J1bScsICdhbGwnKTskaM2PX29uY2UuUXVvcnVtUnVsZVNoYXBlKFF1b3J1bVJ1bGVTaGFwZSk7XG4gICAgICAgY29uc3QgRWxlY3Rpb25UeXBlU2hhcGUgPSBNLm9yKFxuICAncGFyYW1fY2hhbmdlJyxcbiAgJ2VsZWN0aW9uJyxcbiAgJ3N1cnZleScsXG4gICdhcGlfaW52b2NhdGlvbicsXG4gICdvZmZlcl9maWx0ZXInLFxuKTskaM2PX29uY2UuRWxlY3Rpb25UeXBlU2hhcGUoRWxlY3Rpb25UeXBlU2hhcGUpO1xuXG4gICAgICAgY29uc3QgQ2xvc2luZ1J1bGVTaGFwZSA9IHtcbiAgdGltZXI6IE0uZXJlZihUaW1lclNoYXBlKSxcbiAgZGVhZGxpbmU6IFRpbWVzdGFtcFNoYXBlLFxufTskaM2PX29uY2UuQ2xvc2luZ1J1bGVTaGFwZShDbG9zaW5nUnVsZVNoYXBlKTtcbmhhcmRlbihDbG9zaW5nUnVsZVNoYXBlKTtcblxuLyogYWxsIHRoZSBzdHJpbmdzIHRoYXQgd2lsbCBiZSBpbiB0aGUgZmlsdGVyIGFmdGVyIHBhc3NpbmcqL1xuICAgICAgIGNvbnN0IFllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSA9IHtcbiAgc3RyaW5nczogTS5hcnJheU9mKE0uc3RyaW5nKCkpLFxufTskaM2PX29uY2UuWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKFllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IE5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlID0geyBkb250VXBkYXRlOiBNLmFycmF5T2YoTS5zdHJpbmcoKSkgfTskaM2PX29uY2UuTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUoTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKE5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IE9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUgPSBbXG4gIFllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbiAgTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUsXG5dOyRozY9fb25jZS5PZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlKE9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUpO1xuaGFyZGVuKE9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUpO1xuXG4gICAgICAgY29uc3QgT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlID0geyBzdHJpbmdzOiBNLmFycmF5T2YoTS5zdHJpbmcoKSkgfTskaM2PX29uY2UuT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlKE9mZmVyRmlsdGVySXNzdWVTaGFwZSk7XG5oYXJkZW4oT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IE9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUgPSB7XG4gIG1ldGhvZDogQ2hvaWNlTWV0aG9kU2hhcGUsXG4gIGlzc3VlOiBPZmZlckZpbHRlcklzc3VlU2hhcGUsXG4gIHBvc2l0aW9uczogT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSxcbiAgZWxlY3Rpb25UeXBlOiAnb2ZmZXJfZmlsdGVyJyxcbiAgbWF4Q2hvaWNlczogMSxcbiAgbWF4V2lubmVyczogMSxcbiAgY2xvc2luZ1J1bGU6IENsb3NpbmdSdWxlU2hhcGUsXG4gIHF1b3J1bVJ1bGU6IFF1b3J1bVJ1bGVTaGFwZSxcbiAgdGllT3V0Y29tZTogTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUsXG59OyRozY9fb25jZS5PZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlKE9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUpO1xuaGFyZGVuKE9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4gICAgICAgY29uc3QgT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSA9IHtcbiAgLi4uT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSxcbiAgcXVlc3Rpb25IYW5kbGU6IG1ha2VIYW5kbGVTaGFwZSgnUXVlc3Rpb24nKSxcbiAgY291bnRlckluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxufTskaM2PX29uY2UuT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZShPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcbmhhcmRlbihPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuLyoga2V5cyBhcmUgcGFyYW1ldGVyIG5hbWVzLCB2YWx1ZXMgYXJlIHByb3Bvc2VkIHZhbHVlcyovXG4gICAgICAgY29uc3QgUGFyYW1DaGFuZ2VzU3BlY1NoYXBlID0gTS5yZWNvcmRPZihNLnN0cmluZygpLCBNLmFueSgpKTskaM2PX29uY2UuUGFyYW1DaGFuZ2VzU3BlY1NoYXBlKFBhcmFtQ2hhbmdlc1NwZWNTaGFwZSk7XG4gICAgICAgY29uc3QgWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSA9IFBhcmFtQ2hhbmdlc1NwZWNTaGFwZTskaM2PX29uY2UuWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZShZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKTtcbiAgICAgICBjb25zdCBOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUgPSB7IG5vQ2hhbmdlOiBNLmFycmF5T2YoTS5zdHJpbmcoKSkgfTskaM2PX29uY2UuTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IFBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlID0gW1xuICBZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlLFxuICBOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUsXG5dOyRozY9fb25jZS5QYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZShQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSk7XG5oYXJkZW4oUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUGFyYW1QYXRoU2hhcGUgPSB7IGtleTogTS5hbnkoKSB9OyRozY9fb25jZS5QYXJhbVBhdGhTaGFwZShQYXJhbVBhdGhTaGFwZSk7XG5oYXJkZW4oUGFyYW1QYXRoU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSA9IHtcbiAgc3BlYzoge1xuICAgIHBhcmFtUGF0aDogUGFyYW1QYXRoU2hhcGUsXG4gICAgY2hhbmdlczogUGFyYW1DaGFuZ2VzU3BlY1NoYXBlLFxuICB9LFxuICBjb250cmFjdDogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbn07JGjNj19vbmNlLlBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUoUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSk7XG5oYXJkZW4oUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSk7XG5cbiAgICAgICBjb25zdCBQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSA9IHtcbiAgbWV0aG9kOiAndW5yYW5rZWQnLFxuICBpc3N1ZTogUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSxcbiAgcG9zaXRpb25zOiBQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSxcbiAgZWxlY3Rpb25UeXBlOiAncGFyYW1fY2hhbmdlJyxcbiAgbWF4Q2hvaWNlczogMSxcbiAgbWF4V2lubmVyczogMSxcbiAgY2xvc2luZ1J1bGU6IENsb3NpbmdSdWxlU2hhcGUsXG4gIHF1b3J1bVJ1bGU6ICdtYWpvcml0eScsXG4gIHRpZU91dGNvbWU6IE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSxcbn07JGjNj19vbmNlLlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlKTtcbmhhcmRlbihQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSA9IHtcbiAgLi4uUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUsXG4gIHF1ZXN0aW9uSGFuZGxlOiBtYWtlSGFuZGxlU2hhcGUoJ1F1ZXN0aW9uJyksXG4gIGNvdW50ZXJJbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbn07JGjNj19vbmNlLlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcbmhhcmRlbihQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cbmNvbnN0IEFwaUludm9jYXRpb25TcGVjU2hhcGUgPSB7XG4gIGFwaU1ldGhvZE5hbWU6IE0uc3RyaW5nKCksXG4gIG1ldGhvZEFyZ3M6IE0uYXJyYXlPZihNLmFueSgpKSxcbn07XG5oYXJkZW4oQXBpSW52b2NhdGlvblNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSA9IEFwaUludm9jYXRpb25TcGVjU2hhcGU7JGjNj19vbmNlLlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKFllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKTtcbiAgICAgICBjb25zdCBOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlID0geyBkb250SW52b2tlOiBNLnN0cmluZygpIH07JGjNj19vbmNlLk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUoTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUgPSBbXG4gIFllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlLFxuICBOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlLFxuXTskaM2PX29uY2UuQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlKEFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSk7XG5oYXJkZW4oQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IEFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSA9IHtcbiAgbWV0aG9kOiAndW5yYW5rZWQnLFxuICBpc3N1ZTogQXBpSW52b2NhdGlvblNwZWNTaGFwZSxcbiAgcG9zaXRpb25zOiBBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUsXG4gIGVsZWN0aW9uVHlwZTogJ2FwaV9pbnZvY2F0aW9uJyxcbiAgbWF4Q2hvaWNlczogMSxcbiAgbWF4V2lubmVyczogMSxcbiAgY2xvc2luZ1J1bGU6IENsb3NpbmdSdWxlU2hhcGUsXG4gIHF1b3J1bVJ1bGU6IFF1b3J1bVJ1bGVTaGFwZSxcbiAgdGllT3V0Y29tZTogTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbn07JGjNj19vbmNlLkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZShBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUpO1xuaGFyZGVuKEFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSB7XG4gIC4uLkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSxcbiAgcXVlc3Rpb25IYW5kbGU6IG1ha2VIYW5kbGVTaGFwZSgnUXVlc3Rpb24nKSxcbiAgY291bnRlckluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxufTskaM2PX29uY2UuQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlKEFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5oYXJkZW4oQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuY29uc3QgU2ltcGxlU3BlY1NoYXBlID0geyB0ZXh0OiBNLnN0cmluZygpIH07XG5oYXJkZW4oU2ltcGxlU3BlY1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFllc1NpbXBsZVBvc2l0aW9uU2hhcGUgPSB7IHRleHQ6IE0uc3RyaW5nKCkgfTskaM2PX29uY2UuWWVzU2ltcGxlUG9zaXRpb25TaGFwZShZZXNTaW1wbGVQb3NpdGlvblNoYXBlKTtcbmhhcmRlbihZZXNTaW1wbGVQb3NpdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IE5vU2ltcGxlUG9zaXRpb25TaGFwZSA9IHsgdGV4dDogTS5zdHJpbmcoKSB9OyRozY9fb25jZS5Ob1NpbXBsZVBvc2l0aW9uU2hhcGUoTm9TaW1wbGVQb3NpdGlvblNoYXBlKTtcbmhhcmRlbihOb1NpbXBsZVBvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgU2ltcGxlUG9zaXRpb25zU2hhcGUgPSBbXG4gIFllc1NpbXBsZVBvc2l0aW9uU2hhcGUsXG4gIE5vU2ltcGxlUG9zaXRpb25TaGFwZSxcbl07JGjNj19vbmNlLlNpbXBsZVBvc2l0aW9uc1NoYXBlKFNpbXBsZVBvc2l0aW9uc1NoYXBlKTtcbmhhcmRlbihTaW1wbGVQb3NpdGlvbnNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBTaW1wbGVJc3N1ZVNoYXBlID0gU2ltcGxlU3BlY1NoYXBlOyRozY9fb25jZS5TaW1wbGVJc3N1ZVNoYXBlKFNpbXBsZUlzc3VlU2hhcGUpO1xuaGFyZGVuKFNpbXBsZUlzc3VlU2hhcGUpO1xuXG4gICAgICAgY29uc3QgU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUgPSB7XG4gIG1ldGhvZDogQ2hvaWNlTWV0aG9kU2hhcGUsXG4gIGlzc3VlOiBTaW1wbGVJc3N1ZVNoYXBlLFxuICBwb3NpdGlvbnM6IE0uYXJyYXlPZih7IHRleHQ6IE0uc3RyaW5nKCkgfSksXG4gIGVsZWN0aW9uVHlwZTogTS5vcignZWxlY3Rpb24nLCAnc3VydmV5JyksXG4gIG1heENob2ljZXM6IE0uZ3RlKDEpLFxuICBtYXhXaW5uZXJzOiBNLmd0ZSgxKSxcbiAgY2xvc2luZ1J1bGU6IENsb3NpbmdSdWxlU2hhcGUsXG4gIHF1b3J1bVJ1bGU6IFF1b3J1bVJ1bGVTaGFwZSxcbiAgdGllT3V0Y29tZTogTm9TaW1wbGVQb3NpdGlvblNoYXBlLFxufTskaM2PX29uY2UuU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUoU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUpO1xuaGFyZGVuKFNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlID0ge1xuICAuLi5TaW1wbGVRdWVzdGlvblNwZWNTaGFwZSxcbiAgcXVlc3Rpb25IYW5kbGU6IG1ha2VIYW5kbGVTaGFwZSgnUXVlc3Rpb24nKSxcbiAgY291bnRlckluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxufTskaM2PX29uY2UuU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUoU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuaGFyZGVuKFNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFF1ZXN0aW9uU3BlY1NoYXBlID0gTS5vcihcbiAgQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlLFxuICBPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlLFxuICBQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSxcbiAgU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUsXG4pOyRozY9fb25jZS5RdWVzdGlvblNwZWNTaGFwZShRdWVzdGlvblNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBQb3NpdGlvblNoYXBlID0gTS5vcihcbiAgWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUsXG4gIE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUsXG4gIFllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbiAgTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUsXG4gIFllc1NpbXBsZVBvc2l0aW9uU2hhcGUsXG4gIE5vU2ltcGxlUG9zaXRpb25TaGFwZSxcbiAgWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSxcbiAgTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlLFxuKTskaM2PX29uY2UuUG9zaXRpb25TaGFwZShQb3NpdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IFF1ZXN0aW9uSGFuZGxlU2hhcGUgPSBtYWtlSGFuZGxlU2hhcGUoJ3F1ZXN0aW9uJyk7XG5cbi8qIFRPRE8oaGliYmVydCk6IGFkZCBkZXRhaWxzOyBtb3ZlIHRvIGEgbW9yZSBhcHByb3ByaWF0ZSBsb2NhdGlvbiovJGjNj19vbmNlLlF1ZXN0aW9uSGFuZGxlU2hhcGUoUXVlc3Rpb25IYW5kbGVTaGFwZSk7XG4gICAgICAgY29uc3QgSW52aXRhdGlvblNoYXBlID0gTS5yZW1vdGFibGUoJ0ludml0YXRpb24nKTtcblxuLyogWFhYIEkgd2FudCB0byBhZGQgcXVlc3Rpb25IYW5kbGUgYW5kIGNvdW50ZXJJbnN0YW5jZSB0byovXG4vKiBQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZS4gSSBkb24ndCBzZWUgYW55IGFsdGVybmF0aXZlIHRvIGFkZGluZyB0aGUqL1xuLyogbWV0aG9kcyB0byBlYWNoIG1lbWJlciBzZXBhcmF0ZWx5Ki8kaM2PX29uY2UuSW52aXRhdGlvblNoYXBlKEludml0YXRpb25TaGFwZSk7XG4gICAgICAgY29uc3QgUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSBNLm9yKFxuICBQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSxcbiAgQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlLFxuICBPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlLFxuICBTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSxcbik7JGjNj19vbmNlLlF1ZXN0aW9uRGV0YWlsc1NoYXBlKFF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IEVsZWN0b3JhdGVQdWJsaWNJID0gTS5pbnRlcmZhY2UoJ0NvbW1pdHRlZSBQdWJsaWNGYWNldCcsIHtcbiAgZ2V0UXVlc3Rpb25TdWJzY3JpYmVyOiBNLmNhbGwoKS5yZXR1cm5zKFN1YnNjcmliZXJTaGFwZSksXG4gIGdldE9wZW5RdWVzdGlvbnM6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXROYW1lOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuICBnZXRJbnN0YW5jZTogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbiAgZ2V0UXVlc3Rpb246IE0uY2FsbChRdWVzdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbn0pOyRozY9fb25jZS5FbGVjdG9yYXRlUHVibGljSShFbGVjdG9yYXRlUHVibGljSSk7XG5jb25zdCBFbGVjdG9yYXRlUHVibGljU2hhcGUgPSBNLnJlbW90YWJsZSgnRWxlY3RvcmF0ZVB1YmxpYycpO1xuXG4gICAgICAgY29uc3QgRWxlY3RvcmF0ZUNyZWF0b3JJID0gTS5pbnRlcmZhY2UoJ0NvbW1pdHRlZSBBZG1pbkZhY2V0Jywge1xuICBnZXRQb3Nlckludml0YXRpb246IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBhZGRRdWVzdGlvbjogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUsIFF1ZXN0aW9uU3BlY1NoYXBlKS5yZXR1cm5zKFxuICAgIE0ucHJvbWlzZSgpLFxuICApLFxuICBnZXRWb3Rlckludml0YXRpb25zOiBNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihNLnByb21pc2UoKSkpLFxuICBnZXRRdWVzdGlvblN1YnNjcmliZXI6IE0uY2FsbCgpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbiAgZ2V0UHVibGljRmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoRWxlY3RvcmF0ZVB1YmxpY1NoYXBlKSxcbn0pOyRozY9fb25jZS5FbGVjdG9yYXRlQ3JlYXRvckkoRWxlY3RvcmF0ZUNyZWF0b3JJKTtcblxuICAgICAgIGNvbnN0IFF1ZXN0aW9uU3RhdHNTaGFwZSA9IHtcbiAgc3BvaWxlZDogTS5uYXQoKSxcbiAgdm90ZXM6IE0ubmF0KCksXG4gIHJlc3VsdHM6IE0uYXJyYXlPZih7IHBvc2l0aW9uOiBQb3NpdGlvblNoYXBlLCB0b3RhbDogTS5uYXQoKSB9KSxcbn07JGjNj19vbmNlLlF1ZXN0aW9uU3RhdHNTaGFwZShRdWVzdGlvblN0YXRzU2hhcGUpO1xuaGFyZGVuKFF1ZXN0aW9uU3RhdHNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBRdWVzdGlvbkkgPSBNLmludGVyZmFjZSgnUXVlc3Rpb24nLCB7XG4gIGdldFZvdGVDb3VudGVyOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpLFxuICBnZXREZXRhaWxzOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uRGV0YWlsc1NoYXBlKSxcbn0pOyRozY9fb25jZS5RdWVzdGlvbkkoUXVlc3Rpb25JKTtcbmNvbnN0IFF1ZXN0aW9uU2hhcGUgPSBNLnJlbW90YWJsZSgnUXVlc3Rpb24nKTtcblxuICAgICAgIGNvbnN0IEJpbmFyeVZvdGVDb3VudGVyUHVibGljSSA9IE0uaW50ZXJmYWNlKFxuICAnQmluYXJ5Vm90ZUNvdW50ZXIgUHVibGljRmFjZXQnLFxuICB7XG4gICAgZ2V0UXVlc3Rpb246IE0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25TaGFwZSksXG4gICAgaXNPcGVuOiBNLmNhbGwoKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgICBnZXRPdXRjb21lOiBNLmNhbGwoKS5yZXR1cm5zKE0uZXJlZihNLnByb21pc2UoKSkpLFxuICAgIGdldFN0YXRzOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICBnZXREZXRhaWxzOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uRGV0YWlsc1NoYXBlKSxcbiAgICBnZXRJbnN0YW5jZTogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbiAgfSxcbik7JGjNj19vbmNlLkJpbmFyeVZvdGVDb3VudGVyUHVibGljSShCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kpO1xuXG4gICAgICAgY29uc3QgVm90ZXJIYW5kbGUgPSBNLnJlbW90YWJsZSgpOyRozY9fb25jZS5Wb3RlckhhbmRsZShWb3RlckhhbmRsZSk7XG4gICAgICAgY29uc3QgQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkgPSBNLmludGVyZmFjZShcbiAgJ0JpbmFyeVZvdGVDb3VudGVyIEFkbWluRmFjZXQnLFxuICB7XG4gICAgc3VibWl0Vm90ZTogTS5jYWxsKFZvdGVySGFuZGxlLCBNLmFycmF5T2YoUG9zaXRpb25TaGFwZSkpXG4gICAgICAub3B0aW9uYWwoTS5uYXQoKSlcbiAgICAgIC5yZXR1cm5zKHsgY2hvc2VuOiBQb3NpdGlvblNoYXBlLCBzaGFyZXM6IE0ubmF0KCkgfSksXG4gIH0sXG4pOyRozY9fb25jZS5CaW5hcnlWb3RlQ291bnRlckFkbWluSShCaW5hcnlWb3RlQ291bnRlckFkbWluSSk7XG5cbiAgICAgICBjb25zdCBCaW5hcnlWb3RlQ291bnRlckNsb3NlSSA9IE0uaW50ZXJmYWNlKFxuICAnQmluYXJ5Vm90ZUNvdW50ZXIgQ2xvc2VGYWNldCcsXG4gIHtcbiAgICBjbG9zZVZvdGluZzogTS5jYWxsKCkucmV0dXJucygpLFxuICB9LFxuKTskaM2PX29uY2UuQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkoQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkpO1xuXG4gICAgICAgY29uc3QgVm90ZUNvdW50ZXJQdWJsaWNJID0gTS5pbnRlcmZhY2UoJ1ZvdGVDb3VudGVyIFB1YmxpY0ZhY2V0Jywge1xuICBnZXRRdWVzdGlvbjogTS5jYWxsKCkucmV0dXJucyhRdWVzdGlvblNoYXBlKSxcbiAgaXNPcGVuOiBNLmNhbGwoKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgZ2V0T3V0Y29tZTogTS5jYWxsKCkucmV0dXJucyhNLmVyZWYoTS5wcm9taXNlKCkpKSxcbiAgZ2V0U3RhdHM6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXREZXRhaWxzOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uRGV0YWlsc1NoYXBlKSxcbiAgZ2V0SW5zdGFuY2U6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSksXG59KTskaM2PX29uY2UuVm90ZUNvdW50ZXJQdWJsaWNJKFZvdGVDb3VudGVyUHVibGljSSk7XG5cbiAgICAgICBjb25zdCBWb3RlQ291bnRlckFkbWluSSA9IE0uaW50ZXJmYWNlKCdWb3RlQ291bnRlciBBZG1pbkZhY2V0Jywge1xuICBzdWJtaXRWb3RlOiBNLmNhbGwoVm90ZXJIYW5kbGUsIE0uYXJyYXlPZihQb3NpdGlvblNoYXBlKSlcbiAgICAub3B0aW9uYWwoTS5uYXQoKSlcbiAgICAucmV0dXJucyh7IGNob3NlbjogTS5hcnJheU9mKFBvc2l0aW9uU2hhcGUpLCBzaGFyZXM6IE0ubmF0KCkgfSksXG59KTskaM2PX29uY2UuVm90ZUNvdW50ZXJBZG1pbkkoVm90ZUNvdW50ZXJBZG1pbkkpO1xuXG4gICAgICAgY29uc3QgVm90ZUNvdW50ZXJDbG9zZUkgPSBNLmludGVyZmFjZSgnVm90ZUNvdW50ZXIgQ2xvc2VGYWNldCcsIHtcbiAgY2xvc2VWb3Rpbmc6IE0uY2FsbCgpLnJldHVybnMoKSxcbn0pOyRozY9fb25jZS5Wb3RlQ291bnRlckNsb3NlSShWb3RlQ291bnRlckNsb3NlSSk7XG5cbiAgICAgICBjb25zdCBHb3Zlcm5vckZhY2V0U2hhcGUgPSB7XG4gIGdldFBhcmFtTWdyUmV0cmlldmVyOiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdwYXJhbVJldHJpZXZlcicpKSxcbiAgZ2V0SW52aXRhdGlvbjogTS5jYWxsKCkucmV0dXJucyhJbnZpdGF0aW9uU2hhcGUpLFxuICBnZXRMaW1pdGVkQ3JlYXRvckZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCkpLFxuICBnZXRHb3Zlcm5lZEFwaXM6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ2dvdmVybmVkQVBJcycpKSxcbiAgZ2V0R292ZXJuZWRBcGlOYW1lczogTS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuICBzZXRPZmZlckZpbHRlcjogTS5jYWxsKE0uYXJyYXlPZihNLnN0cmluZygpKSkucmV0dXJucyhNLnByb21pc2UoKSksXG59OyRozY9fb25jZS5Hb3Zlcm5vckZhY2V0U2hhcGUoR292ZXJub3JGYWNldFNoYXBlKTtcbmhhcmRlbihHb3Zlcm5vckZhY2V0U2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ2hvaWNlTWV0aG9kU2hhcGUiOlsiQ2hvaWNlTWV0aG9kU2hhcGUiXSwiUXVvcnVtUnVsZVNoYXBlIjpbIlF1b3J1bVJ1bGVTaGFwZSJdLCJFbGVjdGlvblR5cGVTaGFwZSI6WyJFbGVjdGlvblR5cGVTaGFwZSJdLCJDbG9zaW5nUnVsZVNoYXBlIjpbIkNsb3NpbmdSdWxlU2hhcGUiXSwiWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIjpbIlllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSJdLCJOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSI6WyJOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSJdLCJPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlIjpbIk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUiXSwiT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlIjpbIk9mZmVyRmlsdGVySXNzdWVTaGFwZSJdLCJPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlIjpbIk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUiXSwiT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSI6WyJPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlBhcmFtQ2hhbmdlc1NwZWNTaGFwZSI6WyJQYXJhbUNoYW5nZXNTcGVjU2hhcGUiXSwiWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSI6WyJZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIl0sIk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSI6WyJOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiXSwiUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUiOlsiUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUiXSwiUGFyYW1QYXRoU2hhcGUiOlsiUGFyYW1QYXRoU2hhcGUiXSwiUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSI6WyJQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlIl0sIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlIl0sIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIjpbIlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIl0sIk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiOlsiTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSJdLCJBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUiOlsiQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlIl0sIkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSI6WyJBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUiXSwiQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIkFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSJdLCJZZXNTaW1wbGVQb3NpdGlvblNoYXBlIjpbIlllc1NpbXBsZVBvc2l0aW9uU2hhcGUiXSwiTm9TaW1wbGVQb3NpdGlvblNoYXBlIjpbIk5vU2ltcGxlUG9zaXRpb25TaGFwZSJdLCJTaW1wbGVQb3NpdGlvbnNTaGFwZSI6WyJTaW1wbGVQb3NpdGlvbnNTaGFwZSJdLCJTaW1wbGVJc3N1ZVNoYXBlIjpbIlNpbXBsZUlzc3VlU2hhcGUiXSwiU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUiOlsiU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUiXSwiU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiUXVlc3Rpb25TcGVjU2hhcGUiOlsiUXVlc3Rpb25TcGVjU2hhcGUiXSwiUG9zaXRpb25TaGFwZSI6WyJQb3NpdGlvblNoYXBlIl0sIlF1ZXN0aW9uSGFuZGxlU2hhcGUiOlsiUXVlc3Rpb25IYW5kbGVTaGFwZSJdLCJJbnZpdGF0aW9uU2hhcGUiOlsiSW52aXRhdGlvblNoYXBlIl0sIlF1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIlF1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIkVsZWN0b3JhdGVQdWJsaWNJIjpbIkVsZWN0b3JhdGVQdWJsaWNJIl0sIkVsZWN0b3JhdGVDcmVhdG9ySSI6WyJFbGVjdG9yYXRlQ3JlYXRvckkiXSwiUXVlc3Rpb25TdGF0c1NoYXBlIjpbIlF1ZXN0aW9uU3RhdHNTaGFwZSJdLCJRdWVzdGlvbkkiOlsiUXVlc3Rpb25JIl0sIkJpbmFyeVZvdGVDb3VudGVyUHVibGljSSI6WyJCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kiXSwiVm90ZXJIYW5kbGUiOlsiVm90ZXJIYW5kbGUiXSwiQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkiOlsiQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkiXSwiQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkiOlsiQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkiXSwiVm90ZUNvdW50ZXJQdWJsaWNJIjpbIlZvdGVDb3VudGVyUHVibGljSSJdLCJWb3RlQ291bnRlckFkbWluSSI6WyJWb3RlQ291bnRlckFkbWluSSJdLCJWb3RlQ291bnRlckNsb3NlSSI6WyJWb3RlQ291bnRlckNsb3NlSSJdLCJHb3Zlcm5vckZhY2V0U2hhcGUiOlsiR292ZXJub3JGYWNldFNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGkxGJ0kMAABJDAAALAAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy92YWxpZGF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiLCJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoqXG4gKiBAaW1wb3J0IHtWb3RlQ291bnRlckNyZWF0b3JGYWNldCwgVm90ZUNvdW50ZXJQdWJsaWNGYWNldCwgUXVlc3Rpb25TcGVjLCBPdXRjb21lUmVjb3JkLCBBZGRRdWVzdGlvbiwgQWRkUXVlc3Rpb25SZXR1cm4sIEFzc2VydENvbnRyYWN0R292ZXJuYW5jZSwgQXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSBnb3Zlcm5lZCBjb250cmFjdCB3YXMgc3RhcnRlZCBieSB0aGUgZ292ZXJub3IuIFRocm93cyBpZlxuICogZWl0aGVyIGRpcmVjdGlvbiBjYW4ndCBiZSBlc3RhYmxpc2hlZC4gSWYgdGhlIGNhbGwgc3VjY2VlZHMsIHRoZW4gdGhlXG4gKiBnb3Zlcm5vciBnb3QgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgZ292ZXJuZWQgY29udHJhY3QncyBjcmVhdG9yRmFjZXQsIGFuZFxuICogY2FuIGJlIHRydXN0ZWQgdG8gbWFuYWdlIGl0cyBwYXJhbWV0ZXJzLlxuICpcbiAqIEB0eXBlIHtBc3NlcnRDb250cmFjdEdvdmVybmFuY2V9XG4gKi9cbmNvbnN0IGFzc2VydENvbnRyYWN0R292ZXJuYW5jZSA9IGFzeW5jIChcbiAgem9lLFxuICBhbGxlZ2VkR292ZXJuZWQsXG4gIGFsbGVnZWRHb3Zlcm5vcixcbiAgY29udHJhY3RHb3Zlcm5vckluc3RhbGxhdGlvbixcbikgPT4ge1xuICBjb25zdCBhbGxlZ2VkR292ZXJub3JQRiA9IEUoem9lKS5nZXRQdWJsaWNGYWNldChhbGxlZ2VkR292ZXJub3IpO1xuICBjb25zdCByZWFsR292ZXJuZWRQID0gRShhbGxlZ2VkR292ZXJub3JQRikuZ2V0R292ZXJuZWRDb250cmFjdCgpO1xuICBjb25zdCBhbGxlZ2VkR292ZXJuZWRUZXJtc1AgPSBFKHpvZSkuZ2V0VGVybXMoYWxsZWdlZEdvdmVybmVkKTtcblxuICBjb25zdCBbeyBlbGVjdGlvbk1hbmFnZXI6IHJlYWxHb3Zlcm5vckluc3RhbmNlIH0sIHJlYWxHb3Zlcm5lZEluc3RhbmNlXSA9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW2FsbGVnZWRHb3Zlcm5lZFRlcm1zUCwgcmVhbEdvdmVybmVkUF0pO1xuXG4gIGFzc2VydChcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCB0eXBlcyovXG4gICAgYWxsZWdlZEdvdmVybm9yID09PSByZWFsR292ZXJub3JJbnN0YW5jZSxcbiAgICAnVGhlIGFsbGVnZWQgZ292ZXJub3IgZGlkIG5vdCBtYXRjaCB0aGUgZ292ZXJub3IgcmV0cmlldmVkIGZyb20gdGhlIGdvdmVybmVkIGNvbnRyYWN0JyxcbiAgKTtcblxuICBhc3NlcnQoXG4gICAgYWxsZWdlZEdvdmVybmVkID09PSByZWFsR292ZXJuZWRJbnN0YW5jZSxcbiAgICAnVGhlIGFsbGVnZWQgZ292ZXJuZWQgZGlkIG5vdCBtYXRjaCB0aGUgZ292ZXJuZWQgY29udHJhY3QgcmV0cmlldmVkIGZyb20gdGhlIGdvdmVybm9yJyxcbiAgKTtcblxuICBjb25zdCBnb3Zlcm5vckluc3RhbGxhdGlvbkZyb21Hb3Zlcm5lZCA9XG4gICAgYXdhaXQgRSh6b2UpLmdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlKHJlYWxHb3Zlcm5vckluc3RhbmNlKTtcblxuICBhc3NlcnQoXG4gICAgZ292ZXJub3JJbnN0YWxsYXRpb25Gcm9tR292ZXJuZWQgPT09IGNvbnRyYWN0R292ZXJub3JJbnN0YWxsYXRpb24sXG4gICAgJ1RoZSBnb3Zlcm5lZCBjb250cmFjdCBpcyBub3QgZ292ZXJuZWQgYnkgYW4gaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVkIGluc3RhbGxhdGlvbi4nLFxuICApO1xuXG4gIHJldHVybiB7IGdvdmVybm9yOiByZWFsR292ZXJub3JJbnN0YW5jZSwgZ292ZXJuZWQ6IHJlYWxHb3Zlcm5lZEluc3RhbmNlIH07XG59O1xuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSBnb3Zlcm5vciByZWZlcnMgdG8gdGhlIGluZGljYXRlZCBlbGVjdG9yYXRlLlxuICpcbiAqIEB0eXBlIHtBc3NlcnRDb250cmFjdEVsZWN0b3JhdGV9XG4gKi8kaM2PX29uY2UuYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlKGFzc2VydENvbnRyYWN0R292ZXJuYW5jZSk7XG5jb25zdCBhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUgPSBhc3luYyAoXG4gIHpvZSxcbiAgYWxsZWdlZEdvdmVybm9yLFxuICBhbGxlZ2VkRWxlY3RvcmF0ZSxcbikgPT4ge1xuICBjb25zdCBhbGxlZ2VkR292ZXJub3JQRiA9IEUoem9lKS5nZXRQdWJsaWNGYWNldChhbGxlZ2VkR292ZXJub3IpO1xuICBjb25zdCBlbGVjdG9yYXRlID0gYXdhaXQgRShhbGxlZ2VkR292ZXJub3JQRikuZ2V0RWxlY3RvcmF0ZSgpO1xuICBlbGVjdG9yYXRlID09PSBhbGxlZ2VkRWxlY3RvcmF0ZSB8fFxuICAgIEZhaWxgVGhlIGFsbGVnZWRFbGVjdG9yYXRlIGRpZG4ndCBtYXRjaCB0aGUgYWN0dWFsICR7cShlbGVjdG9yYXRlKX1gO1xuXG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlKGFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSk7XG5cbmhhcmRlbihhc3NlcnRDb250cmFjdEdvdmVybmFuY2UpO1xuaGFyZGVuKGFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiOlsiYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlIl0sImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSI6WyJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAhuXBkK0WAACtFgAAOgAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvcmVzZXJ2ZS9hc3NldFJlc2VydmUuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9nb3Zlcm5hbmNlIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsIi4vYXNzZXRSZXNlcnZlS2l0LmpzIl0sImV4cG9ydHMiOlsibWV0YSIsInN0YXJ0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlLG1ha2VUcmFjZXIsd3JhcFJlbW90ZU1hcnNoYWxsZXIscHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzLHByb3ZpZGVBbGwscHJlcGFyZUFzc2V0UmVzZXJ2ZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvZ292ZXJuYW5jZVwiLCBbW1wiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlXCIsWyRozY9fYSA9PiAoaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qc1wiLCBbW1wid3JhcFJlbW90ZU1hcnNoYWxsZXJcIixbJGjNj19hID0+ICh3cmFwUmVtb3RlTWFyc2hhbGxlciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcInByZXBhcmVSZWNvcmRlcktpdE1ha2Vyc1wiLFskaM2PX2EgPT4gKHByZXBhcmVSZWNvcmRlcktpdE1ha2VycyA9ICRozY9fYSldXSxbXCJwcm92aWRlQWxsXCIsWyRozY9fYSA9PiAocHJvdmlkZUFsbCA9ICRozY9fYSldXV1dLFtcIi4vYXNzZXRSZXNlcnZlS2l0LmpzXCIsIFtbXCJwcmVwYXJlQXNzZXRSZXNlcnZlS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUFzc2V0UmVzZXJ2ZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3ZhdC1kYXRhJ1xuICogQGltcG9ydCB7RVJldHVybn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0NvbnRyYWN0T2Z9IGZyb20gJ0BhZ29yaWMvem9lL3NyYy96b2VTZXJ2aWNlL3V0aWxzLmpzJztcbiAqIEBpbXBvcnQge0FsbG9jYXRpb24sIENvbnRyYWN0TWV0YSwgRmVlTWludEFjY2VzcywgSW52aXRhdGlvbiwgWkNGfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtHb3Zlcm5hbmNlVGVybXN9IGZyb20gJ0BhZ29yaWMvZ292ZXJuYW5jZS9zcmMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7R292ZXJuZWRDcmVhdG9yRmFjZXR9IGZyb20gJ0BhZ29yaWMvZ292ZXJuYW5jZS9zcmMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7R292ZXJuZWRQdWJsaWNGYWNldH0gZnJvbSAnQGFnb3JpYy9nb3Zlcm5hbmNlL3NyYy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtBbW91bnR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtJc3N1ZXJ9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtNYXJzaGFsbGVyLCBTdG9yYWdlTm9kZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyc7XG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdBUicsIHRydWUpO1xuXG4vKiogQHR5cGUge0NvbnRyYWN0TWV0YTx0eXBlb2Ygc3RhcnQ+fSAqL1xuICAgICAgIGNvbnN0IG1ldGEgPSB7XG4gIHVwZ3JhZGFiaWxpdHk6ICdjYW5VcGdyYWRlJyxcbn07JGjNj19vbmNlLm1ldGEobWV0YSk7XG5oYXJkZW4obWV0YSk7XG5cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqICAgaW5jcmVhc2VMaXF1aWRhdGlvblNob3J0ZmFsbDogKGluY3JlYXNlOiBBbW91bnQpID0+IHZvaWQ7XG4gKiAgIHJlZHVjZUxpcXVpZGF0aW9uU2hvcnRmYWxsOiAocmVkdWN0aW9uOiBBbW91bnQpID0+IHZvaWQ7XG4gKiB9fSBTaG9ydGZhbGxSZXBvcnRpbmdGYWNldFxuICovXG5cbi8qKlxuICogQXNzZXQgUmVzZXJ2ZSBob2xkcyBvbnRvIGFzc2V0cyBmb3IgdGhlIEludGVyIFByb3RvY29sLCBhbmQgY2FuIGRpc3BlbnNlIGl0XG4gKiBmb3IgdmFyaW91cyBwdXJwb3NlcyB1bmRlciBnb3Zlcm5hbmNlIGNvbnRyb2wuXG4gKlxuICogVGhpcyBjb250cmFjdCBoYXMgdGhlIGFiaWxpdHkgdG8gbWludCBGZWUgdG9rZW5zLCBncmFudGVkIHRocm91Z2ggaXRzIHByaXZhdGVcbiAqIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0ge1pDRjxcbiAqICAgR292ZXJuYW5jZVRlcm1zPHt9PiAmIHtcbiAqICAgICBnb3Zlcm5lZEFwaXM6IFsnYnVybkZlZXNUb1JlZHVjZVNob3J0ZmFsbCddO1xuICogICB9XG4gKiA+fSB6Y2ZcbiAqIEBwYXJhbSB7e1xuICogICBmZWVNaW50QWNjZXNzOiBGZWVNaW50QWNjZXNzO1xuICogICBpbml0aWFsUG9zZXJJbnZpdGF0aW9uOiBJbnZpdGF0aW9uO1xuICogICBtYXJzaGFsbGVyOiBFUmVtb3RlPE1hcnNoYWxsZXI+O1xuICogICBzdG9yYWdlTm9kZTogRVJlbW90ZTxTdG9yYWdlTm9kZT47XG4gKiB9fSBwcml2YXRlQXJnc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKi9cbiAgICAgICBjb25zdCBzdGFydCA9IGFzeW5jICh6Y2YsIHByaXZhdGVBcmdzLCBiYWdnYWdlKSA9PiB7XG4gIHRyYWNlKCdwcmVwYXJlJywgT2JqZWN0LmtleXMocHJpdmF0ZUFyZ3MpLCBbLi4uYmFnZ2FnZS5rZXlzKCldKTtcbiAgLyogVGhpcyBjb250cmFjdCBtaXhlcyB0d28gc3R5bGVzIG9mIGFjY2VzcyB0byBkdXJhYmxlIHN0YXRlLiBkdXJhYmxlU3RvcmVzKi9cbiAgLyogYXJlIGRlY2xhcmVkIGF0IHRoZSB0b3AgbGV2ZWwgYW5kIHJlZmVyZW5jZWQgbGV4aWNhbGx5LiBsb2NhbCBzdGF0ZSBpcyovXG4gIC8qIGFjY2Vzc2VkIHZpYSB0aGUgYHN0YXRlYCBvYmplY3QuIFRoZSBsYXR0ZXIgbWVhbnMgdXBkYXRlcyBhcmUgbWFkZSBkaXJlY3RseSovXG4gIC8qIHRvIHN0YXRlIGFuZCBkb24ndCByZXF1aXJlIHJlZmVyZW5jZSB0byBiYWdnYWdlLiovXG5cbiAgY29uc3QgeyBtYXJzaGFsbGVyOiByZW1vdGVNYXJzaGFsbGVyIH0gPSBwcml2YXRlQXJncztcbiAgY29uc3QgY2FjaGluZ01hcnNoYWxsZXIgPSB3cmFwUmVtb3RlTWFyc2hhbGxlcihyZW1vdGVNYXJzaGFsbGVyKTtcblxuICBjb25zdCB7IG1ha2VSZWNvcmRlcktpdCB9ID0gcHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKFxuICAgIGJhZ2dhZ2UsXG4gICAgY2FjaGluZ01hcnNoYWxsZXIsXG4gICk7XG5cbiAgY29uc3Qgc3RvcmFnZU5vZGUgPSBhd2FpdCBwcml2YXRlQXJncy5zdG9yYWdlTm9kZTtcblxuICB0cmFjZSgnYXdhaXRpbmcgZmVlTWludCcpO1xuICBjb25zdCB7IGZlZU1pbnQgfSA9IGF3YWl0IHByb3ZpZGVBbGwoYmFnZ2FnZSwge1xuICAgIGZlZU1pbnQ6ICgpID0+IHpjZi5yZWdpc3RlckZlZU1pbnQoJ0ZlZScsIHByaXZhdGVBcmdzLmZlZU1pbnRBY2Nlc3MpLFxuICB9KTtcblxuICBjb25zdCBtYWtlQXNzZXRSZXNlcnZlS2l0ID0gYXdhaXQgcHJlcGFyZUFzc2V0UmVzZXJ2ZUtpdChiYWdnYWdlLCB7XG4gICAgZmVlTWludCxcbiAgICBtYWtlUmVjb3JkZXJLaXQsXG4gICAgc3RvcmFnZU5vZGUsXG4gICAgemNmLFxuICB9KTtcblxuICBjb25zdCB7IGFzc2V0UmVzZXJ2ZUtpdCB9ID0gYXdhaXQgcHJvdmlkZUFsbChiYWdnYWdlLCB7XG4gICAgYXNzZXRSZXNlcnZlS2l0OiBtYWtlQXNzZXRSZXNlcnZlS2l0LFxuICB9KTtcblxuICB0cmFjZSgnYXdhaXRpbmcgaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlJyk7XG4gIGNvbnN0IHsgbWFrZUR1cmFibGVHb3Zlcm5vckZhY2V0IH0gPSBhd2FpdCBoYW5kbGVQYXJhbUdvdmVybmFuY2UoXG4gICAgemNmLFxuICAgIHByaXZhdGVBcmdzLmluaXRpYWxQb3Nlckludml0YXRpb24sXG4gICAge30sXG4gICAgcHJpdmF0ZUFyZ3Muc3RvcmFnZU5vZGUsXG4gICAgY2FjaGluZ01hcnNoYWxsZXIsXG4gICk7XG5cbiAgY29uc3QgeyBnb3Zlcm5vckZhY2V0IH0gPSBtYWtlRHVyYWJsZUdvdmVybm9yRmFjZXQoXG4gICAgYmFnZ2FnZSxcbiAgICBhc3NldFJlc2VydmVLaXQubWFjaGluZSxcbiAgICAvKiByZWNvbnN0cnVjdCBmYWNldCBzbyB0aGF0IHRoZSBrZXlzIGFyZSBlbnVtZXJhYmxlIGFuZCB0aGF0IHRoZSBjbGllbnQgY2FuJ3QgZGVwZW5kIG9uIG9iamVjdCBpZGVudGl0eSovXG4gICAge1xuICAgICAgYnVybkZlZXNUb1JlZHVjZVNob3J0ZmFsbDogcmVkdWN0aW9uID0+XG4gICAgICAgIGFzc2V0UmVzZXJ2ZUtpdC5nb3Zlcm5lZEFwaXMuYnVybkZlZXNUb1JlZHVjZVNob3J0ZmFsbChyZWR1Y3Rpb24pLFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAvKiogQHR5cGUge0dvdmVybmVkQ3JlYXRvckZhY2V0PHR5cGVvZiBhc3NldFJlc2VydmVLaXQubWFjaGluZT59ICovXG4gICAgY3JlYXRvckZhY2V0OiBnb3Zlcm5vckZhY2V0LFxuICAgIC8qKiBAdHlwZSB7R292ZXJuZWRQdWJsaWNGYWNldDx0eXBlb2YgYXNzZXRSZXNlcnZlS2l0LnB1YmxpYz59ICovXG4gICAgLyogY2FzdCBkdWUgdG8gbWlzc2luZyBnb3Zlcm5hbmNlIG1peGlucyovXG4gICAgLyogWFhYIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNTIwMCovXG4gICAgcHVibGljRmFjZXQ6IC8qKiBAdHlwZSB7YW55fSAqLyAoYXNzZXRSZXNlcnZlS2l0LnB1YmxpYyksXG4gIH07XG59OyRozY9fb25jZS5zdGFydChzdGFydCk7XG5oYXJkZW4oc3RhcnQpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNob3J0ZmFsbFJlcG9ydGVyXG4gKiBAcHJvcGVydHkgeyhzaG9ydGZhbGw6IEFtb3VudCkgPT4gdm9pZH0gaW5jcmVhc2VMaXF1aWRhdGlvblNob3J0ZmFsbFxuICogQHByb3BlcnR5IHsoc2hvcnRmYWxsOiBBbW91bnQpID0+IHZvaWR9IHJlZHVjZUxpcXVpZGF0aW9uU2hvcnRmYWxsXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBc3NldFJlc2VydmVMaW1pdGVkQ3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkgeyhpc3N1ZXI6IElzc3Vlciwga3dkOiBzdHJpbmcpID0+IHZvaWR9IGFkZElzc3VlclxuICogQHByb3BlcnR5IHsoKSA9PiBBbGxvY2F0aW9ufSBnZXRBbGxvY2F0aW9uc1xuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb248U2hvcnRmYWxsUmVwb3J0ZXI+Pn0gbWFrZVNob3J0ZmFsbFJlcG9ydGluZ0ludml0YXRpb25cbiAqL1xuXG4vKiogQHR5cGVkZWYge0VSZXR1cm48dHlwZW9mIHN0YXJ0PlsncHVibGljRmFjZXQnXX0gQXNzZXRSZXNlcnZlUHVibGljRmFjZXQgKi9cbi8qKlxuICogQHR5cGVkZWYge0VSZXR1cm48dHlwZW9mIHN0YXJ0PlsnY3JlYXRvckZhY2V0J119IEFzc2V0UmVzZXJ2ZUNyZWF0b3JGYWNldFxuICogICB0aGUgY3JlYXRvciBmYWNldCBmb3IgdGhlIGdvdmVybm9yXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtDb250cmFjdE9mPHR5cGVvZiBzdGFydD59IFJlc2VydmVDb250cmFjdCAqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWV0YSI6WyJtZXRhIl0sInN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADaxkeSZPQAAmT0AAD0AAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3Jlc2VydmUvYXNzZXRSZXNlcnZlS2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qcyIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzIiwiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvYmFzZS16b25lL3pvbmUtaGVscGVycy5qcyIsIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZUFzc2V0UmVzZXJ2ZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxBbW91bnRNYXRoLEFtb3VudFNoYXBlLElzc3VlclNoYXBlLG1ha2VUcmFjZXIsTSxtYWtlU2NhbGFyQmlnTWFwU3RvcmUscHJlcGFyZUV4b0NsYXNzS2l0LGF0b21pY1RyYW5zZmVyLG1ha2VSZWNvcmRlclRvcGljLFRvcGljc1JlY29yZFNoYXBlLEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxPZmZlckhhbmRsZXJJLEUsVW5ndWFyZGVkSGVscGVySSxwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQsbWFrZUR1cmFibGVab25lOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV0sW1wiQW1vdW50U2hhcGVcIixbJGjNj19hID0+IChBbW91bnRTaGFwZSA9ICRozY9fYSldXSxbXCJJc3N1ZXJTaGFwZVwiLFskaM2PX2EgPT4gKElzc3VlclNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qc1wiLCBbW1wiYXRvbWljVHJhbnNmZXJcIixbJGjNj19hID0+IChhdG9taWNUcmFuc2ZlciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzXCIsIFtbXCJtYWtlUmVjb3JkZXJUb3BpY1wiLFskaM2PX2EgPT4gKG1ha2VSZWNvcmRlclRvcGljID0gJGjNj19hKV1dLFtcIlRvcGljc1JlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoVG9waWNzUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlID0gJGjNj19hKV1dLFtcIk9mZmVySGFuZGxlcklcIixbJGjNj19hID0+IChPZmZlckhhbmRsZXJJID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJVbmd1YXJkZWRIZWxwZXJJXCIsWyRozY9fYSA9PiAoVW5ndWFyZGVkSGVscGVySSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lL3pvbmUtaGVscGVycy5qc1wiLCBbW1wicHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b25lL2R1cmFibGUuanNcIiwgW1tcIm1ha2VEdXJhYmxlWm9uZVwiLFskaM2PX2EgPT4gKG1ha2VEdXJhYmxlWm9uZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0cmFjZSA9IG1ha2VUcmFjZXIoJ1Jlc2VydmVLaXQnLCB0cnVlKTtcblxuLyoqXG4gKiBAaW1wb3J0IHtFUmV0dXJufSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7VHlwZWRQYXR0ZXJuLCBFUmVtb3RlLCBSZW1vdGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7U3RvcmFnZU5vZGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICogQGltcG9ydCB7QW1vdW50LCBCcmFuZCwgSXNzdWVyfSBmcm9tICdAYWdvcmljL2VydHAnO1xuICogQGltcG9ydCB7TWFwU3RvcmUsIFNldFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqIEBpbXBvcnQge0Ftb3VudEtleXdvcmRSZWNvcmR9IGZyb20gJ0BhZ29yaWMvem9lL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1pDRiwgT2ZmZXJIYW5kbGVyLCBLZXl3b3JkLCBaQ0ZNaW50LCBaQ0ZTZWF0fSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3ZhdC1kYXRhJztcbiAqIEBpbXBvcnQge01ha2VSZWNvcmRlcktpdH0gZnJvbSAnQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyc7XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNZXRyaWNzTm90aWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb25zXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IHNob3J0ZmFsbEJhbGFuY2Ugc2hvcnRmYWxsIGZyb20gbGlxdWlkYXRpb24gdGhhdFxuICogICBoYXMgbm90IHlldCBiZWVuIGNvbXBlbnNhdGVkLlxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSB0b3RhbEZlZU1pbnRlZCB0b3RhbCBGZWUgdG9rZW5zIG1pbnRlZCB0byBkYXRlXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IHRvdGFsRmVlQnVybmVkIHRvdGFsIEZlZSB0b2tlbnMgYnVybmVkIHRvIGRhdGVcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHt7XG4gKiAgIGZlZU1pbnQ6IFpDRk1pbnQ8J25hdCc+O1xuICogICBtYWtlUmVjb3JkZXJLaXQ6IE1ha2VSZWNvcmRlcktpdDtcbiAqICAgc3RvcmFnZU5vZGU6IEVSZW1vdGU8U3RvcmFnZU5vZGU+O1xuICogICB6Y2Y6IFpDRjtcbiAqIH19IHBvd2Vyc1xuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUFzc2V0UmVzZXJ2ZUtpdCA9IGFzeW5jIChcbiAgYmFnZ2FnZSxcbiAgeyBmZWVNaW50LCBtYWtlUmVjb3JkZXJLaXQsIHN0b3JhZ2VOb2RlLCB6Y2YgfSxcbikgPT4ge1xuICB0cmFjZSgncHJlcGFyZUFzc2V0UmVzZXJ2ZUtpdCcsIFsuLi5iYWdnYWdlLmtleXMoKV0pO1xuICBjb25zdCBmZWVLaXQgPSBmZWVNaW50LmdldElzc3VlclJlY29yZCgpO1xuICBjb25zdCBlbXB0eUFtb3VudCA9IEFtb3VudE1hdGgubWFrZUVtcHR5KGZlZUtpdC5icmFuZCk7XG5cbiAgY29uc3Qgem9uZSA9IG1ha2VEdXJhYmxlWm9uZShiYWdnYWdlKTtcblxuICAvKiBEdXJhYmxlIHJldm9jYXRpb24gYm9va2tlZXBpbmcgZm9yIHRoZSByZXZvY2FibGUgc2luZ2xlIGFuZCByZXBlYXRhYmxlKi9cbiAgLyogaW52aXRhdGlvbnMuKi9cbiAgLyoqIEB0eXBlIHtTZXRTdG9yZTx7IHJldm9rZTogKCkgPT4gYm9vbGVhbiB9Pn0gKi9cbiAgY29uc3Qgb3V0c3RhbmRpbmdSZXZva2VycyA9IHpvbmUuc2V0U3RvcmUoJ291dHN0YW5kaW5nUmV2b2tlcnMnKTtcblxuICBjb25zdCB7IG1ha2VSZXZvY2FibGVLaXQ6IG1ha2VSZXZvY2FibGVXaXRoZHJhd2FsRmFjZXQgfSA9XG4gICAgcHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0KHpvbmUsICdXaXRoZHJhd2FsRmFjZXQnLCBbJ1dpdGhkcmF3J10pO1xuXG4gIGNvbnN0IHsgbWFrZVJldm9jYWJsZUtpdDogbWFrZVJldm9jYWJsZVdpdGhkcmF3YWxIYW5kbGVyIH0gPVxuICAgIHByZXBhcmVSZXZvY2FibGVNYWtlcktpdCh6b25lLCAnV2l0aGRyYXdhbEhhbmRsZXInLCBbJ2hhbmRsZSddLCB7XG4gICAgICBleHRyYU1ldGhvZHM6IHtcbiAgICAgICAgLyoqXG4gKiBBZGQgc29tZSBhZGRpdGlvbmFsIGNsZWFudXAgdG8gYXZvaWQgcHJvbGlmZXJhdGlvbiBvZiByZXZva2VycyBmb3JcbiAqIHNwZW50IGludml0YXRpb25zLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtuZXZlcn0gb2ZmZXJBcmdzXG4gKi9cbiAgICAgICAgaGFuZGxlKHNlYXQsIG9mZmVyQXJncykge1xuICAgICAgICAgIGNvbnN0IHsgcmV2b2tlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgLyogV2UgcmVtb3ZlIG91ciBvdXRzdGFuZGluZyByZXZva2VyIGJlY2F1c2Ugd2UgYXJlIGNvbnN1bWVkIGJ5IFpvZSovXG4gICAgICAgICAgLyogYW5kIGNhbm5vdCBiZSB1c2VkIGFnYWluLiovXG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUudW5kZXJseWluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBGYWlsYCR7cSgnV2l0aGRyYXdhbEhhbmRsZXJfY2FyZXRha2VyJyl9IHJldm9rZWRgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG91dHN0YW5kaW5nUmV2b2tlcnMuZGVsZXRlKHJldm9rZXIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnVuZGVybHlpbmcuaGFuZGxlKHNlYXQsIG9mZmVyQXJncyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gIGNvbnN0IG1ha2VBc3NldFJlc2VydmVLaXRJbnRlcm5hbCA9IHByZXBhcmVFeG9DbGFzc0tpdChcbiAgICBiYWdnYWdlLFxuICAgICdBc3NldFJlc2VydmVLaXQnLFxuICAgIHtcbiAgICAgIGhlbHBlcjogVW5ndWFyZGVkSGVscGVySSxcbiAgICAgIGdvdmVybmVkQXBpczogTS5pbnRlcmZhY2UoJ0Fzc2V0UmVzZXJ2ZSBnb3Zlcm5lZEFwaXMnLCB7XG4gICAgICAgIGJ1cm5GZWVzVG9SZWR1Y2VTaG9ydGZhbGw6IE0uY2FsbChBbW91bnRTaGFwZSkucmV0dXJucygpLFxuICAgICAgfSksXG4gICAgICB3aXRoZHJhd2FsRmFjZXQ6IE0uaW50ZXJmYWNlKCdBc3NldFJlc2VydmUgd2l0aGRyYXdhbEZhY2V0Jywge1xuICAgICAgICBXaXRoZHJhdzogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICB9KSxcbiAgICAgIHdpdGhkcmF3YWxIYW5kbGVyOiBPZmZlckhhbmRsZXJJLFxuICAgICAgcmVwZWF0YWJsZVdpdGhkcmF3YWxIYW5kbGVyOiBPZmZlckhhbmRsZXJJLFxuICAgICAgbWFjaGluZTogTS5pbnRlcmZhY2UoJ0Fzc2V0UmVzZXJ2ZSBtYWNoaW5lJywge1xuICAgICAgICBhZGRJc3N1ZXI6IE0uY2FsbChJc3N1ZXJTaGFwZSwgTS5zdHJpbmcoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICAgIGdldEFsbG9jYXRpb25zOiBNLmNhbGwoKS5yZXR1cm5zKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgICAgIG1ha2VTaG9ydGZhbGxSZXBvcnRpbmdJbnZpdGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICAgICAgbWFrZVNpbmdsZVdpdGhkcmF3YWxJbnZpdGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICAgICAgbWFrZVJlcGVhdGFibGVXaXRoZHJhd2FsSW52aXRhdGlvbjogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICAgIHJldm9rZU91dHN0YW5kaW5nV2l0aGRyYXdhbEludml0YXRpb25zOiBNLmNhbGwoKS5yZXR1cm5zKCksXG4gICAgICB9KSxcbiAgICAgIHB1YmxpYzogTS5pbnRlcmZhY2UoJ0Fzc2V0UmVzZXJ2ZSBwdWJsaWMnLCB7XG4gICAgICAgIG1ha2VBZGRDb2xsYXRlcmFsSW52aXRhdGlvbjogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICAgIGdldFB1YmxpY1RvcGljczogTS5jYWxsKCkucmV0dXJucyhUb3BpY3NSZWNvcmRTaGFwZSksXG4gICAgICB9KSxcbiAgICAgIHNob3J0ZmFsbFJlcG9ydGluZ0ZhY2V0OiBNLmludGVyZmFjZSgnQXNzZXRSZXNlcnZlIHNob3J0ZmFsbCByZXBvcnRlcicsIHtcbiAgICAgICAgaW5jcmVhc2VMaXF1aWRhdGlvblNob3J0ZmFsbDogTS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCksXG4gICAgICAgIHJlZHVjZUxpcXVpZGF0aW9uU2hvcnRmYWxsOiBNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKSxcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgLyoqIEBwYXJhbSB7UmVtb3RlPFN0b3JhZ2VOb2RlPn0gbWV0cmljc05vZGUgKi9cbiAgICBtZXRyaWNzTm9kZSA9PiB7XG4gICAgICAvKipcbiAqIFVzZWQgdG8gbG9vayB1cCB0aGUgdW5pcXVlIGtleXdvcmQgZm9yIGVhY2ggYnJhbmQsIGluY2x1ZGluZyBGZWUgYnJhbmQuXG4gKlxuICogQHR5cGUge01hcFN0b3JlPEJyYW5kLCBLZXl3b3JkPn1cbiAqL1xuICAgICAgY29uc3Qga2V5d29yZEZvckJyYW5kID0gbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdrZXl3b3JkRm9yQnJhbmQnLCB7XG4gICAgICAgIGR1cmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIC8qKlxuICogVXNlZCB0byBsb29rIHVwIHRoZSBicmFuZHMgZm9yIGtleXdvcmRzLCBleGNsdWRpbmcgRmVlIGJlY2F1c2UgaXQncyBhXG4gKiBzcGVjaWFsIGNhc2UuXG4gKlxuICogQHR5cGUge01hcFN0b3JlPEtleXdvcmQsIEJyYW5kPn1cbiAqL1xuICAgICAgY29uc3QgYnJhbmRGb3JLZXl3b3JkID0gbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdicmFuZEZvcktleXdvcmQnLCB7XG4gICAgICAgIGR1cmFibGU6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYnJhbmRGb3JLZXl3b3JkLFxuICAgICAgICAvKiBXZSBrZWVwIHRoZSBhc3NvY2lhdGVkIGxpcXVpZGl0eSB0b2tlbnMgaW4gdGhlIHNhbWUgc2VhdCovXG4gICAgICAgIGNvbGxhdGVyYWxTZWF0OiB6Y2YubWFrZUVtcHR5U2VhdEtpdCgpLnpjZlNlYXQsXG4gICAgICAgIGtleXdvcmRGb3JCcmFuZCxcbiAgICAgICAgbWV0cmljc0tpdDogbWFrZVJlY29yZGVyS2l0KFxuICAgICAgICAgIG1ldHJpY3NOb2RlLFxuICAgICAgICAgIC8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPE1ldHJpY3NOb3RpZmljYXRpb24+fSAqLyAoTS5hbnkoKSksXG4gICAgICAgICksXG4gICAgICAgIHRvdGFsRmVlTWludGVkOiBlbXB0eUFtb3VudCxcbiAgICAgICAgdG90YWxGZWVCdXJuZWQ6IGVtcHR5QW1vdW50LFxuICAgICAgICBzaG9ydGZhbGxCYWxhbmNlOiBlbXB0eUFtb3VudCxcbiAgICAgIH07XG4gICAgfSxcbiAgICB7XG4gICAgICBoZWxwZXI6IHtcbiAgICAgICAgLyoqIEBwYXJhbSB7QnJhbmR9IGJyYW5kICovXG4gICAgICAgIGdldEtleXdvcmRGb3JCcmFuZChicmFuZCkge1xuICAgICAgICAgIGNvbnN0IHsga2V5d29yZEZvckJyYW5kIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGtleXdvcmRGb3JCcmFuZC5oYXMoYnJhbmQpIHx8XG4gICAgICAgICAgICBGYWlsYElzc3VlciBub3QgZGVmaW5lZCBmb3IgYnJhbmQgJHtxKFxuICAgICAgICAgICAgICBicmFuZCxcbiAgICAgICAgICAgICl9OyBmaXJzdCBjYWxsIGFkZElzc3VlcigpYDtcbiAgICAgICAgICByZXR1cm4ga2V5d29yZEZvckJyYW5kLmdldChicmFuZCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkXG4gKi9cbiAgICAgICAgc2F2ZUJyYW5kS2V5d29yZChicmFuZCwga2V5d29yZCkge1xuICAgICAgICAgIHRyYWNlKCdzYXZlQnJhbmRLZXl3b3JkJywgYnJhbmQsIGtleXdvcmQpO1xuICAgICAgICAgIGNvbnN0IHsga2V5d29yZEZvckJyYW5kLCBicmFuZEZvcktleXdvcmQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAga2V5d29yZEZvckJyYW5kLmluaXQoYnJhbmQsIGtleXdvcmQpO1xuICAgICAgICAgIGJyYW5kRm9yS2V5d29yZC5pbml0KGtleXdvcmQsIGJyYW5kKTtcbiAgICAgICAgfSxcblxuICAgICAgICB3cml0ZU1ldHJpY3MoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCBtZXRyaWNzID0gaGFyZGVuKHtcbiAgICAgICAgICAgIGFsbG9jYXRpb25zOiBzdGF0ZS5jb2xsYXRlcmFsU2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpLFxuICAgICAgICAgICAgc2hvcnRmYWxsQmFsYW5jZTogc3RhdGUuc2hvcnRmYWxsQmFsYW5jZSxcbiAgICAgICAgICAgIHRvdGFsRmVlTWludGVkOiBzdGF0ZS50b3RhbEZlZU1pbnRlZCxcbiAgICAgICAgICAgIHRvdGFsRmVlQnVybmVkOiBzdGF0ZS50b3RhbEZlZUJ1cm5lZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2b2lkIHN0YXRlLm1ldHJpY3NLaXQucmVjb3JkZXIud3JpdGUobWV0cmljcyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZ292ZXJuZWRBcGlzOiB7XG4gICAgICAgIC8qKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSByZWR1Y3Rpb25cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gICAgICAgIGJ1cm5GZWVzVG9SZWR1Y2VTaG9ydGZhbGwocmVkdWN0aW9uKSB7XG4gICAgICAgICAgY29uc3QgeyBmYWNldHMsIHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIHRyYWNlKCdidXJuRmVlc1RvUmVkdWNlU2hvcnRmYWxsJywgcmVkdWN0aW9uKTtcbiAgICAgICAgICByZWR1Y3Rpb24gPSBBbW91bnRNYXRoLmNvZXJjZShmZWVLaXQuYnJhbmQsIHJlZHVjdGlvbik7XG4gICAgICAgICAgY29uc3QgZmVlS2V5d29yZCA9IHN0YXRlLmtleXdvcmRGb3JCcmFuZC5nZXQoZmVlS2l0LmJyYW5kKTtcbiAgICAgICAgICBjb25zdCBmZWVCYWxhbmNlID0gc3RhdGUuY29sbGF0ZXJhbFNlYXQuZ2V0QW1vdW50QWxsb2NhdGVkKFxuICAgICAgICAgICAgZmVlS2V5d29yZCxcbiAgICAgICAgICAgIGZlZUtpdC5icmFuZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGFtb3VudFRvQnVybiA9IEFtb3VudE1hdGgubWluKHJlZHVjdGlvbiwgZmVlQmFsYW5jZSk7XG4gICAgICAgICAgaWYgKEFtb3VudE1hdGguaXNFbXB0eShhbW91bnRUb0J1cm4pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmVlTWludC5idXJuTG9zc2VzKFxuICAgICAgICAgICAgaGFyZGVuKHsgW2ZlZUtleXdvcmRdOiBhbW91bnRUb0J1cm4gfSksXG4gICAgICAgICAgICBzdGF0ZS5jb2xsYXRlcmFsU2VhdCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHN0YXRlLnRvdGFsRmVlQnVybmVkID0gQW1vdW50TWF0aC5hZGQoXG4gICAgICAgICAgICBzdGF0ZS50b3RhbEZlZUJ1cm5lZCxcbiAgICAgICAgICAgIGFtb3VudFRvQnVybixcbiAgICAgICAgICApO1xuICAgICAgICAgIGZhY2V0cy5oZWxwZXIud3JpdGVNZXRyaWNzKCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgd2l0aGRyYXdhbEhhbmRsZXI6IHtcbiAgICAgICAgYXN5bmMgaGFuZGxlKHNlYXQpIHtcbiAgICAgICAgICBjb25zdCB7IGNvbGxhdGVyYWxTZWF0IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICBjb25zdCB7IHdhbnQgfSA9IHNlYXQuZ2V0UHJvcG9zYWwoKTtcblxuICAgICAgICAgIC8qIENPTU1JVCBQT0lOVCovXG4gICAgICAgICAgLyogVU5USUwgIzEwNjg0OiBhYmlsaXR5IHRvIHRlcm1pbmF0ZSBhbiBpbmNhcm5hdGlvbiB3L28gdGVybWluYXRpbmcgdGhlIGNvbnRyYWN0Ki9cbiAgICAgICAgICB6Y2YuYXRvbWljUmVhcnJhbmdlKGhhcmRlbihbW2NvbGxhdGVyYWxTZWF0LCBzZWF0LCB3YW50XV0pKTtcblxuICAgICAgICAgIGhlbHBlci53cml0ZU1ldHJpY3MoKTtcbiAgICAgICAgICBzZWF0LmV4aXQoKTtcblxuICAgICAgICAgIHRyYWNlKCd3aXRoZHJldyBjb2xsYXRlcmFsJywgd2FudCk7XG4gICAgICAgICAgcmV0dXJuICd3aXRoZHJldyBDb2xsYXRlcmFsIGZyb20gdGhlIFJlc2VydmUnO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHdpdGhkcmF3YWxGYWNldDoge1xuICAgICAgICBXaXRoZHJhdygpIHtcbiAgICAgICAgICBjb25zdCB7IHJldm9rZXIsIHJldm9jYWJsZTogaGFuZGxlciB9ID1cbiAgICAgICAgICAgIG1ha2VSZXZvY2FibGVXaXRoZHJhd2FsSGFuZGxlcih0aGlzLmZhY2V0cy53aXRoZHJhd2FsSGFuZGxlcik7XG4gICAgICAgICAgb3V0c3RhbmRpbmdSZXZva2Vycy5hZGQocmV2b2tlcik7XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBBcmd1bWVudCBvZiB0eXBlIEd1YXJkZWQ8Ki9cbiAgICAgICAgICByZXR1cm4gemNmLm1ha2VJbnZpdGF0aW9uKGhhbmRsZXIsICdXaXRoZHJhdyBDb2xsYXRlcmFsJyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVwZWF0YWJsZVdpdGhkcmF3YWxIYW5kbGVyOiB7XG4gICAgICAgIC8qKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKi9cbiAgICAgICAgaGFuZGxlKHNlYXQpIHtcbiAgICAgICAgICBzZWF0LmV4aXQoKTtcbiAgICAgICAgICBjb25zdCB7IHJldm9rZXIsIHJldm9jYWJsZTogaW52aXRhdGlvbk1ha2VycyB9ID1cbiAgICAgICAgICAgIG1ha2VSZXZvY2FibGVXaXRoZHJhd2FsRmFjZXQodGhpcy5mYWNldHMud2l0aGRyYXdhbEZhY2V0KTtcbiAgICAgICAgICBvdXRzdGFuZGluZ1Jldm9rZXJzLmFkZChyZXZva2VyKTtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgaW52aXRhdGlvbk1ha2VycyB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtYWNoaW5lOiB7XG4gICAgICAgIC8qIGFkZCBtYWtlUmVkZWVtTGlxdWlkaXR5VG9rZW5zSW52aXRhdGlvbiBsYXRlci4gRm9yIG5vdyBqdXN0IHN0b3JlIHRoZW0qL1xuICAgICAgICAvKipcbiAqIEBwYXJhbSB7SXNzdWVyfSBpc3N1ZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXl3b3JkXG4gKi9cbiAgICAgICAgYXN5bmMgYWRkSXNzdWVyKGlzc3Vlciwga2V5d29yZCkge1xuICAgICAgICAgIGNvbnN0IGJyYW5kID0gYXdhaXQgRShpc3N1ZXIpLmdldEJyYW5kKCk7XG4gICAgICAgICAgdHJhY2UoJ2FkZElzc3VlcicsIHsgYnJhbmQsIGtleXdvcmQgfSk7XG4gICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAga2V5d29yZCAhPT0gJ0ZlZScgJiYgYnJhbmQgIT09IGZlZUtpdC5icmFuZCxcbiAgICAgICAgICAgIGAnRmVlJyBicmFuZCBpcyBhIHNwZWNpYWwgY2FzZSBoYW5kbGVkIGJ5IHRoZSByZXNlcnZlIGNvbnRyYWN0YCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdHJhY2UoJ2FkZElzc3VlciBzdG9yaW5nJywge1xuICAgICAgICAgICAga2V5d29yZCxcbiAgICAgICAgICAgIGJyYW5kLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5mYWNldHMuaGVscGVyLnNhdmVCcmFuZEtleXdvcmQoYnJhbmQsIGtleXdvcmQpO1xuICAgICAgICAgIGF3YWl0IHpjZi5zYXZlSXNzdWVyKGlzc3Vlciwga2V5d29yZCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqIFhYWCByZWR1bmRhbnQgd2l0aCBnZXRQdWJsaWNUb3BpY3MgbWV0cmljcyBgYWxsb2NhdGlvbmAgKi9cbiAgICAgICAgZ2V0QWxsb2NhdGlvbnMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuY29sbGF0ZXJhbFNlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKTtcbiAgICAgICAgfSxcblxuICAgICAgICBtYWtlU2hvcnRmYWxsUmVwb3J0aW5nSW52aXRhdGlvbigpIHtcbiAgICAgICAgICBjb25zdCB7IGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCBoYW5kbGVTaG9ydGZhbGxSZXBvcnRpbmdPZmZlciA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmYWNldHMuc2hvcnRmYWxsUmVwb3J0aW5nRmFjZXQ7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiB6Y2YubWFrZUludml0YXRpb24oXG4gICAgICAgICAgICBoYW5kbGVTaG9ydGZhbGxSZXBvcnRpbmdPZmZlcixcbiAgICAgICAgICAgICdnZXRGYWNldEZvclJlcG9ydGluZ1Nob3J0ZmFsbHMnLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbWFrZVNpbmdsZVdpdGhkcmF3YWxJbnZpdGF0aW9uKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy53aXRoZHJhd2FsRmFjZXQuV2l0aGRyYXcoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBtYWtlUmVwZWF0YWJsZVdpdGhkcmF3YWxJbnZpdGF0aW9uKCkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmZhY2V0cy5yZXBlYXRhYmxlV2l0aGRyYXdhbEhhbmRsZXI7XG4gICAgICAgICAgcmV0dXJuIHpjZi5tYWtlSW52aXRhdGlvbihoYW5kbGVyLCAnUmVwZWF0YWJsZSBXaXRoZHJhdyBDb2xsYXRlcmFsJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmV2b2tlT3V0c3RhbmRpbmdXaXRoZHJhd2FsSW52aXRhdGlvbnMoKSB7XG4gICAgICAgICAgZm9yIChjb25zdCByZXZva2VyIG9mIG91dHN0YW5kaW5nUmV2b2tlcnMua2V5cygpKSB7XG4gICAgICAgICAgICByZXZva2VyLnJldm9rZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXRzdGFuZGluZ1Jldm9rZXJzLmNsZWFyKCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLyoqXG4gKiBYWFggbWlzc2luZyBnb3Zlcm5hbmNlIHB1YmxpYyBtZXRob2RzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzUyMDBcbiAqL1xuICAgICAgcHVibGljOiB7XG4gICAgICAgIC8qKiBBbnlvbmUgY2FuIGRlcG9zaXQgYW55IGFzc2V0cyB0byB0aGUgcmVzZXJ2ZSAqL1xuICAgICAgICBtYWtlQWRkQ29sbGF0ZXJhbEludml0YXRpb24oKSB7XG4gICAgICAgICAgLyoqIEB0eXBlIHtPZmZlckhhbmRsZXI8UHJvbWlzZTxzdHJpbmc+Pn0gKi9cbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gYXN5bmMgc2VhdCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGdpdmU6IHsgQ29sbGF0ZXJhbDogYW1vdW50SW4gfSxcbiAgICAgICAgICAgIH0gPSBzZWF0LmdldFByb3Bvc2FsKCk7XG4gICAgICAgICAgICBjb25zdCB7IGZhY2V0cywgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gZmFjZXRzO1xuXG4gICAgICAgICAgICBjb25zdCBjb2xsYXRlcmFsS2V5d29yZCA9IGhlbHBlci5nZXRLZXl3b3JkRm9yQnJhbmQoYW1vdW50SW4uYnJhbmQpO1xuXG4gICAgICAgICAgICBhdG9taWNUcmFuc2ZlcihcbiAgICAgICAgICAgICAgemNmLFxuICAgICAgICAgICAgICBzZWF0LFxuICAgICAgICAgICAgICBzdGF0ZS5jb2xsYXRlcmFsU2VhdCxcbiAgICAgICAgICAgICAgeyBDb2xsYXRlcmFsOiBhbW91bnRJbiB9LFxuICAgICAgICAgICAgICB7IFtjb2xsYXRlcmFsS2V5d29yZF06IGFtb3VudEluIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc2VhdC5leGl0KCk7XG4gICAgICAgICAgICBoZWxwZXIud3JpdGVNZXRyaWNzKCk7XG5cbiAgICAgICAgICAgIHRyYWNlKCdyZWNlaXZlZCBjb2xsYXRlcmFsJywgYW1vdW50SW4pO1xuICAgICAgICAgICAgcmV0dXJuICdhZGRlZCBDb2xsYXRlcmFsIHRvIHRoZSBSZXNlcnZlJztcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiB6Y2YubWFrZUludml0YXRpb24oaGFuZGxlciwgJ0FkZCBDb2xsYXRlcmFsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFB1YmxpY1RvcGljcygpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWV0cmljczogbWFrZVJlY29yZGVyVG9waWMoXG4gICAgICAgICAgICAgICdBc3NldCBSZXNlcnZlIG1ldHJpY3MnLFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLm1ldHJpY3NLaXQsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc2hvcnRmYWxsUmVwb3J0aW5nRmFjZXQ6IHtcbiAgICAgICAgLyoqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gc2hvcnRmYWxsICovXG4gICAgICAgIGluY3JlYXNlTGlxdWlkYXRpb25TaG9ydGZhbGwoc2hvcnRmYWxsKSB7XG4gICAgICAgICAgY29uc3QgeyBmYWNldHMsIHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIHN0YXRlLnNob3J0ZmFsbEJhbGFuY2UgPSBBbW91bnRNYXRoLmFkZChcbiAgICAgICAgICAgIHN0YXRlLnNob3J0ZmFsbEJhbGFuY2UsXG4gICAgICAgICAgICBzaG9ydGZhbGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBmYWNldHMuaGVscGVyLndyaXRlTWV0cmljcygpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qIGN1cnJlbnRseSBleHBvc2VkIGZvciB0ZXN0aW5nLiBNYXliZSBpdCBvbmx5IGdldHMgY2FsbGVkIGludGVybmFsbHk/Ki9cbiAgICAgICAgLyoqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gcmVkdWN0aW9uICovXG4gICAgICAgIHJlZHVjZUxpcXVpZGF0aW9uU2hvcnRmYWxsKHJlZHVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgaWYgKEFtb3VudE1hdGguaXNHVEUocmVkdWN0aW9uLCBzdGF0ZS5zaG9ydGZhbGxCYWxhbmNlKSkge1xuICAgICAgICAgICAgc3RhdGUuc2hvcnRmYWxsQmFsYW5jZSA9IGVtcHR5QW1vdW50O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZS5zaG9ydGZhbGxCYWxhbmNlID0gQW1vdW50TWF0aC5zdWJ0cmFjdChcbiAgICAgICAgICAgICAgc3RhdGUuc2hvcnRmYWxsQmFsYW5jZSxcbiAgICAgICAgICAgICAgcmVkdWN0aW9uLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5mYWNldHMuaGVscGVyLndyaXRlTWV0cmljcygpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpbmlzaDogKHsgZmFjZXRzOiB7IGhlbHBlciB9IH0pID0+IHtcbiAgICAgICAgLyogbm8gbmVlZCB0byBzYXZlSXNzdWVyKCkgYi9jIHJlZ2lzdGVyRmVlTWludCBkaWQgaXQqL1xuICAgICAgICBoZWxwZXIuc2F2ZUJyYW5kS2V5d29yZChmZWVLaXQuYnJhbmQsICdGZWUnKTtcblxuICAgICAgICBoZWxwZXIud3JpdGVNZXRyaWNzKCk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgY29uc3QgbWFrZUFzc2V0UmVzZXJ2ZUtpdCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtZXRyaWNzTm9kZSA9IGF3YWl0IEUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoJ21ldHJpY3MnKTtcbiAgICByZXR1cm4gbWFrZUFzc2V0UmVzZXJ2ZUtpdEludGVybmFsKG1ldHJpY3NOb2RlKTtcbiAgfTtcbiAgcmV0dXJuIG1ha2VBc3NldFJlc2VydmVLaXQ7XG59OyRozY9fb25jZS5wcmVwYXJlQXNzZXRSZXNlcnZlS2l0KHByZXBhcmVBc3NldFJlc2VydmVLaXQpO1xuaGFyZGVuKHByZXBhcmVBc3NldFJlc2VydmVLaXQpO1xuLyoqIEB0eXBlZGVmIHtFUmV0dXJuPEVSZXR1cm48dHlwZW9mIHByZXBhcmVBc3NldFJlc2VydmVLaXQ+Pn0gQXNzZXRSZXNlcnZlS2l0ICovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlQXNzZXRSZXNlcnZlS2l0IjpbInByZXBhcmVBc3NldFJlc2VydmVLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABRgL3NksAADZLAAAJwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jYWxsYmFjay5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJjYWxsRSIsImNhbGxTeW5jIiwiaXNDYWxsYmFjayIsIm1ha2VGdW5jdGlvbkNhbGxiYWNrIiwibWFrZU1ldGhvZENhbGxiYWNrIiwibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIiwibWFrZVN5bmNNZXRob2RDYWxsYmFjayIsInByZXBhcmVBdHRlbnVhdG9yIiwicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxtYWtlRXJyb3IscSxFLGlzUHJpbWl0aXZlLGlzUGFzc2FibGVTeW1ib2wsZ2V0SW50ZXJmYWNlTWV0aG9kS2V5czskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wiaXNQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGlzUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5c1wiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU1ldGhvZEtleXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJ1xuICogQGltcG9ydCB7TWV0aG9kc30gZnJvbSAnQGVuZG8vZXhvJztcbiAqIEBpbXBvcnQge0ZhcmFibGV9IGZyb20gJ0BlbmRvL2V4byc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VHdWFyZH0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7TWV0aG9kR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqL1xuLyoqIEBpbXBvcnQge0NhbGxiYWNrLCBTeW5jQ2FsbGJhY2t9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0IHsgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuY29uc3QgeyBvd25LZXlzOiByYXdPd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3Qgb3duS2V5cyA9XG4gIC8qKiBAdHlwZSB7PFQgZXh0ZW5kcyBQcm9wZXJ0eUtleT4ob2JqOiB7IFtLIGluIFRdPzogdW5rbm93biB9KSA9PiBUW119ICovIChcbiAgICByYXdPd25LZXlzXG4gICk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICAuLi5hcmdzOiBQYXJhbWV0ZXJzPFJldHVyblR5cGU8dHlwZW9mIHByZXBhcmVBdHRlbnVhdG9yPj5cbiAqICkgPT4gRmFyYWJsZTxUPn0gTWFrZUF0dGVudWF0b3JcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0ga2V5XG4gKiBAcmV0dXJucyB7a2V5IGlzIFByb3BlcnR5S2V5fSBGSVhNRTogc2hvdWxkIGJlIGp1c3QgYFByb3BlcnR5S2V5YCBidXQgVFNcbiAqICAgY29tcGxhaW5zIGl0IGNhbid0IGJlIHVzZWQgYXMgYW4gaW5kZXggdHlwZS5cbiAqL1xuY29uc3QgaXNQcm9wZXJ0eUtleSA9IGtleSA9PiB7XG4gIHN3aXRjaCAodHlwZW9mIGtleSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLyoqXG4gKiBTeW5jaHJvbm91c2x5IGNhbGwgYSBjYWxsYmFjay5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJXG4gKiBAcGFyYW0ge1N5bmNDYWxsYmFjazxJPn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICogQHJldHVybnMge1JldHVyblR5cGU8ST59XG4gKi9cbiAgICAgICBjb25zdCBjYWxsU3luYyA9IChjYWxsYmFjaywgLi4uYXJncykgPT4ge1xuICBjb25zdCB7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSA9IGNhbGxiYWNrO1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRhcmdldCguLi5ib3VuZCwgLi4uYXJncyk7XG4gIH1cbiAgcmV0dXJuIHRhcmdldFttZXRob2ROYW1lXSguLi5ib3VuZCwgLi4uYXJncyk7XG59OyRozY9fb25jZS5jYWxsU3luYyhjYWxsU3luYyk7XG5oYXJkZW4oY2FsbFN5bmMpO1xuXG4vKipcbiAqIEV2ZW50dWFsIHNlbmQgdG8gYSBjYWxsYmFjay5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJXG4gKiBAcGFyYW0ge0NhbGxiYWNrPEk+fSBjYWxsYmFja1xuICogQHBhcmFtIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8ST4+Pn1cbiAqL1xuICAgICAgIGNvbnN0IGNhbGxFID0gKGNhbGxiYWNrLCAuLi5hcmdzKSA9PiB7XG4gIGNvbnN0IHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCB9ID0gY2FsbGJhY2s7XG4gIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gRSh0YXJnZXQpKC4uLmJvdW5kLCAuLi5hcmdzKTtcbiAgfVxuICByZXR1cm4gRSh0YXJnZXQpW21ldGhvZE5hbWVdKC4uLmJvdW5kLCAuLi5hcmdzKTtcbn07JGjNj19vbmNlLmNhbGxFKGNhbGxFKTtcbmhhcmRlbihjYWxsRSk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgZnJvbSBhIG5lYXIgZnVuY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSVxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogWy4uLkIsIC4uLlBhcmFtZXRlcnM8ST5dKSA9PiBSZXR1cm5UeXBlPEk+fSBbVD1JXVxuICogQHRlbXBsYXRlIHthbnlbXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge1N5bmNDYWxsYmFjazxJPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayA9ICh0YXJnZXQsIC4uLmJvdW5kKSA9PiB7XG4gIHR5cGVvZiB0YXJnZXQgPT09ICdmdW5jdGlvbicgfHxcbiAgICBGYWlsYHN5bmMgZnVuY3Rpb24gY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYSBmdW5jdGlvbjogJHt0YXJnZXR9YDtcbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgYm91bmQsIGlzU3luYzogdHJ1ZSB9KTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7U3luY0NhbGxiYWNrPEk+fSAqLyAoY2IpO1xufTskaM2PX29uY2UubWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBmcm9tIGEgcG90ZW50aWFsbHkgZmFyIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7RVJlZjwoLi4uYXJnczogWy4uLkIsIC4uLlBhcmFtZXRlcnM8ST5dKSA9PiBSZXR1cm5UeXBlPEk+Pn0gW1Q9RVJlZjxJPl1cbiAqIEB0ZW1wbGF0ZSB7YW55W119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtDYWxsYmFjazxJPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VGdW5jdGlvbkNhbGxiYWNrID0gKHRhcmdldCwgLi4uYm91bmQpID0+IHtcbiAgIWlzUHJpbWl0aXZlKHRhcmdldCkgfHxcbiAgICBGYWlsYGZ1bmN0aW9uIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGEgZnVuY3Rpb24gcHJlc2VuY2U6ICR7dGFyZ2V0fWA7XG4gIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgY29uc3QgY2IgPSBoYXJkZW4oeyB0YXJnZXQsIGJvdW5kIH0pO1xuICByZXR1cm4gLyoqIEB0eXBlIHtDYWxsYmFjazxJPn0gKi8gKGNiKTtcbn07JGjNj19vbmNlLm1ha2VGdW5jdGlvbkNhbGxiYWNrKG1ha2VGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgZnJvbSBhIG5lYXIgbWV0aG9kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IFBcbiAqIEB0ZW1wbGF0ZSB7e1xuICogICBbeCBpbiBQXTogKC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPjtcbiAqIH19IFtUPXsgW3ggaW4gUF06IEkgfV1cbiAqIEB0ZW1wbGF0ZSB7YW55W119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UH0gbWV0aG9kTmFtZVxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge1N5bmNDYWxsYmFjazxJPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2sgPSAodGFyZ2V0LCBtZXRob2ROYW1lLCAuLi5ib3VuZCkgPT4ge1xuICAhaXNQcmltaXRpdmUodGFyZ2V0KSB8fFxuICAgIEZhaWxgc3luYyBtZXRob2QgY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0OiAke3RhcmdldH1gO1xuICB0eXBlb2YgbWV0aG9kTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICBpc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpIHx8XG4gICAgRmFpbGBtZXRob2QgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIHBhc3NhYmxlIHN5bWJvbDogJHttZXRob2ROYW1lfWA7XG4gIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgY29uc3QgY2IgPSBoYXJkZW4oeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kLCBpc1N5bmM6IHRydWUgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge1N5bmNDYWxsYmFjazxJPn0gKi8gKGNiKTtcbn07JGjNj19vbmNlLm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2sobWFrZVN5bmNNZXRob2RDYWxsYmFjayk7XG5oYXJkZW4obWFrZVN5bmNNZXRob2RDYWxsYmFjayk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgZnJvbSBhIHBvdGVudGlhbGx5IGZhciBtZXRob2QuXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSVxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gUFxuICogQHRlbXBsYXRlIHtFUmVmPHtcbiAqICAgW3ggaW4gUF06ICguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST47XG4gKiB9Pn0gW1Q9RVJlZjx7IFt4IGluIFBdOiBJIH0+XVxuICogQHRlbXBsYXRlIHthbnlbXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQfSBtZXRob2ROYW1lXG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7Q2FsbGJhY2s8ST59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWV0aG9kQ2FsbGJhY2sgPSAodGFyZ2V0LCBtZXRob2ROYW1lLCAuLi5ib3VuZCkgPT4ge1xuICAhaXNQcmltaXRpdmUodGFyZ2V0KSB8fFxuICAgIEZhaWxgbWV0aG9kIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdDogJHt0YXJnZXR9YDtcbiAgdHlwZW9mIG1ldGhvZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKSB8fFxuICAgIEZhaWxgbWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBwYXNzYWJsZSBzeW1ib2w6ICR7bWV0aG9kTmFtZX1gO1xuICAvKiogQHR5cGUge3Vua25vd259ICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCB9KTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7Q2FsbGJhY2s8ST59ICovIChjYik7XG59OyRozY9fb25jZS5tYWtlTWV0aG9kQ2FsbGJhY2sobWFrZU1ldGhvZENhbGxiYWNrKTtcbmhhcmRlbihtYWtlTWV0aG9kQ2FsbGJhY2spO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBjYWxsYmFja1xuICogQHJldHVybnMge2NhbGxiYWNrIGlzIENhbGxiYWNrPGFueT59XG4gKi9cbiAgICAgICBjb25zdCBpc0NhbGxiYWNrID0gY2FsbGJhY2sgPT4ge1xuICBpZiAoaXNQcmltaXRpdmUoY2FsbGJhY2spKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCB9ID0gY2FsbGJhY2s7XG4gIHJldHVybiAoXG4gICAgIWlzUHJpbWl0aXZlKHRhcmdldCkgJiZcbiAgICAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0eXBlb2YgbWV0aG9kTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIGlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkpICYmXG4gICAgQXJyYXkuaXNBcnJheShib3VuZClcbiAgKTtcbn07JGjNj19vbmNlLmlzQ2FsbGJhY2soaXNDYWxsYmFjayk7XG5oYXJkZW4oaXNDYWxsYmFjayk7XG5cbi8qKlxuICogUHJlcGFyZSBhbiBhdHRlbnVhdG9yIGNsYXNzIHdob3NlIG1ldGhvZHMgY2FuIGJlIHJlZGlyZWN0ZWQgdmlhIGNhbGxiYWNrcy5cbiAqXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBNXG4gKiBAcGFyYW0ge1pvbmV9IHpvbmUgVGhlIHpvbmUgaW4gd2hpY2ggdG8gYWxsb2NhdGUgYXR0ZW51YXRvcnMuXG4gKiBAcGFyYW0ge01bXX0gbWV0aG9kTmFtZXMgTWV0aG9kcyB0byBmb3J3YXJkLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQ8e1xuICogICBbSyBpbiBNXTogTWV0aG9kR3VhcmQ7XG4gKiB9Pn0gW29wdHMuaW50ZXJmYWNlR3VhcmRdXG4gKiAgIEFuIGludGVyZmFjZSBndWFyZCBmb3IgdGhlIG5ldyBhdHRlbnVhdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLnRhZ10gQSB0YWcgZm9yIHRoZSBuZXcgYXR0ZW51YXRvciBleG9DbGFzcy5cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVBdHRlbnVhdG9yID0gKFxuICB6b25lLFxuICBtZXRob2ROYW1lcyxcbiAgeyBpbnRlcmZhY2VHdWFyZCwgdGFnID0gJ0F0dGVudWF0b3InIH0gPSB7fSxcbikgPT4ge1xuICAvKipcbiAqIEB0eXBlZGVmIHsodGhpczogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBNZXRob2RcbiAqXG4gKiBAdHlwZWRlZiB7eyBbSyBpbiBNXT86IENhbGxiYWNrPGFueT4gfCBudWxsIH19IE92ZXJyaWRlc1xuICpcbiAqIEB0eXBlZGVmIHt7IFtLIGluIE1dOiAodGhpczogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55IH19IE1ldGhvZHNcbiAqL1xuICBjb25zdCBtZXRob2RzID0gLyoqIEB0eXBlIHtNZXRob2RzfSAqLyAoXG4gICAgZnJvbUVudHJpZXMoXG4gICAgICBtZXRob2ROYW1lcy5tYXAoa2V5ID0+IHtcbiAgICAgICAgLyogT25seSBhbGxvdyB0aGUgYFByb3BlcnR5S2V5YCB0eXBlIGZvciB0aGUgdGFyZ2V0IG1ldGhvZCBrZXkuKi9cbiAgICAgICAgaWYgKCFpc1Byb3BlcnR5S2V5KGtleSkpIHtcbiAgICAgICAgICB0aHJvdyBGYWlsYGtleSAke3Eoa2V5KX0gaXMgbm90IGEgUHJvcGVydHlLZXlgO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IC8qKiBAdHlwZSB7TWV0aG9kc30gKi8gKHtcbiAgICAgICAgICAvKiBFeHBsaWNpdGx5IHVzZSBjb25jaXNlIG1ldGhvZCBzeW50YXggdG8gcHJlc2VydmUgYHRoaXNgIGJ1dCBwcmV2ZW50Ki9cbiAgICAgICAgICAvKiBjb25zdHJ1Y3RvciBiZWhhdmlvci4qL1xuICAgICAgICAgIC8qKiBAdHlwZSB7TWV0aG9kfSAqL1xuICAgICAgICAgIFtrZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIC8qIFN1cHBvcnQgYm90aCBzeW5jaHJvbm91cyBhbmQgYXN5bmMgY2FsbGJhY2tzLiovXG4gICAgICAgICAgICBjb25zdCBjYiA9IHRoaXMuc3RhdGUuY2JzW2tleV07XG4gICAgICAgICAgICBpZiAoIWNiKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IG1ha2VFcnJvcihgdW5pbXBsZW1lbnRlZCAke3EodGFnKX0gbWV0aG9kICR7cShrZXkpfWApO1xuICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5pc1N5bmMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2IuaXNTeW5jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjYWxsU3luYyhjYiwgLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2FsbEUoY2IsIC4uLmFyZ3MpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pW2tleV07XG4gICAgICAgIHJldHVybiAvKiogQHR5cGUge2NvbnN0fSAqLyAoW2tleSwgbV0pO1xuICAgICAgfSksXG4gICAgKVxuICApO1xuXG4gIC8qKlxuICogQ3JlYXRlIGFuIGV4byBvYmplY3Qgd2hvc2UgYmVoYXZpb3IgaXMgY29tcG9zZWQgZnJvbSBhIGRlZmF1bHQgdGFyZ2V0XG4gKiBhbmQvb3IgaW5kaXZpZHVhbCBtZXRob2Qgb3ZlcnJpZGUgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge3Vua25vd259IFtvcHRzLnRhcmdldF0gVGhlIHRhcmdldCBmb3IgYW55IG1ldGhvZHMgdGhhdCB3ZXJlbid0XG4gKiAgIHNwZWNpZmllZCBpbiBgb3B0cy5vdmVycmlkZXNgLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pc1N5bmM9ZmFsc2VdIFdoZXRoZXIgdGhlIHRhcmdldCBzaG91bGQgYmUgdHJlYXRlZFxuICogICBhcyBzeW5jaHJvbm91c2x5IGF2YWlsYWJsZS5cbiAqIEBwYXJhbSB7T3ZlcnJpZGVzfSBbb3B0cy5vdmVycmlkZXNdIFNldCBpbmRpdmlkdWFsIGNhbGxiYWNrcyBmb3IgbWV0aG9kc1xuICogICAod2hvc2UgbmFtZXMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBgcHJlcGFyZUF0dGVudWF0b3JgIG9yXG4gKiAgIGBwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3JgIGNhbGwpLiBOdWxsaXNoIG92ZXJyaWRlcyBtZWFuIHRvIHRocm93LlxuICovXG4gIGNvbnN0IG1ha2VBdHRlbnVhdG9yID0gem9uZS5leG9DbGFzcyhcbiAgICB0YWcsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHthbnl9IFtvcHRzLnRhcmdldF1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaXNTeW5jXVxuICogQHBhcmFtIHtPdmVycmlkZXN9IFtvcHRzLm92ZXJyaWRlc11cbiAqL1xuICAgICh7XG4gICAgICB0YXJnZXQgPSBudWxsLFxuICAgICAgaXNTeW5jID0gZmFsc2UsXG4gICAgICBvdmVycmlkZXMgPSAvKiogQHR5cGUge092ZXJyaWRlc30gKi8gKHt9KSxcbiAgICB9KSA9PiB7XG4gICAgICBjb25zdCBjYnMgPSAvKiogQHR5cGUge092ZXJyaWRlc30gKi8gKHt9KTtcblxuICAgICAgY29uc3QgcmVtYWluaW5nID0gbmV3IFNldChtZXRob2ROYW1lcyk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBvd25LZXlzKG92ZXJyaWRlcykpIHtcbiAgICAgICAgcmVtYWluaW5nLmhhcyhrZXkpIHx8XG4gICAgICAgICAgRmFpbGAke3EodGFnKX0gb3ZlcnJpZGVzWyR7cShrZXkpfV0gbm90IGFsbG93ZWQgYnkgbWV0aG9kTmFtZXNgO1xuXG4gICAgICAgIHJlbWFpbmluZy5kZWxldGUoa2V5KTtcbiAgICAgICAgY29uc3QgY2IgPSBvdmVycmlkZXNba2V5XTtcbiAgICAgICAgY2IgPT0gbnVsbCB8fFxuICAgICAgICAgIGlzQ2FsbGJhY2soY2IpIHx8XG4gICAgICAgICAgRmFpbGAke3EodGFnKX0gb3ZlcnJpZGVzWyR7cShrZXkpfV0gaXMgbm90IGEgY2FsbGJhY2s7IGdvdCAke2NifWA7XG4gICAgICAgIGNic1trZXldID0gY2I7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiByZW1haW5pbmcpIHtcbiAgICAgICAgaWYgKGlzU3luYykge1xuICAgICAgICAgIGNic1trZXldID0gbWFrZVN5bmNNZXRob2RDYWxsYmFjayh0YXJnZXQsIGtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2JzW2tleV0gPSBtYWtlTWV0aG9kQ2FsbGJhY2sodGFyZ2V0LCBrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFyZGVuKHsgY2JzLCBpc1N5bmMgfSk7XG4gICAgfSxcbiAgICAvKiogQHR5cGUge01ldGhvZHN9ICovIChtZXRob2RzKSxcbiAgKTtcbiAgcmV0dXJuIG1ha2VBdHRlbnVhdG9yO1xufTskaM2PX29uY2UucHJlcGFyZUF0dGVudWF0b3IocHJlcGFyZUF0dGVudWF0b3IpO1xuaGFyZGVuKHByZXBhcmVBdHRlbnVhdG9yKTtcblxuLyoqXG4gKiBQcmVwYXJlIGFuIGF0dGVudWF0b3Igd2hvc2UgbWV0aG9kTmFtZXMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaW50ZXJmYWNlR3VhcmQuXG4gKlxuICogQHRlbXBsYXRlIHtJbnRlcmZhY2VHdWFyZH0gR1xuICogQHBhcmFtIHtab25lfSB6b25lXG4gKiBAcGFyYW0ge0d9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdHNdXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMudGFnXVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yID0gKHpvbmUsIGludGVyZmFjZUd1YXJkLCBvcHRzID0ge30pID0+IHtcbiAgY29uc3QgbWV0aG9kTmFtZXMgPSBnZXRJbnRlcmZhY2VNZXRob2RLZXlzKGludGVyZmFjZUd1YXJkKTtcbiAgY29uc3QgbWFrZUF0dGVudWF0b3IgPSBwcmVwYXJlQXR0ZW51YXRvcih6b25lLCBtZXRob2ROYW1lcywge1xuICAgIC4uLm9wdHMsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gIH0pO1xuICByZXR1cm4gLyoqIEB0eXBlIHtNYWtlQXR0ZW51YXRvcjxhbnk+fSAqLyAobWFrZUF0dGVudWF0b3IpO1xufTskaM2PX29uY2UucHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcik7XG5oYXJkZW4ocHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbGxTeW5jIjpbImNhbGxTeW5jIl0sImNhbGxFIjpbImNhbGxFIl0sIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayI6WyJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siXSwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siOlsibWFrZUZ1bmN0aW9uQ2FsbGJhY2siXSwibWFrZVN5bmNNZXRob2RDYWxsYmFjayI6WyJtYWtlU3luY01ldGhvZENhbGxiYWNrIl0sIm1ha2VNZXRob2RDYWxsYmFjayI6WyJtYWtlTWV0aG9kQ2FsbGJhY2siXSwiaXNDYWxsYmFjayI6WyJpc0NhbGxiYWNrIl0sInByZXBhcmVBdHRlbnVhdG9yIjpbInByZXBhcmVBdHRlbnVhdG9yIl0sInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciI6WyJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAozZPpvUEAAD1BAAAKAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jbGktdXRpbHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInRvQ0xJT3B0aW9ucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKipcbiAqIENvbnZlcnQgYSBzdHJpbmcta2V5ZWQgb2JqZWN0IGludG8gYW4gYXJyYXkgb2YgQ0xJIG9wdGlvbnMsIHVzaW5nIGVhY2gga2V5IGFzXG4gKiB0aGUgbmFtZSBvZiBhIEdOVS1zdHlsZSBsb25nIG9wdGlvbiBgLS0ke2tleX1gLCBpZ25vcmluZyBlYWNoIGtleSB3aXRoIGFuXG4gKiB1bmRlZmluZWQgdmFsdWUgYW5kIGNvbnZlcnRpbmcgYm9vbGVhbiB2YWx1ZXMgaW50byBuby1hcmd1bWVudCBgLS0ke2tleX1gIG9yXG4gKiBgLS1uby0ke2tleX1gIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmRlZmluZWQgfCBib29sZWFuIHwgc3RyaW5nIHwgc3RyaW5nW10+fSByZWNvcmQgLVxuICogICBlLmcuIHsgY29sb3I6ICdibHVlJyB9XG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gZS5nLiBbJy0tY29sb3InLCAnYmx1ZSddXG4gKi9cbiAgICAgICBjb25zdCB0b0NMSU9wdGlvbnMgPSByZWNvcmQgPT5cbiAgT2JqZWN0LmVudHJpZXMocmVjb3JkKS5mbGF0TWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkgcmV0dXJuIFtgLS0ke2tleX1gXTtcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSByZXR1cm4gW2AtLW5vLSR7a2V5fWBdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLyogUmVwcmVzZW50IGFzIGEgcmVwZWF0ZWQgb3B0aW9uLiovXG4gICAgICByZXR1cm4gdmFsdWUuZmxhdE1hcCh2ID0+IFtgLS0ke2tleX1gLCB2XSk7XG4gICAgfVxuICAgIHJldHVybiBbYC0tJHtrZXl9YCwgdmFsdWVdO1xuICB9KTskaM2PX29uY2UudG9DTElPcHRpb25zKHRvQ0xJT3B0aW9ucyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0b0NMSU9wdGlvbnMiOlsidG9DTElPcHRpb25zIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG0NeBXKDAAAygwAACUAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY29uZmlnLmpzeyJpbXBvcnRzIjpbIi4va2V5TWlycm9yLmpzIl0sImV4cG9ydHMiOlsiQnJpZGdlSWQiLCJDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCIsIlZCYW5rQWNjb3VudCIsIldhbGxldE5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBrZXlNaXJyb3I7JGjNj19pbXBvcnRzKFtbXCIuL2tleU1pcnJvci5qc1wiLCBbW1wia2V5TWlycm9yXCIsWyRozY9fYSA9PiAoa2V5TWlycm9yID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAZmlsZVxuICpcbiAqICAgU29tZSBvZiB0aGlzIGNvbmZpZyBpbmZvIG1heSBtYWtlIG1vcmUgc2Vuc2UgaW4gYSBwYXJ0aWN1bGFyIHBhY2thZ2UuIEhvd2V2ZXJcbiAqICAgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCBhbmQgb3VyIGxheCBwYWNrYWdlXG4gKiAgIGRlcGVuZGVuY3kgZ3JhcGgsIHNvbWV0aW1lcyByYXRpb25hbCBwbGFjZW1lbnRzIGNhdXNlIHR5cGUgcmVzb2x1dGlvblxuICogICBlcnJvcnMuXG4gKlxuICogICBTbyBhcyBhIHdvcmstYXJvdW5kIHNvbWUgY29uc3RhbnRzIHRoYXQgbmVlZCBhY2Nlc3MgZnJvbSBtb3JlIHRoYW4gb25lXG4gKiAgIHBhY2thZ2UgYXJlIHBsYWNlZCBoZXJlLlxuICovXG5cbi8qKlxuICogQ2x1c3Rlck5hbWUgc3BlY2lmaWVzIGEgY29sbGVjdGlvbiBvZiBuZXR3b3Jrcy4gVGhlIHNwZWNpZmljIG5ldHdvcmtzXG4gKiBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgbWF5IHZhcnkgZnJvbSBjb250ZXh0IHRvIGNvbnRleHQsIGFuZCBtYXlcbiAqIGFsc28gb3ZlcmxhcCAoZS5nLiBhIFwibG9jYWxcIiBjbHVzdGVyIG1heSBjb25uZWN0IHRvIHRoZSBzYW1lIHJlbW90ZSBuZXR3b3Jrc1xuICogYXMgYSBcInRlc3RuZXRcIiBjbHVzdGVyKSwgYnV0IHRoaXMgdHlwZSBuZXZlcnRoZWxlc3Mgc3VwcG9ydHMgY3Jvc3MtcGFja2FnZVxuICogY29vcmRpbmF0aW9uIHdoZXJlIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHN0YXRpYyBsYWJlbHMgYXJlIHN1YmplY3QgdG9cbiAqIGNob2ljZSBvZiBjbHVzdGVyLiBTb21lIGV4YW1wbGVzOlxuICpcbiAqIC0gdGhlIGNoYWluIElEIGZvciBhIHN0YXRpYyBsYWJlbCBsaWtlIFwiQWdvcmljXCIgb3IgXCJFdGhlcmV1bVwiXG4gKiAtIHRoZSBjcnlwdG9ncmFwaGljIGhhc2ggZm9yIGEgc3RhdGljIGxhYmVsIGxpa2UgXCJCTERcIiBvciBcIlVTRENcIlxuICogLSB0aGUgVVJMIGZvciBhIHNlcnZpY2UgbGlrZSBcIkFnb3JpYyBSUENcIiBvciBcIkF4ZWxhclwiIG9yIFwiU3BlY3RydW1cIlxuICpcbiAqIFwibWFpbm5ldFwiIHNob3VsZCBhbHdheXMgaW5jbHVkZSB0aGUgQWdvcmljIG5ldHdvcmsgZGVzY3JpYmVkIGJ5XG4gKiBodHRwczovL21haW4uYWdvcmljLm5ldC9uZXR3b3JrLWNvbmZpZyByYXRoZXIgdGhhbiBzb21lIG90aGVyIGFsdGVybmF0aXZlLlxuICpcbiAqIFhYWCBUaGlzIGFjdHVhbGx5IGJlbG9uZ3Mgc29tZXdoZXJlIGVsc2UsIHBvc3NpYmx5IHdpdGggcmVmYWN0b3JpbmcuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC8xMjE4NSNkaXNjdXNzaW9uX3IyNTAwMTIzMjI2XG4gKlxuICogQHR5cGVkZWYgeydsb2NhbCcgfCAndGVzdG5ldCcgfCAnbWFpbm5ldCd9IENsdXN0ZXJOYW1lXG4gKi9cblxuLyoqXG4gKiBFdmVudCBzb3VyY2UgaWRzIHVzZWQgYnkgdGhlIGJyaWRnZSBkZXZpY2UuXG4gKlxuICogQGVudW0geyh0eXBlb2YgQnJpZGdlSWQpW2tleW9mIHR5cGVvZiBCcmlkZ2VJZF19XG4gKi9cbiAgICAgICBjb25zdCBCcmlkZ2VJZCA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIEJBTks6ICdiYW5rJyxcbiAgQ09SRTogJ2NvcmUnLFxuICBESUJDOiAnZGliYycsXG4gIFNUT1JBR0U6ICdzdG9yYWdlJyxcbiAgUFJPVklTSU9OOiAncHJvdmlzaW9uJyxcbiAgUFJPVklTSU9OX1NNQVJUX1dBTExFVDogJ3Byb3Zpc2lvbldhbGxldCcsXG4gIFZMT0NBTENIQUlOOiAndmxvY2FsY2hhaW4nLFxuICBWVFJBTlNGRVI6ICd2dHJhbnNmZXInLFxuICBXQUxMRVQ6ICd3YWxsZXQnLFxufSk7JGjNj19vbmNlLkJyaWRnZUlkKEJyaWRnZUlkKTtcbmhhcmRlbihCcmlkZ2VJZCk7XG5cbi8qKiBAc2F0aXNmaWVzIHtSZWNvcmQ8c3RyaW5nLCBCcmlkZ2VJZD59ICovXG4gICAgICAgY29uc3QgQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQgPSB7XG4gIHZiYW5rUG9ydDogJ2JhbmsnLFxuICB2aWJjUG9ydDogJ2RpYmMnLFxufTskaM2PX29uY2UuQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQoQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQpO1xuaGFyZGVuKENvc21vc0luaXRLZXlUb0JyaWRnZUlkKTtcblxuICAgICAgIGNvbnN0IFdhbGxldE5hbWUgPSBrZXlNaXJyb3Ioe1xuICBkZXBvc2l0RmFjZXQ6IG51bGwsXG59KTskaM2PX29uY2UuV2FsbGV0TmFtZShXYWxsZXROYW1lKTtcbmhhcmRlbihXYWxsZXROYW1lKTtcblxuLyogZGVmaW5lZCBpbiBnb2xhbmcvY29zbW9zL3gvdmJhbmsqL1xuICAgICAgIGNvbnN0IFZCYW5rQWNjb3VudCA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIHJlc2VydmU6IHtcbiAgICBtb2R1bGU6ICd2YmFuay9yZXNlcnZlJyxcbiAgICBhZGRyZXNzOiAnYWdvcmljMWFlMGxtdHpsZ3JjbmxhOXhqa3BhYXJxNWQ1ZGZlejYzaDNudWNsJyxcbiAgfSxcbiAgcHJvdmlzaW9uOiB7XG4gICAgbW9kdWxlOiAndmJhbmsvcHJvdmlzaW9uJyxcbiAgICBhZGRyZXNzOiAnYWdvcmljMW1lZ3p5dGc2NWN5cmd6czZmdnp4Z3JjcXZ3d2w3dWdwdDYyMzQ2JyxcbiAgfSxcbn0pOyRozY9fb25jZS5WQmFua0FjY291bnQoVkJhbmtBY2NvdW50KTtcbmhhcmRlbihWQmFua0FjY291bnQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJpZGdlSWQiOlsiQnJpZGdlSWQiXSwiQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQiOlsiQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQiXSwiV2FsbGV0TmFtZSI6WyJXYWxsZXROYW1lIl0sIlZCYW5rQWNjb3VudCI6WyJWQmFua0FjY291bnQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjb2mAa4IAACuCAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9kZWJ1Zy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVRyYWNlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAamVzc2llLWNoZWNrKi9cblxuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMTE4NDQqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMTE4NDUqL1xubGV0IGRlYnVnSW5zdGFuY2UgPSAxO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHBhcmFtIHtib29sZWFuIHwgJ3ZlcmJvc2UnfSBlbmFibGVcbiAqL1xuICAgICAgIGNvbnN0IG1ha2VUcmFjZXIgPSAobGFiZWwsIGVuYWJsZSA9IHRydWUpID0+IHtcbiAgY29uc3Qgc3ViID0gKHN1YkxhYmVsLCBzdWJFbmFibGUgPSBlbmFibGUpID0+XG4gICAgbWFrZVRyYWNlcihgJHtsYWJlbH0uJHtzdWJMYWJlbH1gLCBzdWJFbmFibGUpO1xuICBjb25zdCBrZXkgPSBgLS0tLS0gJHtsYWJlbH0sJHtkZWJ1Z0luc3RhbmNlfSBgO1xuICBkZWJ1Z0luc3RhbmNlICs9IDE7XG4gIC8qIHRoZSBjYXNlcyBiZWxvdyBkZWZpbmUgYSBuYW1lZCB2YXJpYWJsZSB0byBwcm92aWRlIGJldHRlciBkZWJ1ZyBpbmZvKi9cbiAgc3dpdGNoIChlbmFibGUpIHtcbiAgICBjYXNlIGZhbHNlOiB7XG4gICAgICBjb25zdCBsb2dEaXNhYmxlZCA9ICguLi5fYXJncykgPT4ge307XG4gICAgICByZXR1cm4gaGFyZGVuKE9iamVjdC5hc3NpZ24obG9nRGlzYWJsZWQsIHsgc3ViIH0pKTtcbiAgICB9XG4gICAgY2FzZSAndmVyYm9zZSc6IHtcbiAgICAgIGNvbnN0IGluZm9UaWNrID0gKG9wdExvZywgLi4uYXJncykgPT4ge1xuICAgICAgICAvKiBYWFggU25pZmYgdGVzdHMgc3VjaCBhcyB0aGlzIGFyZSBpbmhlcmVudGx5IHVucmVsaWFibGUgYW5kIHNtZWxsIGJhZC4qL1xuICAgICAgICAvKiBFdmVuIGFzaWRlIGZyb20gdGhlIHNlY3VyaXR5IGhhemFyZCBvZiovXG4gICAgICAgIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMTE4NDUqL1xuICAgICAgICAvKiBhbiBvYmplY3QgaW50ZW5kZWQgYXMgYSBub3JtYWwgbG9nZ2luZyBhcmd1bWVudCBtYXkgYWNjaWRlbnRhbGx5Ki9cbiAgICAgICAgLyogcGFzcyB0aGlzIHNuaWZmIHRlc3QsIGNhdXNpbmcgY29uZnVzaW9uLiovXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0TG9nPy5sb2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oa2V5LCAuLi5hcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oa2V5LCBvcHRMb2csIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGhhcmRlbihPYmplY3QuYXNzaWduKGluZm9UaWNrLCB7IHN1YiB9KSk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnN0IGRlYnVnVGljayA9IChvcHRMb2csIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgLyogQW5vdGhlciB1bnJlbGlhYmxlIHNuaWZmIHRlc3QgbGlrZSB0aGUgb25lIGFib3ZlKi9cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRMb2c/LmxvZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9wdExvZy5sb2coa2V5LCAuLi5hcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oa2V5LCBvcHRMb2csIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGhhcmRlbihPYmplY3QuYXNzaWduKGRlYnVnVGljaywgeyBzdWIgfSkpO1xuICAgIH1cbiAgfVxufTskaM2PX29uY2UubWFrZVRyYWNlcihtYWtlVHJhY2VyKTtcbmhhcmRlbihtYWtlVHJhY2VyKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgbWFrZVRyYWNlcj59IFRyYWNlTG9nZ2VyXG4gKi9cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFjZXIiOlsibWFrZVRyYWNlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACxk9WOXgMAAF4DAAAlAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2Vycm9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJOb25OdWxsaXNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1QgfCBudWxsIHwgdW5kZWZpbmVkfSB2YWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHtUfVxuICovXG4gICAgICAgY29uc3QgTm9uTnVsbGlzaCA9ICh2YWwsIG9wdERldGFpbHMgPSBgdW5leHBlY3RlZCAke3EodmFsKX1gKSA9PiB7XG4gIGlmICh2YWwgIT0gbnVsbCkge1xuICAgIC8qIFRoaXMgYCE9IG51bGxgIGlkaW9tIGNoZWNrcyB0aGF0IGB2YWxgIGlzIG5laXRoZXIgYG51bGxgIG5vciBgdW5kZWZpbmVkYC4qL1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgYXNzZXJ0LmZhaWwob3B0RGV0YWlscyk7XG59OyRozY9fb25jZS5Ob25OdWxsaXNoKE5vbk51bGxpc2gpO1xuaGFyZGVuKE5vbk51bGxpc2gpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiTm9uTnVsbGlzaCI6WyJOb25OdWxsaXNoIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGgc7Br+BAAA/gQAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9jbGktdXRpbHMuanMiLCIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL2Vycm9ycy5qcyIsIi4vanMtdXRpbHMuanMiLCIuL2tleU1pcnJvci5qcyIsIi4vbWFyc2hhbC9wdXJlLWRhdGEuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vbWV0cmljcy5qcyIsIi4vbmF0dXJhbC1zb3J0LmpzIiwiLi9zZXMtdXRpbHMuanMiLCIuL3RtcERpci5qcyIsIi4vdHlwZUNoZWNrLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6WyIuL2NsaS11dGlscy5qcyIsIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vZXJyb3JzLmpzIiwiLi9qcy11dGlscy5qcyIsIi4va2V5TWlycm9yLmpzIiwiLi9tZXRob2QtdG9vbHMuanMiLCIuL21ldHJpY3MuanMiLCIuL25hdHVyYWwtc29ydC5qcyIsIi4vc2VzLXV0aWxzLmpzIiwiLi90bXBEaXIuanMiLCIuL3R5cGVDaGVjay5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9jbGktdXRpbHMuanNcIiwgW11dLFtcIi4vY29uZmlnLmpzXCIsIFtdXSxbXCIuL2RlYnVnLmpzXCIsIFtdXSxbXCIuL2Vycm9ycy5qc1wiLCBbXV0sW1wiLi9qcy11dGlscy5qc1wiLCBbXV0sW1wiLi9rZXlNaXJyb3IuanNcIiwgW11dLFtcIi4vbWFyc2hhbC9wdXJlLWRhdGEuanNcIiwgW11dLFtcIi4vbWV0aG9kLXRvb2xzLmpzXCIsIFtdXSxbXCIuL21ldHJpY3MuanNcIiwgW11dLFtcIi4vbmF0dXJhbC1zb3J0LmpzXCIsIFtdXSxbXCIuL3Nlcy11dGlscy5qc1wiLCBbXV0sW1wiLi90bXBEaXIuanNcIiwgW11dLFtcIi4vdHlwZUNoZWNrLmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vdHlwZXMtaW5kZXguanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL21hcnNoYWwvcHVyZS1kYXRhLmpzIjpbWyJwdXJlRGF0YU1hcnNoYWxsZXIiLCJwdXJlRGF0YU1hcnNoYWxsZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKrVr42mJQAApiUAACcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvanMtdXRpbHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlRSVUUiLCJkZWVwQ29weUpzb25hYmxlIiwiZGVlcE1hcE9iamVjdCIsImRlZmluZU5hbWUiLCJmcm9tVHlwZWRFbnRyaWVzIiwibG9nTGV2ZWxzIiwibWFrZU1lYXN1cmVTZWNvbmRzIiwib2JqZWN0TWFwTXV0YWJsZSIsInBhcnRpYWxNYXAiLCJwcm92aWRlTGF6eU1hcCIsInR5cGVkRW50cmllcyIsInR5cGVkTWFwIiwidW5wcmVmaXhlZFByb3BlcnRpZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cbi8qIEBqZXNzaWUtY2hlY2sqL1xuLyoqXG4gKiBAZmlsZSBQdXJlIEphdmFTY3JpcHQgdXRpbGl0eSBmdW5jdGlvbnMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGJ1dCBub3RcbiAqICAgZGVwZW5kZW50IHVwb24gYSBoYXJkZW5lZCBlbnZpcm9ubWVudC5cbiAqL1xuXG5jb25zdCB7IGRlZmluZVByb3BlcnR5IH0gPSBPYmplY3Q7XG5cbi8qKiBGb3Igb3ZlcnJpZGluZyBUeXBlU2NyaXB0IGluZmVycmluZyB0aGUgdHlwZSBvZiBgdHJ1ZWAgYXMgYm9vbGVhbi4gKi9cbiAgICAgICBjb25zdCBUUlVFID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHRydWUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8TyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAqICAgb2JqOiBPLFxuICogKSA9PiBFeGNsdWRlPFxuICogICB7IFtLIGluIGtleW9mIE9dOiBLIGV4dGVuZHMgc3RyaW5nID8gW0ssIE9bS11dIDogbmV2ZXIgfVtrZXlvZiBPXSxcbiAqICAgdW5kZWZpbmVkXG4gKiA+W119IFR5cGVkRW50cmllc1xuICovJGjNj19vbmNlLlRSVUUoVFJVRSk7XG4gICAgICAgY29uc3QgdHlwZWRFbnRyaWVzID0gLyoqIEB0eXBlIHtUeXBlZEVudHJpZXN9ICovIChPYmplY3QuZW50cmllcyk7XG5cbi8qKlxuICogQHR5cGVkZWYgezxcbiAqICAgY29uc3QgRW50cmllcyBleHRlbmRzIFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW1Byb3BlcnR5S2V5LCB1bmtub3duXT4sXG4gKiA+KFxuICogICBlbnRyaWVzOiBFbnRyaWVzLFxuICogKSA9PiB7IFtFbnRyeSBpbiBFbnRyaWVzW251bWJlcl0gYXMgRW50cnlbMF1dOiBFbnRyeVsxXSB9fSBGcm9tVHlwZWRFbnRyaWVzXG4gKi8kaM2PX29uY2UudHlwZWRFbnRyaWVzKHR5cGVkRW50cmllcyk7XG4gICAgICAgY29uc3QgZnJvbVR5cGVkRW50cmllcyA9IC8qKiBAdHlwZSB7RnJvbVR5cGVkRW50cmllc30gKi8gKFxuICBPYmplY3QuZnJvbUVudHJpZXNcbik7XG5cbi8qKlxuICogQHR5cGVkZWYgezxBIGV4dGVuZHMgdW5rbm93bltdLCBWPihcbiAqICAgYXJyOiBBLFxuICogICBtYXBwZXI6IDxLIGV4dGVuZHMgbnVtYmVyPihlbDogQVtLXSwgaWR4OiBLLCBhcnI6IEEpID0+IFYsXG4gKiApID0+IFZbXX0gVHlwZWRNYXBcbiAqLyRozY9fb25jZS5mcm9tVHlwZWRFbnRyaWVzKGZyb21UeXBlZEVudHJpZXMpO1xuICAgICAgIGNvbnN0IHR5cGVkTWFwID0gLyoqIEB0eXBlIHtUeXBlZE1hcH0gKi8gKFxuICBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbC5iaW5kKEFycmF5LnByb3RvdHlwZS5tYXApXG4pOyRozY9fb25jZS50eXBlZE1hcCh0eXBlZE1hcCk7XG5cbiAgICAgICBjb25zdCBsb2dMZXZlbHMgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoW1xuICAnZGVidWcnLFxuICAnbG9nJyxcbiAgJ2luZm8nLFxuICAnd2FybicsXG4gICdlcnJvcicsXG5dKTskaM2PX29uY2UubG9nTGV2ZWxzKGxvZ0xldmVscyk7XG5PYmplY3QuZnJlZXplKGxvZ0xldmVscyk7XG5cbi8qKiBAdHlwZWRlZiB7KHR5cGVvZiBsb2dMZXZlbHMpW2tleW9mIGxvZ0xldmVscyAmIG51bWJlcl19IExvZ0xldmVsICovXG5cbi8qKiBAdHlwZWRlZiB7UGljazxDb25zb2xlLCBMb2dMZXZlbD59IExpbWl0ZWRDb25zb2xlICovXG5cbi8qKlxuICogRGVlcC1jb3B5IGEgdmFsdWUgYnkgcm91bmQtdHJpcHBpbmcgaXQgdGhyb3VnaCBKU09OICh3aGljaCBkcm9wc1xuICogZnVuY3Rpb24vc3ltYm9sL3VuZGVmaW5lZCB2YWx1ZXMgYW5kIHByb3BlcnRpZXMgdGhhdCBhcmUgbm9uLWVudW1lcmFibGVcbiAqIGFuZC9vciBzeW1ib2wta2V5ZWQsIGFuZCByZWplY3RzIGJpZ2ludCB2YWx1ZXMpLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBDb3B5SnNvbmFibGUgPSB2YWx1ZSA9PiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+fSBPXG4gKiBAdGVtcGxhdGUge3N0cmluZyAmIGtleW9mIE99IEtcbiAqIEB0ZW1wbGF0ZSBNXG4gKiBAcGFyYW0ge09bS119IHZhbHVlXG4gKiBAcGFyYW0ge0sgfCB1bmRlZmluZWR9IG5hbWVcbiAqIEBwYXJhbSB7TyB8IHVuZGVmaW5lZH0gY29udGFpbmVyXG4gKiBAcGFyYW0geyh2YWx1ZTogT1tLXSwgbmFtZTogc3RyaW5nLCByZWNvcmQ6IE8pID0+IE9bS10gfCBNfSBtYXBwZXJcbiAqIEByZXR1cm5zIHtPW0tdIHwgTSB8IHsgW0syIGluIGtleW9mIE9bS11dOiBPW0tdW0syXSB8IE0gfX1cbiAqLyRozY9fb25jZS5kZWVwQ29weUpzb25hYmxlKGRlZXBDb3B5SnNvbmFibGUpO1xuY29uc3QgZGVlcE1hcE9iamVjdEludGVybmFsID0gKHZhbHVlLCBuYW1lLCBjb250YWluZXIsIG1hcHBlcikgPT4ge1xuICBpZiAoY29udGFpbmVyICYmIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IG1hcHBlZCA9IG1hcHBlcih2YWx1ZSwgbmFtZSwgY29udGFpbmVyKTtcbiAgICBpZiAobWFwcGVkICE9PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG1hcHBlZDtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCAhdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBsZXQgd2FzTWFwcGVkID0gZmFsc2U7XG4gIGNvbnN0IHZhbHVlT2JqID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKTtcbiAgLyoqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyB0eXBlb2YgdmFsdWUsIEsyIGV4dGVuZHMgc3RyaW5nICYga2V5b2YgVD4oXG4gKiAgIGVudHJ5OiBbSzIsIFRbSzJdXSxcbiAqICkgPT4gW0syLCBUW0syXSB8IE1dfVxuICovXG4gIGNvbnN0IG1hcEVudHJ5ID0gKFtpbm5lck5hbWUsIGlubmVyVmFsdWVdKSA9PiB7XG4gICAgY29uc3QgbWFwcGVkSW5uZXJWYWx1ZSA9IGRlZXBNYXBPYmplY3RJbnRlcm5hbChcbiAgICAgIGlubmVyVmFsdWUsXG4gICAgICBpbm5lck5hbWUsXG4gICAgICB2YWx1ZU9iaixcbiAgICAgIG1hcHBlcixcbiAgICApO1xuICAgIHdhc01hcHBlZCB8fD0gbWFwcGVkSW5uZXJWYWx1ZSAhPT0gaW5uZXJWYWx1ZTtcbiAgICByZXR1cm4gW2lubmVyTmFtZSwgLyoqIEB0eXBlIHthbnl9ICovIChtYXBwZWRJbm5lclZhbHVlKV07XG4gIH07XG4gIGNvbnN0IG1hcHBlZEVudHJpZXMgPSB0eXBlZEVudHJpZXModmFsdWVPYmopLm1hcChtYXBFbnRyeSk7XG5cbiAgaWYgKCF3YXNNYXBwZWQpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBjb25zdCBtYXBwZWRPYmogPSBmcm9tVHlwZWRFbnRyaWVzKG1hcHBlZEVudHJpZXMpO1xuICByZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovIChtYXBwZWRPYmopO1xufTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSB0cmF2ZXJzZXMgYSByZWNvcmQgb2JqZWN0IHN0cnVjdHVyZSwgY2FsbGluZyBhIG1hcHBlciBmdW5jdGlvblxuICogZm9yIGVhY2ggZW51bWVyYWJsZSBzdHJpbmcta2V5ZWQgcHJvcGVydHkgYW5kIHJldHVybmluZyBhIHJlY29yZCBjb21wb3NlZCBvZlxuICogdGhlIHJlc3VsdHMuIElmIG5vbmUgb2YgdGhlIHZhbHVlcyBhcmUgY2hhbmdlZCwgdGhlIG9yaWdpbmFsIG9iamVjdCBpc1xuICogcmV0dXJuZWQsIG1haW50YWluaW5nIGl0cyBpZGVudGl0eS5cbiAqXG4gKiBXaGVuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBhbiBvYmplY3QsIGl0IGlzIHNlbnQgdG8gdGhlIG1hcHBlciBsaWtlIGFueSBvdGhlclxuICogdmFsdWUsIGFuZCB0aGVuIHJlY3Vyc2l2ZWx5IHRyYXZlcnNlZCB1bmxlc3MgcmVwbGFjZWQgd2l0aCBhIGRpc3RpbmN0IHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IE9cbiAqIEB0ZW1wbGF0ZSBNXG4gKiBAcGFyYW0ge099IG9ialxuICogQHBhcmFtIHs8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBLIGV4dGVuZHMgc3RyaW5nICYga2V5b2YgVD4oXG4gKiAgIHZhbHVlOiBUW0tdLFxuICogICBuYW1lOiBLLFxuICogICByZWNvcmQ6IFQsXG4gKiApID0+IFRbS10gfCBNfSBtYXBwZXJcbiAqIEByZXR1cm5zIHtPIHwgeyBbSyBpbiBrZXlvZiBPXTogSyBleHRlbmRzIHN0cmluZyA/IE9bS10gfCBNIDogbmV2ZXIgfX1cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBNYXBPYmplY3QgPSAob2JqLCBtYXBwZXIpID0+XG4gIC8qKiBAdHlwZSB7YW55fSAqLyAoZGVlcE1hcE9iamVjdEludGVybmFsKG9iaiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG1hcHBlcikpO1xuXG4vKipcbiAqIEV4cGxpY2l0bHkgc2V0IGEgZnVuY3Rpb24ncyBuYW1lLCBzdXBwb3J0aW5nIHVzZSBvZiBhcnJvdyBmdW5jdGlvbnMgZm9yIHdoaWNoXG4gKiBzb3VyY2UgdGV4dCBkb2Vzbid0IGluY2x1ZGUgYSBuYW1lIGFuZCBubyBpbml0aWFsIG5hbWUgaXMgc2V0IGJ5XG4gKiBOYW1lZEV2YWx1YXRpb25cbiAqIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyL211bHRpcGFnZS9zeW50YXgtZGlyZWN0ZWQtb3BlcmF0aW9ucy5odG1sI3NlYy1ydW50aW1lLXNlbWFudGljcy1uYW1lZGV2YWx1YXRpb25cbiAqXG4gKiBgbmFtZWAgaXMgdGhlIGZpcnN0IHBhcmFtZXRlciBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5IGF0IGNhbGwgc2l0ZXMgKGUuZy4sXG4gKiBgcmV0dXJuIGRlZmluZU5hbWUoJ2ZvbycsICgpID0+IHsgLi4uIH0pYCkuXG4gKlxuICogQHRlbXBsYXRlIHtGdW5jdGlvbn0gRlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Rn0gZm5cbiAqIEByZXR1cm5zIHtGfVxuICovJGjNj19vbmNlLmRlZXBNYXBPYmplY3QoZGVlcE1hcE9iamVjdCk7XG4gICAgICAgY29uc3QgZGVmaW5lTmFtZSA9IChuYW1lLCBmbikgPT5cbiAgZGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywgeyB2YWx1ZTogbmFtZSB9KTtcblxuLyoqXG4gKiBCeSBhbmFsb2d5IHdpdGggaG93IGBBcnJheS5wcm90b3R5cGUubWFwYCB3aWxsIG1hcCB0aGUgZWxlbWVudHMgb2YgYW4gYXJyYXlcbiAqIHRvIHRyYW5zZm9ybWVkIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNoYXBlLCBgb2JqZWN0TWFwTXV0YWJsZWBcbiAqIHdpbGwgZG8gbGlrZXdpc2UgZm9yIHRoZSBlbnVtZXJhYmxlIHN0cmluZy1rZXllZCBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBVbmxpa2UgZW5kbydzIGBvYmplY3RNYXBgLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBub24taGFyZGVuZWQgb2JqZWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IE9cbiAqIEB0ZW1wbGF0ZSBNXG4gKiBAcGFyYW0ge099IG9ialxuICogQHBhcmFtIHs8SyBleHRlbmRzIGtleW9mIE8+KHZhbHVlOiBPW0tdLCBrZXk6IEspID0+IE19IG1hcHBlclxuICogQHJldHVybnMge3sgW0sgaW4ga2V5b2YgT106IEsgZXh0ZW5kcyBzdHJpbmcgPyBNIDogbmV2ZXIgfX1cbiAqLyRozY9fb25jZS5kZWZpbmVOYW1lKGRlZmluZU5hbWUpO1xuICAgICAgIGNvbnN0IG9iamVjdE1hcE11dGFibGUgPSAob2JqLCBtYXBwZXIpID0+IHtcbiAgY29uc3Qgb2xkRW50cmllcyA9IHR5cGVkRW50cmllcyhvYmopO1xuICAvKiogQHR5cGUgezxLIGV4dGVuZHMga2V5b2YgTz4oZW50cnk6IFtLLCBPW0tdXSkgPT4gW0ssIE1dfSAqL1xuICBjb25zdCBtYXBFbnRyeSA9IChbaywgdl0pID0+IFtrLCBtYXBwZXIodiwgayldO1xuICBjb25zdCBuZXdFbnRyaWVzID0gdHlwZWRNYXAob2xkRW50cmllcywgbWFwRW50cnkpO1xuICBjb25zdCBuZXdPYmogPSBmcm9tVHlwZWRFbnRyaWVzKG5ld0VudHJpZXMpO1xuICByZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovIChuZXdPYmopO1xufTtcblxuLyoqXG4gKiBNYXAgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5IHRvIG5ldyB2YWx1ZXMsIHNraXBwaW5nIGVsZW1lbnRzIGZvciB3aGljaCB0aGVcbiAqIG1hcHBpbmcgcmVzdWx0cyBpbiBlaXRoZXIgYHVuZGVmaW5lZGAgb3IgYGZhbHNlYC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFVcbiAqIEBwYXJhbSB7VFtdfSBhcnJcbiAqIEBwYXJhbSB7KHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnI6IFRbXSkgPT4gVSB8IHVuZGVmaW5lZCB8IGZhbHNlfSBtYXBPckRyb3BcbiAqIEByZXR1cm5zIHtVW119XG4gKi8kaM2PX29uY2Uub2JqZWN0TWFwTXV0YWJsZShvYmplY3RNYXBNdXRhYmxlKTtcbiAgICAgICBjb25zdCBwYXJ0aWFsTWFwID0gKGFyciwgbWFwT3JEcm9wKSA9PlxuICBhcnIucmVkdWNlKChyZXN1bHRzLCBlbCwgaSwgYXJyQXJnKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gbWFwT3JEcm9wKGVsLCBpLCBhcnJBcmcpO1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH0sIC8qKiBAdHlwZSB7VVtdfSAqLyAoW10pKTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHZhbHVlIGZyb20gYG1hcGAgYXNzb2NpYXRlZCB3aXRoIGBrZXlgLiBJZiB0aGVyZSBpcyBub3QgeWV0IHN1Y2ggYVxuICogdmFsdWUsIGdldCBvbmUgZnJvbSBgbWFrZVZhbHVlKGtleSlgIGFuZCB1cGRhdGUgYG1hcGAgYmVmb3JlIHJldHVybmluZyB0aGVcbiAqIG5ldyB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7W0tdIGV4dGVuZHMgW1dlYWtLZXldID8gV2Vha01hcDxLLCBWPiA6IE1hcDxLLCBWPn0gbWFwXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBWfSBtYWtlVmFsdWVcbiAqIEByZXR1cm5zIHtWfVxuICovJGjNj19vbmNlLnBhcnRpYWxNYXAocGFydGlhbE1hcCk7XG4gICAgICAgY29uc3QgcHJvdmlkZUxhenlNYXAgPSAobWFwLCBrZXksIG1ha2VWYWx1ZSkgPT4ge1xuICBjb25zdCBmb3VuZCA9IG1hcC5nZXQoa2V5KTtcbiAgaWYgKGZvdW5kICE9PSB1bmRlZmluZWQgfHwgbWFwLmhhcyhrZXkpKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7Vn0gKi8gKGZvdW5kKTtcbiAgfVxuICBjb25zdCB2YWx1ZSA9IG1ha2VWYWx1ZShrZXkpO1xuICBtYXAuc2V0KGtleSwgdmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHVzZXMgYSBtaWxsaXNlY29uZC1iYXNlZCBjdXJyZW50LXRpbWUgY2FwYWJpbGl0eVxuICogKHN1Y2ggYXMgYHBlcmZvcm1hbmNlLm5vd2ApIHRvIG1lYXN1cmUgZXhlY3V0aW9uIGR1cmF0aW9uIG9mIGFuIGFzeW5jXG4gKiBmdW5jdGlvbiBhbmQgcmVwb3J0IHRoZSByZXN1bHQgaW4gc2Vjb25kcyB0byBtYXRjaCBvdXIgdGVsZW1ldHJ5IHN0YW5kYXJkLlxuICpcbiAqIEBwYXJhbSB7KCkgPT4gbnVtYmVyfSBjdXJyZW50VGltZU1pbGxpc2VjXG4gKi8kaM2PX29uY2UucHJvdmlkZUxhenlNYXAocHJvdmlkZUxhenlNYXApO1xuICAgICAgIGNvbnN0IG1ha2VNZWFzdXJlU2Vjb25kcyA9IGN1cnJlbnRUaW1lTWlsbGlzZWMgPT4ge1xuICAvKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGZuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7IHJlc3VsdDogVDsgZHVyYXRpb246IG51bWJlciB9Pn1cbiAqL1xuICBjb25zdCBtZWFzdXJlU2Vjb25kcyA9IGFzeW5jIGZuID0+IHtcbiAgICBjb25zdCB0MCA9IGN1cnJlbnRUaW1lTWlsbGlzZWMoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbigpO1xuICAgIGNvbnN0IGR1cmF0aW9uTWlsbGlzZWMgPSBjdXJyZW50VGltZU1pbGxpc2VjKCkgLSB0MDtcbiAgICByZXR1cm4geyByZXN1bHQsIGR1cmF0aW9uOiBkdXJhdGlvbk1pbGxpc2VjIC8gMTAwMCB9O1xuICB9O1xuICByZXR1cm4gbWVhc3VyZVNlY29uZHM7XG59O1xuXG4vKipcbiAqIEZpbmQgYWxsIG9mIGFuIG9iamVjdCdzIHByb3BlcnRpZXMgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBhIHByZWZpeCwgYW5kXG4gKiByZXR1cm4gYSBuZXcgb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhvc2UgcHJvcGVydGllcyB3aXRob3V0IHRoYXQgcHJlZml4LlxuICogVXNlZnVsIGZvciBmaWx0ZXJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGV2YW50IHRvIGEgcGFydGljdWxhciBwdXJwb3NlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBQXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7UmVjb3JkPGAke1B9JHtLfWAsIFY+fSBvYmpcbiAqIEBwYXJhbSB7UH0gcHJlZml4XG4gKi8kaM2PX29uY2UubWFrZU1lYXN1cmVTZWNvbmRzKG1ha2VNZWFzdXJlU2Vjb25kcyk7XG4gICAgICAgY29uc3QgdW5wcmVmaXhlZFByb3BlcnRpZXMgPSAob2JqLCBwcmVmaXgpID0+XG4gIC8qKiBAdHlwZSB7UmVjb3JkPEssIFY+fSAqLyAoXG4gICAgZnJvbVR5cGVkRW50cmllcyhcbiAgICAgIHR5cGVkRW50cmllcyhvYmopXG4gICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiBrZXkuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCksIHZhbHVlXSksXG4gICAgKVxuICApOyRozY9fb25jZS51bnByZWZpeGVkUHJvcGVydGllcyh1bnByZWZpeGVkUHJvcGVydGllcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUUlVFIjpbIlRSVUUiXSwidHlwZWRFbnRyaWVzIjpbInR5cGVkRW50cmllcyJdLCJmcm9tVHlwZWRFbnRyaWVzIjpbImZyb21UeXBlZEVudHJpZXMiXSwidHlwZWRNYXAiOlsidHlwZWRNYXAiXSwibG9nTGV2ZWxzIjpbImxvZ0xldmVscyJdLCJkZWVwQ29weUpzb25hYmxlIjpbImRlZXBDb3B5SnNvbmFibGUiXSwiZGVlcE1hcE9iamVjdCI6WyJkZWVwTWFwT2JqZWN0Il0sImRlZmluZU5hbWUiOlsiZGVmaW5lTmFtZSJdLCJvYmplY3RNYXBNdXRhYmxlIjpbIm9iamVjdE1hcE11dGFibGUiXSwicGFydGlhbE1hcCI6WyJwYXJ0aWFsTWFwIl0sInByb3ZpZGVMYXp5TWFwIjpbInByb3ZpZGVMYXp5TWFwIl0sIm1ha2VNZWFzdXJlU2Vjb25kcyI6WyJtYWtlTWVhc3VyZVNlY29uZHMiXSwidW5wcmVmaXhlZFByb3BlcnRpZXMiOlsidW5wcmVmaXhlZFByb3BlcnRpZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAIvVS1awHAACsBwAAKAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9rZXlNaXJyb3IuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImtleU1pcnJvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuXG5jb25zdCB7IGZyZWV6ZSwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4gJiBSZWNvcmQ8RXhjbHVkZTxQcm9wZXJ0eUtleSwgc3RyaW5nPiwgbmV2ZXI+fSBJbml0XG4gKiBAdHlwZWRlZiB7eyByZWFkb25seSBbSyBpbiBrZXlvZiBJbml0XTogSyB9fSBLZXlNaXJyb3JSZXN1bHRcbiAqL1xuXG4vKipcbiAqIE1pcnJvciB0aGUga2V5cyBvZiBhbiBvYmplY3QgdG8gc3RyaW5nIHZhbHVlcyB0aGF0IG1hdGNoIHRoZSBrZXkgbmFtZXMuIFRoaXNcbiAqIHdvcmtzIHdlbGwgdG8gZGVmaW5lIGEgVHlwZVNjcmlwdCBlbnVtIHR5cGUgY29tcGF0aWJsZSB3aXRoIGVyYXNhYmxlIHN5bnRheDpcbiAqXG4gKiAgICBgQGVudW0geyh0eXBlb2YgTXlFbnVtKVtrZXlvZiB0eXBlb2YgTXlFbnVtXX1gXG4gKlxuICogVGhlIHByb3ZpZGVkIHJlY29yZCBtdXN0IG9ubHkgbWFwIHByb3BlcnR5IG5hbWVzIHRvIGVpdGhlciBgbnVsbGAgb3IgdGhlXG4gKiBwcm9wZXJ0eSBuYW1lIGl0c2VsZi4gVGhlIHJldHVybmVkIG9iamVjdCBoYXMgaWRlbnRpY2FsIGtleXMgd2hvc2UgdmFsdWVzIGFyZVxuICogdGhlIHN0cmluZyBmb3JtIG9mIHRoZSBrZXkuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPiAmIFJlY29yZDxFeGNsdWRlPFByb3BlcnR5S2V5LCBzdHJpbmc+LCBuZXZlcj59IEluaXRcbiAqIEBwYXJhbSB7SW5pdCAmIHsgcmVhZG9ubHkgW0sgaW4ga2V5b2YgSW5pdF06IEluaXRbS10gZXh0ZW5kcyBudWxsID8gbnVsbCA6IEsgfX0gcmVjb3JkXG4gKiBAcmV0dXJucyB7S2V5TWlycm9yUmVzdWx0PEluaXQ+fVxuICovXG4gICAgICAgY29uc3Qga2V5TWlycm9yID0gcmVjb3JkID0+IHtcbiAgaWYgKHJlY29yZCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVjb3JkICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IFR5cGVFcnJvcigna2V5TWlycm9yIGV4cGVjdHMgYSByZWNvcmQgb2Ygc3RyaW5nIGtleXMuJyk7XG4gIH1cblxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IG1pcnJvcmVkID0ge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgUmVjb3JkIGNvbmZ1c2VkIGJ5IG51bGwgcHJvdG90eXBlKi9cbiAgICBfX3Byb3RvX186IG51bGwsXG4gIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMocmVjb3JkKSkge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0ga2V5KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgICAgIGBWYWx1ZSBmb3Iga2V5IFwiJHtrZXl9XCIgbXVzdCBiZSBudWxsIG9yIHRoZSBrZXkgc3RyaW5nOyBnb3QgJHtTdHJpbmcodmFsdWUpfS5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgbWlycm9yZWRba2V5XSA9IGtleTtcbiAgfVxuICByZXR1cm4gLyoqIEB0eXBlIHtLZXlNaXJyb3JSZXN1bHQ8SW5pdD59ICovIChmcmVlemUobWlycm9yZWQpKTtcbn07JGjNj19vbmNlLmtleU1pcnJvcihrZXlNaXJyb3IpO1xuXG5mcmVlemUoa2V5TWlycm9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImtleU1pcnJvciI6WyJrZXlNaXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApWwe9FUtAABVLQAALwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL3BhdHRlcm5zIiwiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qcyIsIi4vY2FsbGJhY2suanMiXSwiZXhwb3J0cyI6WyJTdHJlYW1DZWxsU2hhcGUiLCJhc3NlcnRQYXRoU2VnbWVudCIsImlzU3RyZWFtQ2VsbCIsIm1ha2VDaGFpblN0b3JhZ2VSb290IiwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSIsIm1ha2VTdG9yYWdlTm9kZUNoaWxkIiwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEUsRmFyLE0sbWFrZUhlYXBab25lLGNiOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qc1wiLCBbW1wibWFrZUhlYXBab25lXCIsWyRozY9fYSA9PiAobWFrZUhlYXBab25lID0gJGjNj19hKV1dXV0sW1wiLi9jYWxsYmFjay5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKGNiID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZUNoYWluU3RvcmFnZVJvb3QsJ25hbWUnLHt2YWx1ZTpcIm1ha2VDaGFpblN0b3JhZ2VSb290XCJ9KTskaM2PX29uY2UubWFrZUNoYWluU3RvcmFnZVJvb3QobWFrZUNoYWluU3RvcmFnZVJvb3QpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlU3RvcmFnZU5vZGVDaGlsZCwnbmFtZScse3ZhbHVlOlwibWFrZVN0b3JhZ2VOb2RlQ2hpbGRcIn0pOyRozY9fb25jZS5tYWtlU3RvcmFnZU5vZGVDaGlsZChtYWtlU3RvcmFnZU5vZGVDaGlsZCk7XG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge01hcnNoYWwsIFBhc3NhYmxlfSBmcm9tICdAZW5kby9tYXJzaGFsJztcbiAqIEBpbXBvcnQge1JlbW90ZSwgRVJlbW90ZSwgVHlwZWRQYXR0ZXJufSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0VNYXJzaGFsbGVyfSBmcm9tICcuL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzJztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqIEBpbXBvcnQge0NhbGxiYWNrfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKiogQHR5cGVkZWYge01hcnNoYWw8dW5rbm93bj59IE1hcnNoYWxsZXIgKi9cbi8qKiBAdHlwZWRlZiB7UGljazxNYXJzaGFsbGVyLCAnZnJvbUNhcERhdGEnPn0gVW5zZXJpYWxpemVyICovXG5cbi8qKlxuICogRGVmaW5lZCBieSB2c3RvcmFnZVN0b3JlS2V5IGluIHZzdG9yYWdlLmdvXG4gKlxuICogQHR5cGVkZWYgVlN0b3JhZ2VLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZVN1YmtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRhdGFQcmVmaXhCeXRlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub0RhdGFWYWx1ZV1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHR5cGVkZWYgU3RyZWFtQ2VsbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJsb2NrSGVpZ2h0IGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgd3JpdGUgb2YgYHZhbHVlc2BcbiAqICAgKGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgYSBuYXR1cmFsIG51bWJlcilcbiAqIEBwcm9wZXJ0eSB7VFtdfSB2YWx1ZXNcbiAqL1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxTdHJlYW1DZWxsPn0gKi9cbiAgICAgICBjb25zdCBTdHJlYW1DZWxsU2hhcGUgPSBoYXJkZW4oe1xuICBibG9ja0hlaWdodDogTS5zdHJpbmcoKSxcbiAgdmFsdWVzOiBNLmFycmF5KCksXG59KTtcblxuLyoqXG4gKiBUaGlzIHJlcHJlc2VudHMgYSBub2RlIGluIGFuIElBVkwgdHJlZS5cbiAqXG4gKiBUaGUgYWN0aXZlIGltcGxlbWVudGF0aW9uIGlzIHgvdnN0b3JhZ2UsIGFuIEFnb3JpYyBleHRlbnNpb24gb2YgdGhlIENvc21vc1xuICogU0RLLlxuICpcbiAqIFZzdG9yYWdlIGlzIGEgaGllcmFyY2hpY2FsIGV4dGVybmFsbHktcmVhY2hhYmxlIHN0b3JhZ2Ugc3RydWN0dXJlIHRoYXRcbiAqIGlkZW50aWZpZXMgY2hpbGRyZW4gYnkgcmVzdHJpY3RlZCBBU0NJSSBuYW1lIGFuZCBpcyBhc3NvY2lhdGVkIHdpdGggYXJiaXRyYXJ5XG4gKiBzdHJpbmctdmFsdWVkIGRhdGEgZm9yIGVhY2ggbm9kZSwgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JhZ2VOb2RlXG4gKiBAcHJvcGVydHkgeyhkYXRhOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD59IHNldFZhbHVlIHB1Ymxpc2hlcyBzb21lIGRhdGFcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzXG4gKiAgIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8VlN0b3JhZ2VLZXk+fSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgc3ViUGF0aDogc3RyaW5nLFxuICogICBvcHRpb25zPzogeyBzZXF1ZW5jZT86IGJvb2xlYW4gfSxcbiAqICkgPT4gU3RvcmFnZU5vZGV9IG1ha2VDaGlsZE5vZGVcbiAqLyRozY9fb25jZS5TdHJlYW1DZWxsU2hhcGUoU3RyZWFtQ2VsbFNoYXBlKTtcblxuY29uc3QgQ2hhaW5TdG9yYWdlTm9kZUkgPSBNLmludGVyZmFjZSgnU3RvcmFnZU5vZGUnLCB7XG4gIHNldFZhbHVlOiBNLmNhbGxXaGVuKE0uc3RyaW5nKCkpLnJldHVybnMoKSxcbiAgZ2V0UGF0aDogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgZ2V0U3RvcmVLZXk6IE0uY2FsbFdoZW4oKS5yZXR1cm5zKE0ucmVjb3JkKCkpLFxuICBtYWtlQ2hpbGROb2RlOiBNLmNhbGwoTS5zdHJpbmcoKSlcbiAgICAub3B0aW9uYWwoTS5zcGxpdFJlY29yZCh7fSwgeyBzZXF1ZW5jZTogTS5ib29sZWFuKCkgfSwge30pKVxuICAgIC5yZXR1cm5zKE0ucmVtb3RhYmxlKCdTdG9yYWdlTm9kZScpKSxcbn0pO1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wZXJmZWN0IGhldXJpc3RpYyB0byBuYXZpZ2F0ZSB0aGUgbWlncmF0aW9uIGZyb20gdmFsdWUgY2VsbHMgdG9cbiAqIHN0cmVhbSBjZWxscy4gQXQgdGltZSBvZiB3cml0aW5nLCBubyBsZWdhY3kgY2VsbHMgaGF2ZSB0aGUgc2FtZSBzaGFwZSBhcyBhXG4gKiBzdHJlYW0gY2VsbCwgYW5kIHdlIGRvIG5vdCBpbnRlbmQgdG8gY3JlYXRlIGFueSBtb3JlIGxlZ2FjeSB2YWx1ZSBjZWxscy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gY2VsbFxuICogQHJldHVybnMge2NlbGwgaXMgU3RyZWFtQ2VsbH1cbiAqL1xuICAgICAgIGNvbnN0IGlzU3RyZWFtQ2VsbCA9IGNlbGwgPT5cbiAgY2VsbCAmJlxuICB0eXBlb2YgY2VsbCA9PT0gJ29iamVjdCcgJiZcbiAgQXJyYXkuaXNBcnJheShjZWxsLnZhbHVlcykgJiZcbiAgdHlwZW9mIGNlbGwuYmxvY2tIZWlnaHQgPT09ICdzdHJpbmcnICYmXG4gIC9eMCR8XlsxLTldWzAtOV0qJC8udGVzdChjZWxsLmJsb2NrSGVpZ2h0KTskaM2PX29uY2UuaXNTdHJlYW1DZWxsKGlzU3RyZWFtQ2VsbCk7XG5oYXJkZW4oaXNTdHJlYW1DZWxsKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHN0cmluZz59IGdldFBhdGggdGhlIGNoYWluIHN0b3JhZ2UgcGF0aCBhdCB3aGljaCB0aGVcbiAqICAgbm9kZSB3YXMgY29uc3RydWN0ZWRcbiAqIEBwcm9wZXJ0eSB7U3RvcmFnZU5vZGVbJ2dldFN0b3JlS2V5J119IGdldFN0b3JlS2V5IERFUFJFQ0FURUQgdXNlIGdldFBhdGhcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVW5zZXJpYWxpemVyfSBnZXRVbnNlcmlhbGl6ZXIgZ2V0IHRoZSB1bnNlcmlhbGl6ZXIgZm9yIHRoZVxuICogICBzdG9yZWQgZGF0YVxuICovXG5cbi8qIFRPRE86IEZvcm1hbGl6ZSBzZWdtZW50IGNvbnN0cmFpbnRzLiovXG4vKiBNdXN0IGJlIG5vbmVtcHR5IGFuZCBkaXNhbGxvdyAodW5lc2NhcGVkKSBgLmAsIGFuZCBmb3Igc2ltcGxpY2l0eSovXG4vKiAoYW5kIGZ1dHVyZSBwb3NzaWJpbGl0eSBvZiBlLmcuIGVzY2FwaW5nKSB3ZSBjdXJyZW50bHkgbGltaXQgdG8qL1xuLyogQVNDSUkgYWxwaGFudW1lcmljIHBsdXMgdW5kZXJzY29yZSBhbmQgZGFzaC4qL1xuLyogU2hvdWxkIHJlbWFpbiBjb25zaXN0ZW50IHdpdGggZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3R5cGVzL3BhdGhfa2V5cy5nbyovXG5jb25zdCBwYXRoU2VnbWVudFBhdHRlcm4gPSAvXlthLXpBLVowLTlfLV17MSwxMDB9JC87XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZykgPT4gdm9pZH0gKi9cbiAgICAgICBjb25zdCBhc3NlcnRQYXRoU2VnbWVudCA9IG5hbWUgPT4ge1xuICBwYXRoU2VnbWVudFBhdHRlcm4udGVzdChuYW1lKSB8fFxuICAgIEZhaWxgUGF0aCBzZWdtZW50IG5hbWVzIG11c3QgY29uc2lzdCBvZiAxIHRvIDEwMCBjaGFyYWN0ZXJzIGxpbWl0ZWQgdG8gQVNDSUkgYWxwaGFudW1lcmljcywgdW5kZXJzY29yZXMsIGFuZC9vciBkYXNoZXM6ICR7bmFtZX1gO1xufTskaM2PX29uY2UuYXNzZXJ0UGF0aFNlZ21lbnQoYXNzZXJ0UGF0aFNlZ21lbnQpO1xuaGFyZGVuKGFzc2VydFBhdGhTZWdtZW50KTtcblxuLyoqXG4gKiBNdXN0IG1hdGNoIHRoZSBzd2l0Y2ggaW4gdnN0b3JhZ2UuZ28gdXNpbmcgYHZzdG9yYWdlTWVzc2FnZWAgdHlwZVxuICpcbiAqIEB0eXBlZGVmIHsnZ2V0J1xuICogICB8ICdnZXRTdG9yZUtleSdcbiAqICAgfCAnaGFzJ1xuICogICB8ICdjaGlsZHJlbidcbiAqICAgfCAnZW50cmllcydcbiAqICAgfCAndmFsdWVzJ1xuICogICB8ICdzaXplJ30gU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VNZXRob2RcbiAqXG4gKlxuICogQHR5cGVkZWYgeydzZXQnIHwgJ3NldFdpdGhvdXROb3RpZnknIHwgJ2FwcGVuZCd9IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZFxuICpcbiAqXG4gKiBAdHlwZWRlZiB7U3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VNZXRob2RcbiAqICAgfCBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2R9IFN0b3JhZ2VNZXNzYWdlTWV0aG9kXG4gKlxuICpcbiAqIEB0eXBlZGVmIHtbcGF0aDogc3RyaW5nXX0gU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VBcmdzXG4gKlxuICogQHR5cGVkZWYge1twYXRoOiBzdHJpbmcsIHZhbHVlPzogc3RyaW5nIHwgbnVsbF19IFN0b3JhZ2VFbnRyeVxuICpcbiAqIEB0eXBlZGVmIHtTdG9yYWdlRW50cnlbXX0gU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlQXJnc1xuICpcbiAqIEB0eXBlZGVmIHt7XG4gKiAgICAgICBtZXRob2Q6IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kO1xuICogICAgICAgYXJnczogU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VBcmdzO1xuICogICAgIH1cbiAqICAgfCB7XG4gKiAgICAgICBtZXRob2Q6IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZDtcbiAqICAgICAgIGFyZ3M6IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZUFyZ3M7XG4gKiAgICAgfX0gU3RvcmFnZU1lc3NhZ2VcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7Wm9uZX0gem9uZVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUNoYWluU3RvcmFnZU5vZGUgPSB6b25lID0+IHtcbiAgLyoqXG4gKiBDcmVhdGUgYSBzdG9yYWdlIG5vZGUgZm9yIGEgZ2l2ZW4gYmFja2luZyBzdG9yYWdlIGludGVyZmFjZSBhbmQgcGF0aC5cbiAqXG4gKiBAcGFyYW0ge0NhbGxiYWNrPChtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55Pn0gbWVzc2VuZ2VyIGEgY2FsbGJhY2tcbiAqICAgZm9yIHNlbmRpbmcgYSBzdG9yYWdlTWVzc2FnZSBvYmplY3QgdG8gdGhlIHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gKGNmLlxuICogICBnb2xhbmcvY29zbW9zL3gvdnN0b3JhZ2UvdnN0b3JhZ2UuZ28pXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW5jZV0gc2V0IHZhbHVlcyB3aXRoIGBhcHBlbmRgIG1lc3NhZ2VzXG4gKiAgIHJhdGhlciB0aGFuIGBzZXRgIG1lc3NhZ2VzIHNvIHRoZSBiYWNraW5nIGltcGxlbWVudGF0aW9uIGVtcGxveXMgYVxuICogICB3cmFwcGluZyBzdHJ1Y3R1cmUgdGhhdCBwcmVzZXJ2ZXMgZWFjaCB2YWx1ZSBzZXQgd2l0aGluIGEgc2luZ2xlIGJsb2NrLlxuICogICBDaGlsZCBub2RlcyBkZWZhdWx0IHRvIGluaGVyaXRpbmcgdGhpcyBvcHRpb24gZnJvbSB0aGVpciBwYXJlbnQuXG4gKiBAcmV0dXJucyB7U3RvcmFnZU5vZGV9XG4gKi9cbiAgY29uc3QgbWFrZUNoYWluU3RvcmFnZU5vZGUgPSB6b25lLmV4b0NsYXNzKFxuICAgICdDaGFpblN0b3JhZ2VOb2RlJyxcbiAgICBDaGFpblN0b3JhZ2VOb2RlSSxcbiAgICAvKipcbiAqIEBwYXJhbSB7Q2FsbGJhY2s8KG1lc3NhZ2U6IFN0b3JhZ2VNZXNzYWdlKSA9PiBhbnk+fSBtZXNzZW5nZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNlcXVlbmNlXVxuICovXG4gICAgKG1lc3NlbmdlciwgcGF0aCwgeyBzZXF1ZW5jZSA9IGZhbHNlIH0gPSB7fSkgPT4ge1xuICAgICAgYXNzZXJ0LnR5cGVvZihwYXRoLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQudHlwZW9mKHNlcXVlbmNlLCAnYm9vbGVhbicpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IHBhdGgsIG1lc3Nlbmdlciwgc2VxdWVuY2UgfSk7XG4gICAgfSxcbiAgICB7XG4gICAgICBnZXRQYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5wYXRoO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGdldFBhdGhcbiAqIEB0eXBlIHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn1cbiAqL1xuICAgICAgYXN5bmMgZ2V0U3RvcmVLZXkoKSB7XG4gICAgICAgIGNvbnN0IHsgcGF0aCwgbWVzc2VuZ2VyIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICByZXR1cm4gY2IuY2FsbEUobWVzc2VuZ2VyLCB7XG4gICAgICAgICAgbWV0aG9kOiAnZ2V0U3RvcmVLZXknLFxuICAgICAgICAgIGFyZ3M6IFtwYXRoXSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLyoqXG4gKiBAdHlwZSB7KFxuICogICBuYW1lOiBzdHJpbmcsXG4gKiAgIGNoaWxkTm9kZU9wdGlvbnM/OiB7IHNlcXVlbmNlPzogYm9vbGVhbiB9LFxuICogKSA9PiBTdG9yYWdlTm9kZX1cbiAqL1xuICAgICAgbWFrZUNoaWxkTm9kZShuYW1lLCBjaGlsZE5vZGVPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzZXF1ZW5jZSwgcGF0aCwgbWVzc2VuZ2VyIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBhc3NlcnRQYXRoU2VnbWVudChuYW1lKTtcbiAgICAgICAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHsgc2VxdWVuY2UsIC4uLmNoaWxkTm9kZU9wdGlvbnMgfTtcbiAgICAgICAgcmV0dXJuIG1ha2VDaGFpblN0b3JhZ2VOb2RlKFxuICAgICAgICAgIG1lc3NlbmdlcixcbiAgICAgICAgICBgJHtwYXRofS4ke25hbWV9YCxcbiAgICAgICAgICBtZXJnZWRPcHRpb25zLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIC8qKiBAdHlwZSB7KHZhbHVlOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD59ICovXG4gICAgICBhc3luYyBzZXRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCB7IHNlcXVlbmNlLCBwYXRoLCBtZXNzZW5nZXIgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGFzc2VydC50eXBlb2YodmFsdWUsICdzdHJpbmcnKTtcbiAgICAgICAgLyoqIEB0eXBlIHtTdG9yYWdlRW50cnl9ICovXG4gICAgICAgIGxldCBlbnRyeTtcbiAgICAgICAgaWYgKCFzZXF1ZW5jZSAmJiAhdmFsdWUpIHtcbiAgICAgICAgICBlbnRyeSA9IFtwYXRoXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbnRyeSA9IFtwYXRoLCB2YWx1ZV07XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgY2IuY2FsbEUobWVzc2VuZ2VyLCB7XG4gICAgICAgICAgbWV0aG9kOiBzZXF1ZW5jZSA/ICdhcHBlbmQnIDogJ3NldCcsXG4gICAgICAgICAgYXJnczogW2VudHJ5XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvKiBQb3NzaWJsZSBleHRlbnNpb25zOiovXG4gICAgICAvKiAqIGdldFZhbHVlKCkqL1xuICAgICAgLyogKiBnZXRDaGlsZE5hbWVzKCkgYW5kL29yIG1ha2VDaGlsZE5vZGVzKCkqL1xuICAgICAgLyogKiBnZXROYW1lKCkqL1xuICAgICAgLyogKiByZWN1cnNpdmUgZGVsZXRlKi9cbiAgICAgIC8qICogYmF0Y2ggb3BlcmF0aW9ucyovXG4gICAgICAvKiAqIGxvY2FsIGJ1ZmZlcmluZyAod2l0aCBlbmQtb2YtYmxvY2sgY29tbWl0KSovXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIG1ha2VDaGFpblN0b3JhZ2VOb2RlO1xufTskaM2PX29uY2UucHJlcGFyZUNoYWluU3RvcmFnZU5vZGUocHJlcGFyZUNoYWluU3RvcmFnZU5vZGUpO1xuXG5jb25zdCBtYWtlSGVhcENoYWluU3RvcmFnZU5vZGUgPSBwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZShtYWtlSGVhcFpvbmUoKSk7XG5cbi8qKlxuICogQ3JlYXRlIGEgaGVhcC1iYXNlZCByb290IHN0b3JhZ2Ugbm9kZSBmb3IgYSBnaXZlbiBiYWNraW5nIGZ1bmN0aW9uIGFuZCByb290XG4gKiBwYXRoLlxuICpcbiAqIEBwYXJhbSB7KG1lc3NhZ2U6IFN0b3JhZ2VNZXNzYWdlKSA9PiBhbnl9IGhhbmRsZVN0b3JhZ2VNZXNzYWdlIGEgZnVuY3Rpb24gZm9yXG4gKiAgIHNlbmRpbmcgYSBzdG9yYWdlTWVzc2FnZSBvYmplY3QgdG8gdGhlIHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gKGNmLlxuICogICBnb2xhbmcvY29zbW9zL3gvdnN0b3JhZ2UvdnN0b3JhZ2UuZ28pXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9vdFBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcm9vdE9wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyb290T3B0aW9ucy5zZXF1ZW5jZV0gZW1wbG95IGEgd3JhcHBpbmcgc3RydWN0dXJlIHRoYXRcbiAqICAgcHJlc2VydmVzIGVhY2ggdmFsdWUgc2V0IHdpdGhpbiBhIHNpbmdsZSBibG9jaywgYW5kIGRlZmF1bHQgY2hpbGQgbm9kZXMgdG9cbiAqICAgZG8gdGhlIHNhbWVcbiAqL1xuICAgICAgIGZ1bmN0aW9uIG1ha2VDaGFpblN0b3JhZ2VSb290KFxuICBoYW5kbGVTdG9yYWdlTWVzc2FnZSxcbiAgcm9vdFBhdGgsXG4gIHJvb3RPcHRpb25zID0ge30sXG4pIHtcbiAgY29uc3QgbWVzc2VuZ2VyID0gY2IubWFrZUZ1bmN0aW9uQ2FsbGJhY2soaGFuZGxlU3RvcmFnZU1lc3NhZ2UpO1xuXG4gIC8qIFVzZSB0aGUgaGVhcFpvbmUgZGlyZWN0bHkuKi9cbiAgY29uc3Qgcm9vdE5vZGUgPSBtYWtlSGVhcENoYWluU3RvcmFnZU5vZGUobWVzc2VuZ2VyLCByb290UGF0aCwgcm9vdE9wdGlvbnMpO1xuICByZXR1cm4gcm9vdE5vZGU7XG59XG5cbi8qKlxuICogQHJldHVybnMge1N0b3JhZ2VOb2RlfSBhbiBvYmplY3QgdGhhdCBjb25maXJtcyB0byBTdG9yYWdlTm9kZSBBUEkgYnV0IGRvZXNcbiAqICAgbm90IHN0b3JlIGFueXdoZXJlLlxuICovXG5jb25zdCBtYWtlTnVsbFN0b3JhZ2VOb2RlID0gKCkgPT4ge1xuICAvKiBYWFggcmUtdXNlIFwiQ2hhaW5TdG9yYWdlXCIgbWV0aG9kcyBhYm92ZSB3aGljaCBkb24ndCBhY3R1YWxseSBkZXBlbmQgb24gY2hhaW5zKi9cbiAgcmV0dXJuIG1ha2VDaGFpblN0b3JhZ2VSb290KFxuICAgIEZhcignTnVsbE1lc3NlbmdlcicsICgpID0+IG51bGwpLFxuICAgICdudWxsJyxcbiAgKTtcbn07XG5cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHJldHVybmluZyBhIHN0b3JhZ2Ugbm9kZSBhdCBvciB1bmRlciBpdHMgaW5wdXQsXG4gKiBmYWxsaW5nIGJhY2sgdG8gYW4gaW5lcnQgb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QgaW50ZXJmYWNlIChidXQgaW5jb21wbGV0ZVxuICogYmVoYXZpb3IpIHdoZW4gdGhhdCBpcyB1bmF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UmVtb3RlPFN0b3JhZ2VOb2RlPiB8IG51bGw+fSBzdG9yYWdlTm9kZVJlZlxuICogQHBhcmFtIHtzdHJpbmd9IGNoaWxkTmFtZVxuICogQHJldHVybnMge1Byb21pc2U8UmVtb3RlPFN0b3JhZ2VOb2RlPj59XG4gKi9cbiAgICAgICBhc3luYyBmdW5jdGlvbiBtYWtlU3RvcmFnZU5vZGVDaGlsZChzdG9yYWdlTm9kZVJlZiwgY2hpbGROYW1lKSB7XG4gIGNvbnN0IGV4aXN0aW5nU3RvcmFnZU5vZGUgPSBhd2FpdCBzdG9yYWdlTm9kZVJlZjtcbiAgY29uc3Qgc3RvcmFnZU5vZGUgPSBleGlzdGluZ1N0b3JhZ2VOb2RlIHx8IG1ha2VOdWxsU3RvcmFnZU5vZGUoKTtcbiAgcmV0dXJuIEUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoY2hpbGROYW1lKTtcbn1cbmhhcmRlbihtYWtlU3RvcmFnZU5vZGVDaGlsZCk7XG5cbi8qIFRPRE8gZmluZCBhIGJldHRlciBtb2R1bGUgZm9yIHRoaXMqL1xuLyoqXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMgeyh2YWx1ZTogUGFzc2FibGUpID0+IFByb21pc2U8dm9pZD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gKHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIHJldHVybiBhc3luYyB2YWx1ZSA9PiB7XG4gICAgY29uc3QgbWFyc2hhbGxlZCA9IGF3YWl0IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbHVlKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkobWFyc2hhbGxlZCk7XG4gICAgcmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKHNlcmlhbGl6ZWQpO1xuICB9O1xufTskaM2PX29uY2UubWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShtYWtlU2VyaWFsaXplVG9TdG9yYWdlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlN0cmVhbUNlbGxTaGFwZSI6WyJTdHJlYW1DZWxsU2hhcGUiXSwiaXNTdHJlYW1DZWxsIjpbImlzU3RyZWFtQ2VsbCJdLCJhc3NlcnRQYXRoU2VnbWVudCI6WyJhc3NlcnRQYXRoU2VnbWVudCJdLCJwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSI6WyJwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSJdLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCI6WyJtYWtlQ2hhaW5TdG9yYWdlUm9vdCJdLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCI6WyJtYWtlU3RvcmFnZU5vZGVDaGlsZCJdLCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIjpbIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAI0Vy+qcDAACnAwAANwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tYXJzaGFsL2luYWNjZXNzaWJsZS12YWwuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZUluYWNjZXNzaWJsZVZhbCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV1dKTtcblxuXG5jb25zdCBpZmFjZUFsbGVnZWRQcmVmaXggPSAnQWxsZWdlZDogJztcbmNvbnN0IGlmYWNlSW5hY2Nlc3NpYmxlUHJlZml4ID0gJ1NFVkVSRUQ6ICc7XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBpZmFjZVxuICogQHJldHVybnMge2FueX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VJbmFjY2Vzc2libGVWYWwgPSBpZmFjZSA9PiB7XG4gIGlmICh0eXBlb2YgaWZhY2UgPT09ICdzdHJpbmcnICYmIGlmYWNlLnN0YXJ0c1dpdGgoaWZhY2VBbGxlZ2VkUHJlZml4KSkge1xuICAgIGlmYWNlID0gaWZhY2Uuc2xpY2UoaWZhY2VBbGxlZ2VkUHJlZml4Lmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIEZhcihgJHtpZmFjZUluYWNjZXNzaWJsZVByZWZpeH0ke2lmYWNlfWAsIHt9KTtcbn07JGjNj19vbmNlLm1ha2VJbmFjY2Vzc2libGVWYWwobWFrZUluYWNjZXNzaWJsZVZhbCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSW5hY2Nlc3NpYmxlVmFsIjpbIm1ha2VJbmFjY2Vzc2libGVWYWwiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApIPPnrEDAACxAwAAMAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tYXJzaGFsL3B1cmUtZGF0YS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsicHVyZURhdGFNYXJzaGFsbGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q2FwRGF0YX0gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKi9cblxuLyoqIEBwYXJhbSB7Q2FwRGF0YTx1bmtub3duPn0gY2FwICovXG5jb25zdCByZWplY3RPQ2FwID0gY2FwID0+IEZhaWxgJHtjYXB9IGlzIG5vdCBwdXJlIGRhdGFgO1xuICAgICAgIGNvbnN0IHB1cmVEYXRhTWFyc2hhbGxlciA9IG1ha2VNYXJzaGFsKHJlamVjdE9DYXAsIHJlamVjdE9DYXAsIHtcbiAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG59KTskaM2PX29uY2UucHVyZURhdGFNYXJzaGFsbGVyKHB1cmVEYXRhTWFyc2hhbGxlcik7XG5oYXJkZW4ocHVyZURhdGFNYXJzaGFsbGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InB1cmVEYXRhTWFyc2hhbGxlciI6WyJwdXJlRGF0YU1hcnNoYWxsZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1l0z3uU8AADlPAAANgAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qc3siaW1wb3J0cyI6WyJAZW5kby9jYWNoZS1tYXAiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vZmFyIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL21hcnNoYWwiLCIuL2luYWNjZXNzaWJsZS12YWwuanMiXSwiZXhwb3J0cyI6WyJ3cmFwUmVtb3RlTWFyc2hhbGxlciIsIndyYXBSZW1vdGVNYXJzaGFsbGVyRGlyZWN0U2VuZCIsIndyYXBSZW1vdGVNYXJzaGFsbGVyU2VuZFNsb3RzT25seSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VDYWNoZU1hcEtpdCxGYWlsLHEsRSxGYXIsUEFTU19TVFlMRSxtYWtlTWFyc2hhbCxtYWtlSW5hY2Nlc3NpYmxlVmFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY2FjaGUtbWFwXCIsIFtbXCJtYWtlQ2FjaGVNYXBLaXRcIixbJGjNj19hID0+IChtYWtlQ2FjaGVNYXBLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dLFtcIi4vaW5hY2Nlc3NpYmxlLXZhbC5qc1wiLCBbW1wibWFrZUluYWNjZXNzaWJsZVZhbFwiLFskaM2PX2EgPT4gKG1ha2VJbmFjY2Vzc2libGVWYWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7V2Vha01hcEFQSX0gZnJvbSAnQGVuZG8vY2FjaGUtbWFwJztcbiAqIEBpbXBvcnQge0VPbmx5fSBmcm9tICdAZW5kby9ldmVudHVhbC1zZW5kJztcbiAqIEBpbXBvcnQge1Bhc3NTdHlsZWQsIFNpbXBsaWZ5fSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0NhcERhdGEsIFBhc3NhYmxlLCBNYXJzaGFsLCBNYWtlTWFyc2hhbE9wdGlvbnN9IGZyb20gJ0BlbmRvL21hcnNoYWwnO1xuICogQGltcG9ydCB7RVJlbW90ZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQSBNYXJzaGFsbGVyIHdoaWNoIG1ldGhvZHMgbWF5IGJlIGFzeW5jLiBVc2UgdGhpcyB0eXBlIHRvIGluZGljYXRlIGFjY2VwdGluZ1xuICogZWl0aGVyIGEgc3luYyBvciBhc3luYyBtYXJzaGFsbGVyLCB1c3VhbGx5IHRocm91Z2ggYEVgIGV2ZW50dWFsLXNlbmRzLlxuICpcbiAqIEB0ZW1wbGF0ZSBbU2xvdD11bmtub3duXVxuICogQHR5cGVkZWYge1NpbXBsaWZ5PEVPbmx5PE1hcnNoYWw8U2xvdD4+Pn0gRU1hcnNoYWxsZXJcbiAqL1xuXG4vKiogQHR5cGVkZWYgeydSZW1vdGFibGUnIHwgYEFsbGVnZWQ6ICR7c3RyaW5nfWB9IEludGVyZmFjZVNwZWMgKi9cblxuLyoqIEB0ZW1wbGF0ZSBbU2xvdD11bmtub3duXSAqL1xuY2xhc3MgU2xvdFdyYXBwZXIge1xuICAvKiogQHR5cGUge1Nsb3R9ICovXG4gICNzbG90O1xuXG4gIC8qKiBAdHlwZSB7SW50ZXJmYWNlU3BlY30gKi9cbiAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnQWxsZWdlZDogU2xvdFdyYXBwZXInO1xuXG4gIC8qKlxuICogQHBhcmFtIHtTbG90fSBzbG90XG4gKiBAcGFyYW0ge3N0cmluZ30gW2lmYWNlXVxuICovXG4gIGNvbnN0cnVjdG9yKHNsb3QsIGlmYWNlKSB7XG4gICAgaWYgKGlmYWNlID09IG51bGwgfHwgaWZhY2UgPT09ICdSZW1vdGFibGUnKSB7XG4gICAgICBpZmFjZSA9ICdSZW1vdGFibGUnO1xuICAgIH0gZWxzZSBpZiAoIWlmYWNlLnN0YXJ0c1dpdGgoJ0FsbGVnZWQ6ICcpKSB7XG4gICAgICBpZmFjZSA9IGBBbGxlZ2VkOiAke2lmYWNlfWA7XG4gICAgfVxuICAgIHRoaXMuI3Nsb3QgPSBzbG90O1xuICAgIHRoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXSA9IC8qKiBAdHlwZSB7SW50ZXJmYWNlU3BlY30gKi8gKGlmYWNlKTtcbiAgfVxuXG4gIC8qKlxuICogQHRlbXBsYXRlIFtTbG90PXVua25vd25dXG4gKiBAcGFyYW0ge1Nsb3RXcmFwcGVyPFNsb3Q+fSB3cmFwcGVyXG4gKiBAcmV0dXJucyB7U2xvdH1cbiAqL1xuICBzdGF0aWMgZ2V0U2xvdCh3cmFwcGVyKSB7XG4gICAgcmV0dXJuIHdyYXBwZXIuI3Nsb3Q7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFNsb3RXcmFwcGVyLnByb3RvdHlwZSwge1xuICBbUEFTU19TVFlMRV06IHsgdmFsdWU6ICdyZW1vdGFibGUnIH0sXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7IHZhbHVlOiAnQWxsZWdlZDogU2xvdFdyYXBwZXInIH0sXG59KTtcblJlZmxlY3QuZGVsZXRlUHJvcGVydHkoU2xvdFdyYXBwZXIucHJvdG90eXBlLCAnY29uc3RydWN0b3InKTtcbmhhcmRlbihTbG90V3JhcHBlcik7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtTbG90PXVua25vd25dXG4gKiBAdHlwZWRlZiB7U2xvdFdyYXBwZXI8U2xvdD4gJiBQYXNzU3R5bGVkPCdyZW1vdGFibGUnLCBJbnRlcmZhY2VTcGVjPn0gUmVtb3RhYmxlU2xvdFdyYXBwZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbU2xvdD11bmtub3duXVxuICogQHBhcmFtIHtTbG90fSBzbG90XG4gKiBAcGFyYW0ge3N0cmluZ30gW2lmYWNlXVxuICovXG5jb25zdCBzbG90VG9XcmFwcGVyID0gKHNsb3QsIGlmYWNlKSA9PlxuICAvKiogQHR5cGUge1JlbW90YWJsZVNsb3RXcmFwcGVyPFNsb3Q+fSAqLyAoXG4gICAgaGFyZGVuKG5ldyBTbG90V3JhcHBlcihzbG90LCBpZmFjZSkpXG4gICk7XG5cbmNvbnN0IHdyYXBwZXJUb1Nsb3QgPSBTbG90V3JhcHBlci5nZXRTbG90O1xuXG5jb25zdCBjYXBhY2l0eU9mRGVmYXVsdENhY2hlID0gNTA7XG5cbi8qIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8xMjExMSkqL1xuLyogQ2hlY2sgY29zdCBvZiB1c2luZyB2aXJ0dWFsLWF3YXJlIFdlYWtNYXAgaW4gbGl2ZXNsb3RzKi9cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt3ZWFrS2V5XVxuICovXG5jb25zdCBtYWtlRGVmYXVsdENhY2hlTWFwID0gd2Vha0tleSA9PlxuICAvKiogQHR5cGUge1dlYWtNYXBBUEk8SywgVj59ICovIChcbiAgICBtYWtlQ2FjaGVNYXBLaXQoY2FwYWNpdHlPZkRlZmF1bHRDYWNoZSwge1xuICAgICAgbWFrZU1hcDogd2Vha0tleSA/IFdlYWtNYXAgOiBNYXAsXG4gICAgfSkuY2FjaGVcbiAgKTtcblxuLyoqXG4gKiBXcmFwcyBhIG1hcnNoYWxsZXIsIGVpdGhlciBzeW5jIG9yIGFzeW5jLCBsb2NhbCBvciByZW1vdGUsIGludG8gYSBsb2NhbCBhc3luY1xuICogbWFyc2hhbGxlciB3aGljaCBvbmx5IHNlbmRzIHNsb3RzIGZvciByZXNvbHV0aW9uIHRvIHRoZSB3cmFwcGVkIG1hcnNoYWxsZXIuXG4gKiBPcHRpb25hbGx5IGFuZCBieSBkZWZhdWx0LCBjYWNoZXMgdGhlIHJlc29sdXRpb24gb2Ygc2xvdHMuXG4gKlxuICogQXNzdW1lcyB0aGF0IGEgbnVsbC1pc2ggc2xvdCB2YWx1ZSBpcyBhIHNldmVyZWQgcHJlc2VuY2UgdGhhdCBjYW4gYmUgcmVzb2x2ZWRcbiAqIGxvY2FsbHkuIEJ5IGRlZmF1bHQgaWYgYSBwcmVzZW5jZSBpcyBtYXBwZWQgdG8gYSBudWxsLWlzaCBzbG90IGJ5IHRoZSB3cmFwcGVkXG4gKiBtYXJzaGFsbGVyLCB0aGF0IG1hcHBpbmcgaXMgbm90IGNhY2hlZCwgYWxsb3dpbmcgdGhlIHdyYXBwZWQgbWFyc2hhbGxlciB0b1xuICogY3JlYXRlIGEgbWFwcGluZyBpbiB0aGUgZnV0dXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSBbU2xvdD11bmtub3duXVxuICogQHBhcmFtIHtFUmVtb3RlPFBpY2s8RU1hcnNoYWxsZXI8U2xvdD4sICdmcm9tQ2FwRGF0YScgfCAndG9DYXBEYXRhJz4+fSBtYXJzaGFsbGVyXG4gKiBAcGFyYW0ge01ha2VNYXJzaGFsT3B0aW9uc30gW21hcnNoYWxPcHRpb25zXVxuICogQHBhcmFtIHtvYmplY3R9IFtjYWNoZXNdXG4gKiBAcGFyYW0ge1dlYWtNYXBBUEk8b2JqZWN0LCBTbG90PiB8IG51bGx9IFtjYWNoZXMudmFsVG9TbG90XVxuICogQHBhcmFtIHtXZWFrTWFwQVBJPFNsb3QsIG9iamVjdD4gfCBudWxsfSBbY2FjaGVzLnNsb3RUb1ZhbF1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NhY2hlcy5jYWNoZVNldmVyZWRWYWxdXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0eXBlb2YgRmFyPEVNYXJzaGFsbGVyPFNsb3Q+Pj59XG4gKi9cbiAgICAgICBjb25zdCB3cmFwUmVtb3RlTWFyc2hhbGxlclNlbmRTbG90c09ubHkgPSAoXG4gIG1hcnNoYWxsZXIsXG4gIHtcbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0ID0gJ3NtYWxsY2FwcycsXG4gICAgZXJyb3JUYWdnaW5nID0gJ29mZicsIC8qIERpc2FibGUgZXJyb3IgdGFnZ2luZyBieSBkZWZhdWx0Ki9cbiAgICAuLi5vdGhlck1hcnNoYWxPcHRpb25zXG4gIH0gPSB7fSxcbiAge1xuICAgIHZhbFRvU2xvdCA9IG1ha2VEZWZhdWx0Q2FjaGVNYXAodHJ1ZSksXG4gICAgc2xvdFRvVmFsID0gbWFrZURlZmF1bHRDYWNoZU1hcChmYWxzZSksXG4gICAgY2FjaGVTZXZlcmVkVmFsID0gZmFsc2UsXG4gIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCBtYXJzaGFsT3B0aW9ucyA9IGhhcmRlbih7XG4gICAgc2VyaWFsaXplQm9keUZvcm1hdCxcbiAgICBlcnJvclRhZ2dpbmcsXG4gICAgLi4ub3RoZXJNYXJzaGFsT3B0aW9ucyxcbiAgfSk7XG4gIC8qIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHdyYXBwZWQgbWFyc2hhbGxlciBpbnRlcm5hbGx5IHVzZXMgMiBtYXJzaGFsbGVycyovXG4gIC8qIHRvIHRyYW5zZm9ybSB0aGUgQ2FwRGF0YSBpbnRvIGEgUGFzc2FibGUgc3RydWN0dXJlIGFuZCB2aWNlLXZlcnNhOiovXG4gIC8qIC0gQSBjYXAgcGFzcy10aHJvdWdoIG1hcnNoYWxsZXIgd2hpY2ggcGxhY2VzIGNhcGFiaWxpdGllcyBhcy1pcyBpbiB0aGUgc2xvdHMuKi9cbiAgLyogV2hlbiB1bnNlcmlhbGl6aW5nIENhcERhdGEgd2l0aCBudWxsLWlzaCBzbG90cywgYSBzZXZlcmVkIHByZXNlbmNlIGlzIGNyZWF0ZWQuKi9cbiAgLyogVGhpcyBwYXNzLXRocm91Z2ggbWFyc2hhbGxlciBpcyB1c2VkIHRvIGxvY2FsbHkgcHJvY2VzcyB0aGUgc3RydWN0dXJlLCBhbmQqL1xuICAvKiBzZXBhcmF0ZSBjYXBhYmlsaXRpZXMgaW50byBhIHNsb3RzIGFycmF5IGZvciBwb3RlbnRpYWwgcmVzb2x1dGlvbiBieSB0aGUqL1xuICAvKiB3cmFwcGVkIG1hcnNoYWxsZXIuKi9cbiAgLyogLSBBIFwiU2xvdFdyYXBwZXJcIiBtYXJzaGFsbGVyIHVzZWQgdG8gd3JhcCBpbnRvIHJlbW90YWJsZXMgdGhlIHNsb3RzIG9mIHRoZSovXG4gIC8qIHdyYXBwZWQgbWFyc2hhbGxlci4gV2hlbiB1bnNlcmlhbGl6aW5nIENhcERhdGEsIGl0IGlzIHVzZWQgdG8gcmVjcmVhdGUqL1xuICAvKiBDYXBEYXRhIG9mIGEgc2ltcGxlIGFycmF5IG9mIG5vbi1zZXZlcmVkIGNhcGFiaWxpdGllcyBmb3IgcmVzb2x1dGlvbiBieSovXG4gIC8qIHRoZSB3cmFwcGVkIG1hcnNoYWxsZXIuIFdoZW4gc2VyaWFsaXppbmcgdG8gQ2FwRGF0YSwgaXQgYWxsb3dzIGV4dHJhY3RpbmcqL1xuICAvKiB0aGUgc2xvdHMgZnJvbSB0aGUgY2FwYWJpbGl0aWVzIGFycmF5IHNlcmlhbGl6ZWQgYnkgdGhlIHdyYXBwZWQgbWFyc2hhbGxlci4qL1xuXG4gIC8qKiBAdHlwZSB7TWFyc2hhbDxvYmplY3QgfCBudWxsPn0gKi9cbiAgY29uc3QgcGFzc1Rocm91Z2hNYXJzaGFsbGVyID0gbWFrZU1hcnNoYWwoXG4gICAgdW5kZWZpbmVkLFxuICAgIChzbG90LCBpZmFjZSkgPT4gc2xvdCA/PyBtYWtlSW5hY2Nlc3NpYmxlVmFsKGlmYWNlKSxcbiAgICBtYXJzaGFsT3B0aW9ucyxcbiAgKTtcblxuICAvKiogQHR5cGUge01hcDxTbG90LCBSZW1vdGFibGVTbG90V3JhcHBlcjxOb25OdWxsYWJsZTxTbG90Pj4+fSAqL1xuICBjb25zdCBjdXJyZW50U2xvdFRvV3JhcHBlciA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBjb252ZXJ0V3JhcHBlclRvU2xvdCA9IC8qKiBAdHlwZSB7dHlwZW9mIHdyYXBwZXJUb1Nsb3Q8U2xvdD59ICovIChcbiAgICB3cmFwcGVyVG9TbG90XG4gICk7XG4gIC8qKlxuICogQHBhcmFtIHtTbG90fSBzbG90XG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2lmYWNlXVxuICovXG4gIGNvbnN0IGNvbnZlcnRTbG90VG9XcmFwcGVyID0gKHNsb3QsIGlmYWNlKSA9PiB7XG4gICAgaWYgKHNsb3QgPT0gbnVsbCkge1xuICAgICAgLyogVGhlIHdyYXBwZWQgbWFyc2hhbGxlciBtYXkgc2VuZCB1cyBDYXBEYXRhIHdpdGggYSBudWxsIHNsb3QuIFRoZXNlIGFyZSBub3QqL1xuICAgICAgLyogbWVhbnQgdG8gYmUgY29uc2lkZXJlZCBlcXVpdmFsZW50IHdpdGggZWFjaCBvdGhlciwgc28gYnlwYXNzIG1hcHBpbmcuKi9cbiAgICAgIHJldHVybiBzbG90VG9XcmFwcGVyKHNsb3QsIGlmYWNlKTtcbiAgICB9XG4gICAgbGV0IHdyYXBwZXIgPSBjdXJyZW50U2xvdFRvV3JhcHBlci5nZXQoc2xvdCk7XG4gICAgaWYgKCF3cmFwcGVyKSB7XG4gICAgICB3cmFwcGVyID0gc2xvdFRvV3JhcHBlcihzbG90LCBpZmFjZSk7XG4gICAgICBjdXJyZW50U2xvdFRvV3JhcHBlci5zZXQoc2xvdCwgd3JhcHBlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXBwZXI7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHtQaWNrPE1hcnNoYWw8U2xvdD4sICd0b0NhcERhdGEnIHwgJ2Zyb21DYXBEYXRhJz59ICovXG4gIGNvbnN0IHNsb3RXcmFwcGVyTWFyc2hhbGxlciA9IG1ha2VNYXJzaGFsKFxuICAgIGNvbnZlcnRXcmFwcGVyVG9TbG90LFxuICAgIGNvbnZlcnRTbG90VG9XcmFwcGVyLFxuICAgIG1hcnNoYWxPcHRpb25zLFxuICApO1xuXG4gIC8qKlxuICogUmVzb2x2ZXMgYW4gYXJyYXkgb2Ygd3JhcHBlZCBtYXJzaGFsbGVyJ3Mgc2xvdHMgdG8gYW4gYXJyYXkgb2ZcbiAqIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBUaGlzIGlzIHVzZWQgYnkgYGZyb21DYXBEYXRhYCB0byBtYXAgc2xvdHMgYmVmb3JlIHVzaW5nIHRoZSBwYXNzLXRocm91Z2hcbiAqIG1hcnNoYWxsZXIgdG8gcmVjcmVhdGUgdGhlIHBhc3NhYmxlIGRhdGEuXG4gKlxuICogQHBhcmFtIHtTbG90W119IHNsb3RzXG4gKiBAcGFyYW0geyhpbmRleDogbnVtYmVyKSA9PiBSZW1vdGFibGVTbG90V3JhcHBlcjxOb25OdWxsYWJsZTxTbG90Pj59IGdldFdyYXBwZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPChvYmplY3QgfCBudWxsKVtdPn1cbiAqL1xuICBjb25zdCBtYXBTbG90c1RvQ2FwcyA9IGFzeW5jIChzbG90cywgZ2V0V3JhcHBlcikgPT4ge1xuICAgIGxldCBoYXNSZW1vdGVDYXAgPSBmYWxzZTtcbiAgICBjb25zdCB7IGxlbmd0aCB9ID0gc2xvdHM7XG4gICAgLyoqIEB0eXBlIHsoUmVtb3RhYmxlU2xvdFdyYXBwZXI8Tm9uTnVsbGFibGU8U2xvdD4+IHwgbnVsbCB8IHVuZGVmaW5lZClbXX0gKi9cbiAgICBjb25zdCBzbG90V3JhcHBlck1hcHBlZFNsb3RzID0gQXJyYXkuZnJvbSh7IGxlbmd0aCB9KTtcbiAgICAvKiogQHR5cGUgeyhvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkKVtdfSAqL1xuICAgIGNvbnN0IGxvY2FsbHlSZXNvbHZlZENhcFNsb3RzID0gQXJyYXkuZnJvbSh7IGxlbmd0aCB9KTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBzbG90XSBvZiBzbG90cy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChzbG90ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG51bGxTbG90ID0gLyoqIEB0eXBlIHtudWxsfSAqLyAoc2xvdCk7XG4gICAgICAgIHNsb3RXcmFwcGVyTWFwcGVkU2xvdHNbaW5kZXhdID0gbnVsbFNsb3Q7XG4gICAgICAgIGxvY2FsbHlSZXNvbHZlZENhcFNsb3RzW2luZGV4XSA9IG51bGxTbG90O1xuICAgICAgfSBlbHNlIGlmIChzbG90ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgY2FjaGVkQ2FwID0gc2xvdFRvVmFsPy5nZXQoc2xvdCk7XG4gICAgICAgIGlmIChjYWNoZWRDYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhbFRvU2xvdD8uc2V0KGNhY2hlZENhcCwgc2xvdCk7XG4gICAgICAgICAgbG9jYWxseVJlc29sdmVkQ2FwU2xvdHNbaW5kZXhdID0gY2FjaGVkQ2FwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhc1JlbW90ZUNhcCA9IHRydWU7XG4gICAgICAgICAgc2xvdFdyYXBwZXJNYXBwZWRTbG90c1tpbmRleF0gPSBnZXRXcmFwcGVyKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IG51bGw7XG4gICAgaWYgKGhhc1JlbW90ZUNhcCkge1xuICAgICAgaGFyZGVuKHNsb3RXcmFwcGVyTWFwcGVkU2xvdHMpO1xuICAgICAgY29uc3Qgc2xvdHNPbmx5Q2FwRGF0YSA9IHNsb3RXcmFwcGVyTWFyc2hhbGxlci50b0NhcERhdGEoXG4gICAgICAgIHNsb3RXcmFwcGVyTWFwcGVkU2xvdHMsXG4gICAgICApO1xuXG4gICAgICAvKiogQHR5cGUgeyhvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkKVtdfSAqL1xuICAgICAgY29uc3QgcmVtb3RlbHlSZXNvbHZlZENhcFNsb3RzID1cbiAgICAgICAgYXdhaXQgRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShzbG90c09ubHlDYXBEYXRhKTtcblxuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHZhbF0gb2YgcmVtb3RlbHlSZXNvbHZlZENhcFNsb3RzLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBzbG90ID0gc2xvdHNbaW5kZXhdO1xuICAgICAgICAgIHNsb3RUb1ZhbD8uc2V0KHNsb3QsIHZhbCk7XG4gICAgICAgICAgdmFsVG9TbG90Py5zZXQodmFsLCBzbG90KTtcbiAgICAgICAgICBsb2NhbGx5UmVzb2x2ZWRDYXBTbG90c1tpbmRleF0gPSB2YWw7XG4gICAgICAgIH0gZWxzZSBpZiAobG9jYWxseVJlc29sdmVkQ2FwU2xvdHNbaW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBzbG90ID0gc2xvdHNbaW5kZXhdO1xuICAgICAgICAgIGNvbnNvbGUud2Fybign4pqg77iPIFVucmVzb2x2ZWQgbG9jYWwgc2xvdCBpbiB3cmFwcGVkIG1hcnNoYWxsZXInLCB7XG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIHNsb3QsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaGFyZGVuKGxvY2FsbHlSZXNvbHZlZENhcFNsb3RzKTtcbiAgfTtcblxuICAvKipcbiAqIFJlc29sdmVzIGFuIGFycmF5IG9mIGNhcGFiaWxpdGllcyBpbnRvIGFuIGFycmF5IG9mIHNsb3RzIG9mIHRoZSB3cmFwcGVkXG4gKiBtYXJzaGFsbGVyLlxuICpcbiAqIFRoaXMgaXMgdXNlZCBieSBgdG9DYXBEYXRhYCB0byBtYXAgc2xvdHMgYWZ0ZXIgdGhlIHBhc3MtdGhyb3VnaCBtYXJzaGFsbGVyXG4gKiBoYXMgc2VyaWFsaXplZCB0aGUgcGFzc2FibGUgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdFtdfSBjYXBzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTbG90W10+fVxuICovXG4gIGNvbnN0IG1hcENhcHNUb1Nsb3RzID0gYXN5bmMgY2FwcyA9PiB7XG4gICAgaWYgKGNhcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gY2FwcztcbiAgICB9XG4gICAgbGV0IGhhc1JlbW90ZUNhcCA9IGZhbHNlO1xuICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBjYXBzO1xuICAgIC8qKiBAdHlwZSB7KFNsb3QgfCBudWxsIHwgdW5kZWZpbmVkKVtdfSAqL1xuICAgIGNvbnN0IGxvY2FsbHlSZXNvbHZlZFNsb3RzID0gQXJyYXkuZnJvbSh7IGxlbmd0aCB9KTtcbiAgICAvKiogQHR5cGUgeyhvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkKVtdfSAqL1xuICAgIGNvbnN0IHJlbW90ZUNhcHNUb1Jlc29sdmUgPSBBcnJheS5mcm9tKHsgbGVuZ3RoIH0pO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGNhcF0gb2YgY2Fwcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChjYXAgPT09IG51bGwpIHtcbiAgICAgICAgLyogV2Ugc2hvdWxkbid0IGdldCBudWxsIGNhcHMgaGVyZSwgYnV0IHdlIG1pcnJvciBoYW5kbGUgdGhlbSBhbnl3YXkqL1xuICAgICAgICBjb25zdCBudWxsQ2FwID0gLyoqIEB0eXBlIHtudWxsfSAqLyAoY2FwKTtcbiAgICAgICAgcmVtb3RlQ2Fwc1RvUmVzb2x2ZVtpbmRleF0gPSBudWxsQ2FwO1xuICAgICAgICBsb2NhbGx5UmVzb2x2ZWRTbG90c1tpbmRleF0gPSBudWxsQ2FwO1xuICAgICAgfSBlbHNlIGlmIChjYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjYWNoZWRTbG90ID0gdmFsVG9TbG90Py5nZXQoY2FwKTtcbiAgICAgICAgaWYgKGNhY2hlZFNsb3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChjYWNoZWRTbG90ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzbG90VG9WYWw/LnNldChjYWNoZWRTbG90LCBjYXApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsb2NhbGx5UmVzb2x2ZWRTbG90c1tpbmRleF0gPSBjYWNoZWRTbG90O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhc1JlbW90ZUNhcCA9IHRydWU7XG4gICAgICAgICAgcmVtb3RlQ2Fwc1RvUmVzb2x2ZVtpbmRleF0gPSBjYXA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBudWxsO1xuICAgIGlmIChoYXNSZW1vdGVDYXApIHtcbiAgICAgIGNvbnN0IHJlbW90ZWx5UmVzb2x2ZWRTbG90c0NhcERhdGEgPVxuICAgICAgICBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YShyZW1vdGVDYXBzVG9SZXNvbHZlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8qKiBAdHlwZSB7KFJlbW90YWJsZVNsb3RXcmFwcGVyPFNsb3Q+IHwgbnVsbCB8IHVuZGVmaW5lZClbXX0gKi9cbiAgICAgICAgY29uc3Qgc2xvdFdyYXBwZXJNYXBwZWRTbG90cyA9IHNsb3RXcmFwcGVyTWFyc2hhbGxlci5mcm9tQ2FwRGF0YShcbiAgICAgICAgICByZW1vdGVseVJlc29sdmVkU2xvdHNDYXBEYXRhLFxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgc2xvdFdyYXBwZXJdIG9mIHNsb3RXcmFwcGVyTWFwcGVkU2xvdHMuZW50cmllcygpKSB7XG4gICAgICAgICAgaWYgKHNsb3RXcmFwcGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHNsb3QgPSBjb252ZXJ0V3JhcHBlclRvU2xvdChzbG90V3JhcHBlcik7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSBjYXBzW2luZGV4XTtcbiAgICAgICAgICAgIGxvY2FsbHlSZXNvbHZlZFNsb3RzW2luZGV4XSA9IHNsb3Q7XG4gICAgICAgICAgICBpZiAoc2xvdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHNsb3RUb1ZhbD8uc2V0KHNsb3QsIHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2xvdCAhPSBudWxsIHx8IGNhY2hlU2V2ZXJlZFZhbCkge1xuICAgICAgICAgICAgICB2YWxUb1Nsb3Q/LnNldCh2YWwsIHNsb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxseVJlc29sdmVkU2xvdHNbaW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhcCA9IGNhcHNbaW5kZXhdO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gVW5yZXNvbHZlZCBsb2NhbCBzbG90IGluIHdyYXBwZWQgbWFyc2hhbGxlcicsIHtcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgIGNhcCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSBzbG90V3JhcHBlck1hcnNoYWxsZXIsIGNsZWFyIGl0cyBzdGF0ZSovXG4gICAgICAgIGN1cnJlbnRTbG90VG9XcmFwcGVyLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogQWxsIHNsb3RzIHNob3VsZCBoYXZlIGJlZW4gcmVzb2x2ZWQgYnkgbm93IChvciB3YXJuZWQgYWJvdXQpKi9cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtTbG90W119ICovIChoYXJkZW4obG9jYWxseVJlc29sdmVkU2xvdHMpKTtcbiAgfTtcblxuICAvKipcbiAqIFVuZm9ydHVuYXRlbHkgQ2FwRGF0YSBvbmx5IGNvbnRhaW5zIGlmYWNlIGluZm9ybWF0aW9uIGZvciBzbG90dGVkXG4gKiBjYXBhYmlsaXRpZXMgbmVzdGVkIGluc2lkZSB0aGUgYm9keSwgd2hpY2ggbWVhbnMgd2UgbmVlZCB0byBwcm9jZXNzIHRoZVxuICogYm9keSB0byBleHRyYWN0IGl0LiBNYXliZSBpbiB0aGUgZnV0dXJlIENhcERhdGEgY291bGQgYmUgZXh0ZW5kZWQgdG8gY2FycnlcbiAqIHRoaXMgc2VwYXJhdGVseS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMjk5MVxuICpcbiAqIFNpbmNlIHRoaXMgaGVscGVyIGlzIHVzZWQgaW50ZXJuYWxseSB0byB1bHRpbWF0ZWx5IHByb3ZpZGUgU2xvdFdyYXBwZXJcbiAqIG9iamVjdHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWFyc2hhbGxlciwgYW5kIHRoYXQgd2UgdXNlIHRoZSBzYW1lXG4gKiBtYXJzaGFsbGVyIHRvIGV4dHJhY3QgdGhlIGlmYWNlIGluZm9ybWF0aW9uLCBkaXJlY3RseSByZXR1cm4gdGhlIGZ1bGxcbiAqIFNsb3RXcmFwcGVyIG9iamVjdCBpbnN0ZWFkIG9mIGp1c3QgdGhlIGlmYWNlLlxuICpcbiAqIEBwYXJhbSB7Q2FwRGF0YTxTbG90Pn0gZGF0YVxuICovXG4gIGNvbnN0IG1ha2VJZmFjZUV4dHJhY3RvciA9IGRhdGEgPT4ge1xuICAgIGNvbnN0IHsgc2xvdHMgfSA9IGRhdGE7XG4gICAgLyoqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAqL1xuICAgIGNvbnN0IGdldFdyYXBwZXIgPSBpbmRleCA9PiB7XG4gICAgICBjb25zdCBzbG90ID0gc2xvdHNbaW5kZXhdO1xuICAgICAgbGV0IHdyYXBwZXIgPSBjdXJyZW50U2xvdFRvV3JhcHBlci5nZXQoc2xvdCk7XG4gICAgICBpZiAoIXdyYXBwZXIpIHtcbiAgICAgICAgdm9pZCBzbG90V3JhcHBlck1hcnNoYWxsZXIuZnJvbUNhcERhdGEoZGF0YSk7XG4gICAgICB9XG4gICAgICB3cmFwcGVyID0gY3VycmVudFNsb3RUb1dyYXBwZXIuZ2V0KHNsb3QpO1xuICAgICAgaWYgKCF3cmFwcGVyKSB7XG4gICAgICAgIHRocm93IEZhaWxgTWFyc2hhbGxlciBkaWRuJ3QgY3JlYXRlIHdyYXBwZXIgZm9yIHNsb3QgJHtxKHNsb3QpfSAoaW5kZXg9JHtxKGluZGV4KX0pYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH07XG5cbiAgICByZXR1cm4gZ2V0V3JhcHBlcjtcbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge1Byb21pc2U8Q2FwRGF0YTxTbG90Pj59XG4gKi9cbiAgY29uc3QgdG9DYXBEYXRhID0gYXN5bmMgdmFsID0+IHtcbiAgICBjb25zdCBjYXBEYXRhID0gcGFzc1Rocm91Z2hNYXJzaGFsbGVyLnRvQ2FwRGF0YSh2YWwpO1xuICAgIGNvbnN0IG1hcHBlZFNsb3RzID0gYXdhaXQgbWFwQ2Fwc1RvU2xvdHMoY2FwRGF0YS5zbG90cyk7XG4gICAgcmV0dXJuIGhhcmRlbih7IC4uLmNhcERhdGEsIHNsb3RzOiBtYXBwZWRTbG90cyB9KTtcbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7Q2FwRGF0YTxTbG90Pn0gZGF0YVxuICogQHJldHVybnMge1Byb21pc2U8UGFzc2FibGU+fVxuICovXG4gIGNvbnN0IGZyb21DYXBEYXRhID0gYXN5bmMgZGF0YSA9PiB7XG4gICAgY29uc3QgZ2V0V3JhcHBlciA9IG1ha2VJZmFjZUV4dHJhY3RvcihkYXRhKTtcbiAgICBhd2FpdCBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtYXBwZWRTbG90cyA9IGF3YWl0IG1hcFNsb3RzVG9DYXBzKGRhdGEuc2xvdHMsIGdldFdyYXBwZXIpO1xuICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoTWFyc2hhbGxlci5mcm9tQ2FwRGF0YSh7IC4uLmRhdGEsIHNsb3RzOiBtYXBwZWRTbG90cyB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY3VycmVudFNsb3RUb1dyYXBwZXIuY2xlYXIoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEZhcignd3JhcHBlZCByZW1vdGUgbWFyc2hhbGxlcicsIHtcbiAgICB0b0NhcERhdGEsXG4gICAgZnJvbUNhcERhdGEsXG5cbiAgICAvKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqL1xuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgdG9DYXBEYXRhICovXG4gICAgc2VyaWFsaXplOiB0b0NhcERhdGEsXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSBmcm9tQ2FwRGF0YSAqL1xuICAgIHVuc2VyaWFsaXplOiBmcm9tQ2FwRGF0YSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbU2xvdD11bmtub3duXVxuICogQHBhcmFtIHtFUmVtb3RlPFBpY2s8RU1hcnNoYWxsZXI8U2xvdD4sICdmcm9tQ2FwRGF0YScgfCAndG9DYXBEYXRhJz4+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0eXBlb2YgRmFyPEVNYXJzaGFsbGVyPFNsb3Q+Pj59XG4gKi8kaM2PX29uY2Uud3JhcFJlbW90ZU1hcnNoYWxsZXJTZW5kU2xvdHNPbmx5KHdyYXBSZW1vdGVNYXJzaGFsbGVyU2VuZFNsb3RzT25seSk7XG4gICAgICAgY29uc3Qgd3JhcFJlbW90ZU1hcnNoYWxsZXJEaXJlY3RTZW5kID0gbWFyc2hhbGxlciA9PiB7XG4gIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxDYXBEYXRhPFNsb3Q+Pn1cbiAqL1xuICBjb25zdCB0b0NhcERhdGEgPSB2YWwgPT4gRShtYXJzaGFsbGVyKS50b0NhcERhdGEodmFsKTtcblxuICAvKipcbiAqIEBwYXJhbSB7Q2FwRGF0YTxTbG90Pn0gZGF0YVxuICogQHJldHVybnMge1Byb21pc2U8UGFzc2FibGU+fVxuICovXG4gIGNvbnN0IGZyb21DYXBEYXRhID0gZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpO1xuXG4gIHJldHVybiBGYXIoJ3dyYXBwZWQgcmVtb3RlIG1hcnNoYWxsZXInLCB7XG4gICAgdG9DYXBEYXRhLFxuICAgIGZyb21DYXBEYXRhLFxuXG4gICAgLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ki9cbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHRvQ2FwRGF0YSAqL1xuICAgIHNlcmlhbGl6ZTogdG9DYXBEYXRhLFxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUNhcERhdGEgKi9cbiAgICB1bnNlcmlhbGl6ZTogZnJvbUNhcERhdGEsXG4gIH0pO1xufTskaM2PX29uY2Uud3JhcFJlbW90ZU1hcnNoYWxsZXJEaXJlY3RTZW5kKHdyYXBSZW1vdGVNYXJzaGFsbGVyRGlyZWN0U2VuZCk7XG5cbiAgICAgICBjb25zdCB3cmFwUmVtb3RlTWFyc2hhbGxlciA9IHdyYXBSZW1vdGVNYXJzaGFsbGVyU2VuZFNsb3RzT25seTskaM2PX29uY2Uud3JhcFJlbW90ZU1hcnNoYWxsZXIod3JhcFJlbW90ZU1hcnNoYWxsZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsid3JhcFJlbW90ZU1hcnNoYWxsZXJTZW5kU2xvdHNPbmx5IjpbIndyYXBSZW1vdGVNYXJzaGFsbGVyU2VuZFNsb3RzT25seSJdLCJ3cmFwUmVtb3RlTWFyc2hhbGxlckRpcmVjdFNlbmQiOlsid3JhcFJlbW90ZU1hcnNoYWxsZXJEaXJlY3RTZW5kIl0sIndyYXBSZW1vdGVNYXJzaGFsbGVyIjpbIndyYXBSZW1vdGVNYXJzaGFsbGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACvtEEXxDQAA8Q0AACsAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJiaW5kQWxsTWV0aG9kcyIsImdldE1ldGhvZE5hbWVzIiwiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCByZWFsR2V0TWV0aG9kTmFtZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLFskaM2PX2EgPT4gKHJlYWxHZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoqXG4gKiBAZmlsZSBtZXRob2QtdG9vbHMgdXNlIGR5bmFtaWMgcHJvcGVydHkgbG9va3VwLCB3aGljaCBpcyBub3RcbiAqICAgSmVzc2llLWNvbXBhdGlibGVcbiAqL1xuXG5jb25zdCB7IGNyZWF0ZSwgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qKlxuICogVE9ETyBDb25zb2xpZGF0ZSB3aXRoIHRoZSBgZ2V0TWV0aG9kTmFtZXNgIGluIGBAZW5kby9ldmVudHVhbC1zZW5kYFxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBgZ2V0TWV0aG9kTmFtZXNgIGZyb20gYEBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNgIGluc3RlYWQuXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBLXG4gKiBAcGFyYW0ge1JlY29yZDxLLCBhbnk+fSB2YWxcbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRNZXRob2ROYW1lcyA9IHZhbCA9PlxuICAvKiogQHR5cGUge0tbXX0gKi8gKHJlYWxHZXRNZXRob2ROYW1lcyh2YWwpKTskaM2PX29uY2UuZ2V0TWV0aG9kTmFtZXMoZ2V0TWV0aG9kTmFtZXMpO1xuaGFyZGVuKGdldE1ldGhvZE5hbWVzKTtcblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGBnZXRNZXRob2ROYW1lc2AgY29udGFpbmluZyBvbmx5IHN0cmluZyBuYW1lcywgd2l0aG91dCBzeW1ib2xzXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gS1xuICogQHBhcmFtIHtSZWNvcmQ8SywgYW55Pn0gdmFsXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRTdHJpbmdNZXRob2ROYW1lcyA9IHZhbCA9PlxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAoXG4gICAgcmVhbEdldE1ldGhvZE5hbWVzKHZhbCkuZmlsdGVyKG5hbWUgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKVxuICApO1xuXG4vKipcbiAqIFRPRE8gVGhpcyBmdW5jdGlvbiBleGlzdHMgb25seSB0byBlYXNlIHRoZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTk3MCB0cmFuc2l0aW9uLCBmcm9tIGFsbCBtZXRob2RzXG4gKiBiZWluZyBvd24gcHJvcGVydGllcyB0byBtZXRob2RzIGJlaW5nIGluaGVyaXRlZCBmcm9tIGEgY29tbW9uIHByb3RvdHlwZS4gVGhpc1xuICogdHJhbnNpdGlvbiBicmVha3MgdHdvIHBhdHRlcm5zIHVzZWQgaW4gcHJpb3IgY29kZTogYXV0b2JpbmRpbmcsIGFuZFxuICogZW51bWVyYXRpbmcgbWV0aG9kcyBieSBlbnVtZXJhdGluZyBvd24gcHJvcGVydGllcy4gRm9yIGJvdGgsIHRoZSBwcmVmZXJyZWRcbiAqIHJlcGFpcnMgYXJlXG4gKlxuICogLSBhdXRvYmluZGluZzogUmVwbGFjZSwgZm9yIGV4YW1wbGUsIGBmb28ob2JqLm1ldGhvZClgIHdpdGggYGZvbyhhcmcgPT5cbiAqICAgYG9iai5tZXRob2QoYXJnKSlgLiBJT1csIHN0b3AgcmVseWluZyBvbiBleHByZXNzaW9ucyBsaWtlIGBvYmoubWV0aG9kYHRvXG4gKiAgIGV4dHJhY3QgYSBtZXRob2Qgc3RpbGwgYm91bmQgdG8gdGhlIHN0YXRlIG9mYG9iamAgYmVjYXVzZSwgZm9yIHZpcnR1YWwgYW5kXG4gKiAgIGR1cmFibGUgb2JqZWN0cywgdGhleSBubyBsb25nZXIgd2lsbCBhZnRlciAjNTk3MC5cbiAqIC0gbWV0aG9kIGVudW1lcmF0aW9uOiBSZXBsYWNlLCBmb3IgZXhhbXBsZSBgUmVmbGVjdC5vd25LZXlzKG9iailgIHdpdGhcbiAqICAgYGdldE1ldGhvZE5hbWVzKG9iailgLlxuICpcbiAqIE9uY2UgYWxsIHByb2JsZW1hdGljIGNhc2VzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW4gdGhpcyBtYW5uZXIsIHRoaXNcbiAqIGBiaW5kQWxsTWV0aG9kc2AgaGFjayBjYW4gYW5kIFRPRE8gc2hvdWxkIGJlIGRlbGV0ZWQuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICogaGF2ZSBubyByZWxpYWJsZSBzdGF0aWMgd2F5IHRvIHRyYWNrIGRvd24gYW5kIGZpeCBhbGwgYXV0b2JpbmRpbmcgc2l0ZXMuIEZvclxuICogdGhvc2Ugb2JqZWN0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZ1bGx5IHJlcGFpcmVkIGJ5IHRoZSBhYm92ZSB0d29cbiAqIHRlY2huaXF1ZXMsIGBiaW5kQWxsTWV0aG9kc2AgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBhY3RzIG11Y2ggbGlrZSB0aGVcbiAqIHByZS0jNTk3MCBvYmplY3RzLCB3aXRoIGFsbCB0aGVpciBtZXRob2RzIGFzIGluc3RhbmNlLWJvdW5kIG93biBwcm9wZXJ0aWVzLlxuICogSXQgZG9lcyB0aGlzIGJ5IG1ha2luZyBhIG5ldyBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGBvYmpgIHdoZXJlIHRoZSBuZXdcbiAqIG9iamVjdCBoYXMgYm91bmQgb3duIG1ldGhvZHMgb3ZlcnJpZGRpbmcgYWxsIHRoZSBtZXRob2RzIGl0IHdvdWxkIGhhdmVcbiAqIGluaGVyaXRlZCBmcm9tIGBvYmpgLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBhbnk+fSBUXG4gKiBAcGFyYW0ge1R9IG9ialxuICogQHJldHVybnMge1R9XG4gKi8kaM2PX29uY2UuZ2V0U3RyaW5nTWV0aG9kTmFtZXMoZ2V0U3RyaW5nTWV0aG9kTmFtZXMpO1xuICAgICAgIGNvbnN0IGJpbmRBbGxNZXRob2RzID0gb2JqID0+XG4gIGhhcmRlbihcbiAgICBjcmVhdGUoXG4gICAgICBvYmosXG4gICAgICBmcm9tRW50cmllcyhcbiAgICAgICAgcmVhbEdldE1ldGhvZE5hbWVzKG9iaikubWFwKG5hbWUgPT4gW1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6ICgvKiogQHR5cGUge3Vua25vd25bXX0gKi8gLi4uYXJncykgPT5cbiAgICAgICAgICAgICAgYXBwbHkob2JqW25hbWVdLCBvYmosIGFyZ3MpLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTskaM2PX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuaGFyZGVuKGJpbmRBbGxNZXRob2RzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImdldFN0cmluZ01ldGhvZE5hbWVzIjpbImdldFN0cmluZ01ldGhvZE5hbWVzIl0sImJpbmRBbGxNZXRob2RzIjpbImJpbmRBbGxNZXRob2RzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJD9IHigQgAAoEIAACYAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0cmljcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJCTE9DS19ISVNUT0dSQU1fTUVUUklDUyIsIkhJU1RPR1JBTV9NRVRSSUNTIiwiS0VSTkVMX1NUQVRTX01FVFJJQ1MiLCJLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MiLCJLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MiLCJRdWV1ZU1ldHJpY0FzcGVjdCIsIm1ha2VRdWV1ZU1ldHJpY3MiLCJtYWtlUXVldWVNZXRyaWNzTWV0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsaXNOYXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJpc05hdFwiLFskaM2PX2EgPT4gKGlzTmF0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge01ldGVyIGFzIE9UZWxNZXRlciwgTWV0cmljQXR0cmlidXRlc30gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbiAqIEBpbXBvcnQge1RvdGFsTWFwfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqL1xuXG5jb25zdCBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTID0gW1xuICA1LFxuICAxMCxcbiAgMjUsXG4gIDUwLFxuICAxMDAsXG4gIDI1MCxcbiAgNTAwLFxuICAxMDAwLFxuICAyNTAwLFxuICA1MDAwLFxuICAxMDAwMCxcbiAgSW5maW5pdHksXG5dO1xuY29uc3QgSElTVE9HUkFNX1NFQ09ORFNfTEFURU5DWV9CT1VOREFSSUVTID1cbiAgSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUy5tYXAobXMgPT4gbXMgLyAxMDAwKTtcblxuLyogVE9ETzogVmFsaWRhdGUgdGhlc2UgYm91bmRhcmllcy4gV2UncmUgbm90IGdvaW5nIHRvIGhhdmUgNW1zIGJsb2NrcywgYnV0Ki9cbi8qIHdlIHByb2JhYmx5IGNhcmUgYWJvdXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxMCB2cy4gMzAgc2Vjb25kcy4qL1xuICAgICAgIGNvbnN0IEhJU1RPR1JBTV9NRVRSSUNTID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgc3dpbmdzZXRfY3JhbmtfcHJvY2Vzc2luZ190aW1lOiB7XG4gICAgZGVzY3JpcHRpb246ICdQcm9jZXNzaW5nIHRpbWUgcGVyIGNyYW5rIChtcyknLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogQXJyYXkub2YoMSwgMTEsIDIxLCAzMSwgNDEsIDUxLCA2MSwgNzEsIDgxLCA5MSwgSW5maW5pdHkpLFxuICB9LFxuICBzd2luZ3NldF9ibG9ja19wcm9jZXNzaW5nX3NlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Byb2Nlc3NpbmcgdGltZSBwZXIgYmxvY2snLFxuICAgIHVuaXQ6ICdzJyxcbiAgICBib3VuZGFyaWVzOiBISVNUT0dSQU1fU0VDT05EU19MQVRFTkNZX0JPVU5EQVJJRVMsXG4gIH0sXG4gIHN3aW5nc2V0X3ZhdF9zdGFydHVwOiB7XG4gICAgZGVzY3JpcHRpb246ICdWYXQgc3RhcnR1cCB0aW1lIChtcyknLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUyxcbiAgfSxcbiAgc3dpbmdzZXRfdmF0X2RlbGl2ZXJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdWYXQgZGVsaXZlcnkgdGltZSAobXMpJyxcbiAgICB1bml0OiAnbXMnLFxuICAgIGJvdW5kYXJpZXM6IEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMsXG4gIH0sXG4gIHN3aW5nc2V0X21ldGVyX3VzYWdlOiB7XG4gICAgZGVzY3JpcHRpb246ICdWYXQgbWV0ZXIgdXNhZ2UnLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUyxcbiAgfSxcbn0pOyRozY9fb25jZS5ISVNUT0dSQU1fTUVUUklDUyhISVNUT0dSQU1fTUVUUklDUyk7XG5cbmNvbnN0IGJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyA9IHtcbiAgLyogRGlzYWJsZWQgYmVjYXVzZSBpbXBvcnRpbmcgZnJvbSBAb3BlbnRlbGVtZXRyeS9hcGkgYnJlYWtzIGtlcm5lbCBidW5kbGluZy4qL1xuICAvKiBUaGFua2Z1bGx5LCBpdCdzIHRoZSBkZWZhdWx0IGFueXdheToqL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vb3Blbi10ZWxlbWV0cnkvb3BlbnRlbGVtZXRyeS1qcy9ibG9iL2Y0ZGQyYTEwNjJmOTgwY2QzNDRjZmIxNzJhNTE1ZDAwMTE1ZGY1NzAvYXBpL3NyYy9tZXRyaWNzL01ldHJpYy50cyNMNTMtTDU3Ki9cbiAgLyogdmFsdWVUeXBlOiBWYWx1ZVR5cGUuRE9VQkxFLCovXG4gIHVuaXQ6ICdzJyxcbiAgYWR2aWNlOiB7XG4gICAgZXhwbGljaXRCdWNrZXRCb3VuZGFyaWVzOiBbXG4gICAgICAwLjEsIDAuMiwgMC4zLCAwLjQsIDAuNSwgMSwgMiwgMywgNCwgNSwgNiwgNywgMTAsIDE1LCAzMCxcbiAgICBdLFxuICB9LFxufTtcbiAgICAgICBjb25zdCBCTE9DS19ISVNUT0dSQU1fTUVUUklDUyA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIHN3aW5nc2V0UnVuU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgZXhlY3V0aW5nIFN3aW5nU2V0JyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIHN3aW5nc2V0Q2hhaW5TYXZlU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgcHJvcGFnYXRpbmcgU3dpbmdTZXQgc3RhdGUgaW50byBjb3Ntb3MnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgc3dpbmdzZXRDb21taXRTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgY29tbWl0dGluZyBTd2luZ1NldCBzdGF0ZSB0byBob3N0IHN0b3JhZ2UnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgY29zbW9zQ29tbWl0U2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgY29tbWl0dGluZyBjb3Ntb3Mgc3RhdGUnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgZnVsbENvbW1pdFNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQZXItYmxvY2sgdGltZSBzcGVudCBjb21taXR0aW5nIHN0YXRlLCBpbmNsdXNpdmUgb2YgQ09NTUlUX0JMT0NLIHByb2Nlc3NpbmcgcGx1cyB0aW1lIHNwZW50IFtvdXRzaWRlIG9mIGNvc21pYy1zd2luZ3NldF0gYmVmb3JlIGFuZCBhZnRlciBpdCcsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBpbnRlckJsb2NrU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZSBzcGVudCBpZGxlIGJldHdlZW4gYmxvY2tzJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGFmdGVyQ29tbWl0SGFuZ292ZXJTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgd2FpdGluZyBmb3IgcHJldmlvdXMtYmxvY2sgYWZ0ZXJDb21taXQgd29yaycsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBibG9ja0xhZ1NlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBkZWxheSBvZiBlYWNoIGJsb2NrIGZyb20gaXRzIGV4cGVjdGVkIGJlZ2luIHRpbWUnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgICAvKiBBZGQgYnVja2V0cyBmb3IgZXhjZXNzaXZlbHkgbG9uZyBkZWxheXMuKi9cbiAgICBhZHZpY2U6IHtcbiAgICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYy5hZHZpY2UsXG4gICAgICBleHBsaWNpdEJ1Y2tldEJvdW5kYXJpZXM6IC8qKiBAdHlwZSB7bnVtYmVyW119ICovIChbXG4gICAgICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYy5hZHZpY2UuZXhwbGljaXRCdWNrZXRCb3VuZGFyaWVzLFxuICAgICAgICAuLi5bNjAsIDEyMCwgMTgwLCAyNDAsIDMwMCwgNjAwLCAzNjAwXSxcbiAgICAgIF0pLFxuICAgIH0sXG4gIH0sXG59KTtcblxuLyoqIEBlbnVtIHsodHlwZW9mIFF1ZXVlTWV0cmljQXNwZWN0KVtrZXlvZiB0eXBlb2YgUXVldWVNZXRyaWNBc3BlY3RdfSAqLyRozY9fb25jZS5CTE9DS19ISVNUT0dSQU1fTUVUUklDUyhCTE9DS19ISVNUT0dSQU1fTUVUUklDUyk7XG4gICAgICAgY29uc3QgUXVldWVNZXRyaWNBc3BlY3QgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBMZW5ndGg6ICdsZW5ndGgnLFxuICBJbmNyZW1lbnRDb3VudDogJ2luY3JlbWVudHMnLFxuICBEZWNyZW1lbnRDb3VudDogJ2RlY3JlbWVudHMnLFxufSk7XG5cbi8qKlxuICogUXVldWUgbWV0cmljcyBjb21lIGluIHtsZW5ndGgsYWRkLHJlbW92ZX0gdHJpcGxlcyBzaGFyaW5nIGEgY29tbW9uIHByZWZpeC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVByZWZpeFxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NQcmVmaXhcbiAqIEByZXR1cm5zIHtSZWNvcmQ8XG4gKiAgIFF1ZXVlTWV0cmljQXNwZWN0LFxuICogICB7IG5hbWU6IHN0cmluZzsgb3B0aW9uczogTWV0cmljQXR0cmlidXRlcyB9XG4gKiA+fVxuICovJGjNj19vbmNlLlF1ZXVlTWV0cmljQXNwZWN0KFF1ZXVlTWV0cmljQXNwZWN0KTtcbiAgICAgICBjb25zdCBtYWtlUXVldWVNZXRyaWNzTWV0YSA9IChuYW1lUHJlZml4LCBkZXNjUHJlZml4KSA9PiB7XG4gIC8qKiBAdHlwZSB7W1F1ZXVlTWV0cmljQXNwZWN0LCBzdHJpbmcsIHN0cmluZ11bXX0gKi9cbiAgY29uc3QgbWV0cmljc01ldGEgPSBbXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0Lkxlbmd0aCwgJ2xlbmd0aCcsICdsZW5ndGgnXSxcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuSW5jcmVtZW50Q291bnQsICdhZGQnLCAnaW5jcmVtZW50cyddLFxuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5EZWNyZW1lbnRDb3VudCwgJ3JlbW92ZScsICdkZWNyZW1lbnRzJ10sXG4gIF07XG4gIGNvbnN0IGVudHJpZXMgPSBtZXRyaWNzTWV0YS5tYXAoKFthc3BlY3QsIG5hbWVTdWZmaXgsIGRlc2NTdWZmaXhdKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IGAke25hbWVQcmVmaXh9XyR7bmFtZVN1ZmZpeH1gO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYCR7ZGVzY1ByZWZpeH0gJHtkZXNjU3VmZml4fWA7XG4gICAgLyogRnV0dXJlIE9wZW5UZWxlbWV0cnkgU0RLcyBzaG91bGQgYWxzbyBzdXBwb3J0IGNyZWF0aW5nIEluc3RydW1lbnRzIHdpdGgqL1xuICAgIC8qIGF0dHJpYnV0ZSBrZXlzIChzdWNoIGFzIHRoZSBcInF1ZXVlXCIgYXR0cmlidXRlIGZvciovXG4gICAgLyogXCJjb3NtaWNfc3dpbmdzZXRfaW5ib3VuZF9xdWV1ZV97bGVuZ3RoLGFkZCxyZW1vdmV9XCIgbWVhc3VyZW1lbnRzKToqL1xuICAgIC8qIGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby9kb2NzL3NwZWNzL290ZWwvbWV0cmljcy9hcGkvI2luc3RydW1lbnQtYWR2aXNvcnktcGFyYW1ldGVyLWF0dHJpYnV0ZXMqL1xuICAgIC8qIEF0IHRoYXQgdGltZSwgYSBuZXcgZmllbGQgd2lsbCBiZSBhZGRlZCB0byB0aGlzIHJlY29yZC4qL1xuICAgIHJldHVybiBbYXNwZWN0LCB7IG5hbWUsIG9wdGlvbnM6IHsgZGVzY3JpcHRpb24gfSB9XTtcbiAgfSk7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyk7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBRdWV1ZU5hbWVcbiAqIEB0eXBlZGVmIFF1ZXVlTWV0cmljc1xuICogQHByb3BlcnR5IHsobGVuZ3RoczogUmVjb3JkPFF1ZXVlTmFtZSwgbnVtYmVyPikgPT4gdm9pZH0gaW5pdExlbmd0aHMgbXVzdCBiZVxuICogICBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBmdW5jdGlvblxuICogQHByb3BlcnR5IHsobGVuZ3RoczogUmVjb3JkPFF1ZXVlTmFtZSwgbnVtYmVyPikgPT4gdm9pZH0gdXBkYXRlTGVuZ3Roc1xuICogQHByb3BlcnR5IHsocXVldWU6IFF1ZXVlTmFtZSwgZGVsdGE/OiBudW1iZXIpID0+IHZvaWR9IGluY0xlbmd0aCBmb3IgYVxuICogICBub24tbmVnYXRpdmUgZGVsdGFcbiAqIEBwcm9wZXJ0eSB7KHF1ZXVlOiBRdWV1ZU5hbWUsIGRlbHRhPzogbnVtYmVyKSA9PiB2b2lkfSBkZWNMZW5ndGggZm9yIGFcbiAqICAgbm9uLW5lZ2F0aXZlIGRlbHRhXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUge2xlbmd0aCxhZGQscmVtb3ZlfSBJbnN0cnVtZW50cyBmb3IgYSBxdWV1ZSBhbmQgcmV0dXJuIGZ1bmN0aW9ucyBmb3JcbiAqIGNvbnNpc3RlbnRseSBpbml0aWFsaXppbmcgYW5kIHVwZGF0aW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFF1ZXVlTmFtZVxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICogQHBhcmFtIHtPVGVsTWV0ZXJ9IGNvbmZpZy5vdGVsTWV0ZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWcubmFtZVByZWZpeFxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZy5kZXNjUHJlZml4XG4gKiBAcGFyYW0ge1BpY2s8Q29uc29sZSwgJ3dhcm4nPn0gW2NvbmZpZy5jb25zb2xlXVxuICogQHJldHVybnMge1F1ZXVlTWV0cmljczxRdWV1ZU5hbWU+fVxuICovJGjNj19vbmNlLm1ha2VRdWV1ZU1ldHJpY3NNZXRhKG1ha2VRdWV1ZU1ldHJpY3NNZXRhKTtcbiAgICAgICBjb25zdCBtYWtlUXVldWVNZXRyaWNzID0gKHtcbiAgb3RlbE1ldGVyLFxuICBuYW1lUHJlZml4LFxuICBkZXNjUHJlZml4LFxuICBjb25zb2xlLFxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0Lkxlbmd0aF06IGxlbmd0aE1ldGEsXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0LkluY3JlbWVudENvdW50XTogdXBNZXRhLFxuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5EZWNyZW1lbnRDb3VudF06IGRvd25NZXRhLFxuICB9ID0gbWFrZVF1ZXVlTWV0cmljc01ldGEobmFtZVByZWZpeCwgZGVzY1ByZWZpeCk7XG4gIC8qIFRPRE86IFdoZW4gaXQncyBkZWVtZWQgc2FmZSB0byBjaGFuZ2UgcmVwb3J0ZWQgbWV0cmljcywgbWFrZSB1cENvdW50ZXIgYW5kKi9cbiAgLyogZG93bkNvdW50ZXIgc3luY2hyb25vdXMgKGFuZCBkcm9wIGBpbmNyZW1lbnRzYCBhbmQgYGRlY3JlbWVudHNgIG1hcHMpLiovXG4gIC8qIFdlIGNhbid0IGRvIHNvIHVudGlsIHRoZW4gYmVjYXVzZSBpdCB3aWxsIGFkZCBhIFwiX3RvdGFsXCIgc3VmZml4IHRvIHRoZSovXG4gIC8qIFByb21ldGhldXMgZXhwb3J0IG1ldHJpYyBuYW1lLCBkaXZlcmdpbmcgZnJvbSBgbWFrZUluYm91bmRRdWV1ZU1ldHJpY3NgIGluKi9cbiAgLyogcGFja2FnZXMvY29zbWljLXN3aW5nc2V0L3NyYy9rZXJuZWwtc3RhdHMuanMuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL29wZW4tdGVsZW1ldHJ5L29wZW50ZWxlbWV0cnktanMvYmxvYi9tYWluL2RvYy91cGdyYWRlLXRvLTIueC5tZCMtb3RoZXItY2hhbmdlcyovXG4gIGNvbnN0IGxlbmd0aENvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlVXBEb3duQ291bnRlcihcbiAgICBsZW5ndGhNZXRhLm5hbWUsXG4gICAgbGVuZ3RoTWV0YS5vcHRpb25zLFxuICApO1xuICAvKiBjb25zdCB1cENvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlQ291bnRlcih1cE1ldGEubmFtZSwgdXBNZXRhLm9wdGlvbnMpOyovXG4gIC8qIGNvbnN0IGRvd25Db3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZUNvdW50ZXIoZG93bk1ldGEubmFtZSwgZG93bk1ldGEub3B0aW9ucyk7Ki9cbiAgY29uc3QgdXBDb3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZU9ic2VydmFibGVDb3VudGVyKFxuICAgIHVwTWV0YS5uYW1lLFxuICAgIHVwTWV0YS5vcHRpb25zLFxuICApO1xuICBjb25zdCBkb3duQ291bnRlciA9IG90ZWxNZXRlci5jcmVhdGVPYnNlcnZhYmxlQ291bnRlcihcbiAgICBkb3duTWV0YS5uYW1lLFxuICAgIGRvd25NZXRhLm9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGluY3JlbWVudHMgPSAvKiogQHR5cGUge1RvdGFsTWFwPHN0cmluZywgbnVtYmVyPn0gKi8gKG5ldyBNYXAoKSk7XG4gIGNvbnN0IGRlY3JlbWVudHMgPSAvKiogQHR5cGUge1RvdGFsTWFwPHN0cmluZywgbnVtYmVyPn0gKi8gKG5ldyBNYXAoKSk7XG4gIHVwQ291bnRlci5hZGRDYWxsYmFjayhvYnNlcnZlciA9PiB7XG4gICAgZm9yIChjb25zdCBbcXVldWVOYW1lLCB2YWx1ZV0gb2YgaW5jcmVtZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUodmFsdWUsIHsgcXVldWU6IHF1ZXVlTmFtZSB9KTtcbiAgICB9XG4gIH0pO1xuICBkb3duQ291bnRlci5hZGRDYWxsYmFjayhvYnNlcnZlciA9PiB7XG4gICAgZm9yIChjb25zdCBbcXVldWVOYW1lLCB2YWx1ZV0gb2YgZGVjcmVtZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUodmFsdWUsIHsgcXVldWU6IHF1ZXVlTmFtZSB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGxldCByZWFkeSA9IGZhbHNlO1xuICBjb25zdCBsZW5ndGhzID0gLyoqIEB0eXBlIHtUb3RhbE1hcDxzdHJpbmcsIG51bWJlcj59ICovIChuZXcgTWFwKCkpO1xuICBjb25zdCBudWRnZSA9IChxdWV1ZU5hbWUsIGRlbHRhLCBpbml0ID0gZmFsc2UpID0+IHtcbiAgICBpZiAoIWxlbmd0aHMuaGFzKHF1ZXVlTmFtZSkpIHtcbiAgICAgIGlmICghaW5pdCkgY29uc29sZT8ud2FybignVW5rbm93biBxdWV1ZScsIHF1ZXVlTmFtZSk7XG4gICAgICBsZW5ndGhzLnNldChxdWV1ZU5hbWUsIDApO1xuICAgICAgaW5jcmVtZW50cy5zZXQocXVldWVOYW1lLCAwKTtcbiAgICAgIGRlY3JlbWVudHMuc2V0KHF1ZXVlTmFtZSwgMCk7XG4gICAgfVxuICAgIGNvbnN0IG9sZExlbmd0aCA9IGxlbmd0aHMuZ2V0KHF1ZXVlTmFtZSk7XG4gICAgbGVuZ3Rocy5zZXQocXVldWVOYW1lLCBvbGRMZW5ndGggKyBkZWx0YSk7XG4gICAgY29uc3QgZGltZW5zaW9ucyA9IHsgcXVldWU6IHF1ZXVlTmFtZSB9O1xuICAgIGxlbmd0aENvdW50ZXIuYWRkKGRlbHRhLCBkaW1lbnNpb25zKTtcbiAgICBpZiAoaW5pdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoZGVsdGEgPiAwKSB7XG4gICAgICAvKiBUT0RPIHBlciBhYm92ZTogdXBDb3VudGVyLmFkZChkZWx0YSwgZGltZW5zaW9ucyk7Ki9cbiAgICAgIGluY3JlbWVudHMuc2V0KHF1ZXVlTmFtZSwgKGluY3JlbWVudHMuZ2V0KHF1ZXVlTmFtZSkgfHwgMCkgKyBkZWx0YSk7XG4gICAgfSBlbHNlIGlmIChkZWx0YSA8IDApIHtcbiAgICAgIC8qIFRPRE8gcGVyIGFib3ZlOiBkb3duQ291bnRlci5hZGQoLWRlbHRhLCBkaW1lbnNpb25zKTsqL1xuICAgICAgZGVjcmVtZW50cy5zZXQocXVldWVOYW1lLCAoZGVjcmVtZW50cy5nZXQocXVldWVOYW1lKSB8fCAwKSAtIGRlbHRhKTtcbiAgICB9XG4gICAgcmVhZHkgPSB0cnVlO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGluaXRMZW5ndGhzOiBpbml0aWFsTGVuZ3RocyA9PiB7XG4gICAgICAhcmVhZHkgfHxcbiAgICAgICAgY29uc29sZT8ud2FybihcbiAgICAgICAgICBgVW5leHBlY3RlZCByZXBlYXQgcXVldWUgbGVuZ3RoIGluaXRpYWxpemF0aW9uIGZyb20gJHtxKGxlbmd0aHMpfSB0byAke3EoaW5pdGlhbExlbmd0aHMpfWBcbiAgICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgW3F1ZXVlTmFtZSwgbmV3TGVuZ3RoXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsTGVuZ3RocykpIHtcbiAgICAgICAgaWYgKCFpc05hdChuZXdMZW5ndGgpKSB7XG4gICAgICAgICAgY29uc29sZT8ud2FybihgSW52YWxpZCBsZW5ndGggZm9yIHF1ZXVlICR7cShxdWV1ZU5hbWUpfTpgLCBuZXdMZW5ndGgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG51ZGdlKHF1ZXVlTmFtZSwgbmV3TGVuZ3RoLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVwZGF0ZUxlbmd0aHM6IG5ld0xlbmd0aHMgPT4ge1xuICAgICAgcmVhZHkgfHwgY29uc29sZT8ud2FybignTWlzc2luZyBpbml0aWFsIHF1ZXVlIGxlbmd0aHMnKTtcbiAgICAgIGZvciAoY29uc3QgW3F1ZXVlTmFtZSwgbmV3TGVuZ3RoXSBvZiBPYmplY3QuZW50cmllcyhuZXdMZW5ndGhzKSkge1xuICAgICAgICBpZiAoIWlzTmF0KG5ld0xlbmd0aCkpIHtcbiAgICAgICAgICBjb25zb2xlPy53YXJuKGBJbnZhbGlkIGxlbmd0aCBmb3IgcXVldWUgJHtxKHF1ZXVlTmFtZSl9OmAsIG5ld0xlbmd0aCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbnVkZ2UocXVldWVOYW1lLCBuZXdMZW5ndGggLSAobGVuZ3Rocy5nZXQocXVldWVOYW1lKSB8fCAwKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBpbmNMZW5ndGg6IChxdWV1ZU5hbWUsIGRlbHRhID0gMSkgPT4ge1xuICAgICAgaWYgKCFpc05hdChkZWx0YSkpIHtcbiAgICAgICAgY29uc29sZT8ud2FybihgSW52YWxpZCBpbmNyZW1lbnQgZm9yIHF1ZXVlICR7cShxdWV1ZU5hbWUpfTpgLCBkZWx0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG51ZGdlKHF1ZXVlTmFtZSwgZGVsdGEpO1xuICAgIH0sXG4gICAgZGVjTGVuZ3RoOiAocXVldWVOYW1lLCBkZWx0YSA9IDEpID0+IHtcbiAgICAgIGlmICghaXNOYXQoZGVsdGEpKSB7XG4gICAgICAgIGNvbnNvbGU/Lndhcm4oYEludmFsaWQgZGVjcmVtZW50IGZvciBxdWV1ZSAke3EocXVldWVOYW1lKX06YCwgZGVsdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBudWRnZShxdWV1ZU5hbWUsIC1kZWx0YSk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKiBBbGwgdGhlIGtlcm5lbCBtZXRyaWNzIHdlIGFyZSBwcmVwYXJlZCBmb3IuKi9cbi8qKiBAZW51bSB7KHR5cGVvZiBNZXRyaWNUeXBlKVtrZXlvZiB0eXBlb2YgTWV0cmljVHlwZV19IE1ldHJpY1R5cGUgKi8kaM2PX29uY2UubWFrZVF1ZXVlTWV0cmljcyhtYWtlUXVldWVNZXRyaWNzKTtcbmNvbnN0IE1ldHJpY1R5cGUgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBDb3VudGVyOiAnY291bnRlcicsXG4gIEdhdWdlOiAnZ2F1Z2UnLFxufSk7XG4vKipcbiAqIEB0eXBlZGVmIEtlcm5lbE1ldHJpY01ldGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcGVydHkge3sgZGltZW5zaW9uOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfX0gW3N1Yl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc2Vuc3VzXVxuICogQHByb3BlcnR5IHtNZXRyaWNUeXBlfSBtZXRyaWNUeXBlXG4gKi9cbi8qKiBAdHlwZSB7T21pdDxLZXJuZWxNZXRyaWNNZXRhLCAnbWV0cmljVHlwZSc+W119ICovXG4gICAgICAgY29uc3QgS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTID0gW1xuICB7XG4gICAga2V5OiAnc3lzY2FsbHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9hbGxfc3lzY2FsbF90b3RhbCcsXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxTZW5kJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3NlbmQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgbWVzc2FnZSBzZW5kIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsQ2FsbE5vdycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdjYWxsTm93JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHN5bmNocm9ub3VzIGRldmljZSBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFN1YnNjcmliZScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdzdWJzY3JpYmUnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgcHJvbWlzZSBzdWJzY3JpcHRpb24ga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxSZXNvbHZlJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3Jlc29sdmUnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgcHJvbWlzZSByZXNvbHV0aW9uIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsRXhpdCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdleGl0JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdCBleGl0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVHZXQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVHZXQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgZ2V0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVTZXQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVTZXQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgc2V0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVHZXROZXh0S2V5JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3ZhdHN0b3JlR2V0TmV4dCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXRzdG9yZSBnZXROZXh0S2V5IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVEZWxldGUnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVEZWxldGUnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgZGVsZXRlIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsRHJvcEltcG9ydHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnZHJvcEltcG9ydHMnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgZHJvcCBpbXBvcnRzIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkaXNwYXRjaGVzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZGlzcGF0Y2hfdG90YWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkaXNwYXRjaERlbGl2ZXInLFxuICAgIG5hbWU6ICdzd2luZ3NldF9kaXNwYXRjaF9kZWxpdmVyX3RvdGFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXQgbWVzc2FnZSBkZWxpdmVyaWVzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2Rpc3BhdGNoTm90aWZ5JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZGlzcGF0Y2hfbm90aWZ5X3RvdGFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXQgcHJvbWlzZSBub3RpZmljYXRpb25zJyxcbiAgfSxcbl07XG5cbi8qKiBAdHlwZSB7T21pdDxLZXJuZWxNZXRyaWNNZXRhLCAnbWV0cmljVHlwZSc+W119ICovJGjNj19vbmNlLktFUk5FTF9TVEFUU19TVU1fTUVUUklDUyhLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MpO1xuICAgICAgIGNvbnN0IEtFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyA9IFtcbiAge1xuICAgIGtleTogJ2tlcm5lbE9iamVjdHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9rZXJuZWxfb2JqZWN0cycsXG4gICAgZGVzY3JpcHRpb246ICdBY3RpdmUga2VybmVsIG9iamVjdHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna2VybmVsRGV2aWNlcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2tlcm5lbF9kZXZpY2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBrZXJuZWwgZGV2aWNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrZXJuZWxQcm9taXNlcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2tlcm5lbF9wcm9taXNlcycsXG4gICAgZGVzY3JpcHRpb246ICdBY3RpdmUga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2twVW5yZXNvbHZlZCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3VucmVzb2x2ZWRfa2VybmVsX3Byb21pc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ1VucmVzb2x2ZWQga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2twRnVsZmlsbGVkJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZnVsZmlsbGVkX2tlcm5lbF9wcm9taXNlcycsXG4gICAgZGVzY3JpcHRpb246ICdGdWxmaWxsZWQga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2twUmVqZWN0ZWQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9yZWplY3RlZF9rZXJuZWxfcHJvbWlzZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnUmVqZWN0ZWQga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3J1blF1ZXVlTGVuZ3RoJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfcnVuX3F1ZXVlX2xlbmd0aCcsXG4gICAgY29uc2Vuc3VzOiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOiAnTGVuZ3RoIG9mIHRoZSBrZXJuZWwgcnVuIHF1ZXVlJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2FjY2VwdGFuY2VRdWV1ZUxlbmd0aCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2FjY2VwdGFuY2VfcXVldWVfbGVuZ3RoJyxcbiAgICBjb25zZW5zdXM6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdMZW5ndGggb2YgdGhlIGtlcm5lbCBhY2NlcHRhbmNlIHF1ZXVlJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3Byb21pc2VRdWV1ZXNMZW5ndGgnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9wcm9taXNlX3F1ZXVlc19sZW5ndGgnLFxuICAgIGNvbnNlbnN1czogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ0NvbWJpbmVkIGxlbmd0aCBvZiBhbGwga2VybmVsIHByb21pc2UgcXVldWVzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NsaXN0RW50cmllcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2NsaXN0X2VudHJpZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGtlcm5lbCBjLWxpc3QnLFxuICB9LFxuICB7XG4gICAga2V5OiAndmF0cycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3ZhdHMnLFxuICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIGFjdGl2ZSB2YXRzJyxcbiAgfSxcbl07JGjNj19vbmNlLktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyhLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MpO1xuXG5jb25zdCB7IENvdW50ZXIsIEdhdWdlIH0gPSBNZXRyaWNUeXBlO1xuLyoqIEB0eXBlIHtLZXJuZWxNZXRyaWNNZXRhW119ICovXG4gICAgICAgY29uc3QgS0VSTkVMX1NUQVRTX01FVFJJQ1MgPSBoYXJkZW4oW1xuICAuLi5LRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MubWFwKG0gPT4gKHsgLi4ubSwgbWV0cmljVHlwZTogQ291bnRlciB9KSksXG4gIC4uLktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUy5tYXAobSA9PiAoeyAuLi5tLCBtZXRyaWNUeXBlOiBHYXVnZSB9KSksXG5dKTtcblxuLyogRW5zdXJlIGtlcm5lbCBzdGF0cyBrZXkgdW5pcXVlbmVzcy4qLyRozY9fb25jZS5LRVJORUxfU1RBVFNfTUVUUklDUyhLRVJORUxfU1RBVFNfTUVUUklDUyk7XG5jb25zdCBrZXJuZWxTdGF0c0tleXMgPSBuZXcgTWFwKCk7XG5mb3IgKGNvbnN0IHsga2V5IH0gb2YgS0VSTkVMX1NUQVRTX01FVFJJQ1MpIHtcbiAga2VybmVsU3RhdHNLZXlzLnNldChrZXksIChrZXJuZWxTdGF0c0tleXMuZ2V0KGtleSkgfHwgMCkgKyAxKTtcbn1cbmNvbnN0IGR1cGxpY2F0ZUtlcm5lbFN0YXRzS2V5cyA9IFsuLi5rZXJuZWxTdGF0c0tleXMuZW50cmllcygpXS5mbGF0TWFwKFxuICAoW2tleSwgdmFsdWVdKSA9PiAodmFsdWUgPiAxID8gW2tleV0gOiBbXSksXG4pO1xuaWYgKGR1cGxpY2F0ZUtlcm5lbFN0YXRzS2V5cy5sZW5ndGggPiAwKSB7XG4gIGNvbnN0IG1zZyA9IGBEdXBsaWNhdGUga2VybmVsIHN0YXRzIGtleXMgJHtKU09OLnN0cmluZ2lmeShkdXBsaWNhdGVLZXJuZWxTdGF0c0tleXMpfWA7XG4gIHRocm93IEVycm9yKG1zZyk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJISVNUT0dSQU1fTUVUUklDUyI6WyJISVNUT0dSQU1fTUVUUklDUyJdLCJCTE9DS19ISVNUT0dSQU1fTUVUUklDUyI6WyJCTE9DS19ISVNUT0dSQU1fTUVUUklDUyJdLCJRdWV1ZU1ldHJpY0FzcGVjdCI6WyJRdWV1ZU1ldHJpY0FzcGVjdCJdLCJtYWtlUXVldWVNZXRyaWNzTWV0YSI6WyJtYWtlUXVldWVNZXRyaWNzTWV0YSJdLCJtYWtlUXVldWVNZXRyaWNzIjpbIm1ha2VRdWV1ZU1ldHJpY3MiXSwiS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTIjpbIktFUk5FTF9TVEFUU19TVU1fTUVUUklDUyJdLCJLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MiOlsiS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTIl0sIktFUk5FTF9TVEFUU19NRVRSSUNTIjpbIktFUk5FTF9TVEFUU19NRVRSSUNTIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIq5WvK2DgAAtg4AACsAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbmF0dXJhbC1zb3J0LmpzeyJpbXBvcnRzIjpbIi4vanMtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJuYXR1cmFsQ29tcGFyZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHByb3ZpZGVMYXp5TWFwOyRozY9faW1wb3J0cyhbW1wiLi9qcy11dGlscy5qc1wiLCBbW1wicHJvdmlkZUxhenlNYXBcIixbJGjNj19hID0+IChwcm92aWRlTGF6eU1hcCA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuY29uc3QgY29tcGFyZU5hdHMgPSAoYSwgYikgPT4ge1xuICAvKiBEZWZhdWx0IHRvIElFRUUgNzU0IG51bWJlciBhcml0aG1ldGljIGZvciBzcGVlZCwgYnV0IGZhbGwgYmFjayBvbiBiaWdpbnQqL1xuICAvKiBhcml0aG1ldGljIHRvIHJlc29sdmUgdGllcyBiZWNhdXNlIGJpZyBudW1iZXJzIGNhbiBsb3NlIHJlc29sdXRpb24qL1xuICAvKiAoc29tZXRpbWVzIGV2ZW4gYmVjb21pbmcgaW5maW5pdGUpIGFuZCB0aGVuIHVsdGltYXRlbHkgb24gbGVuZ3RoIHRvIHJlc29sdmUqL1xuICAvKiB0aWVzIGJ5IGFzY2VuZGluZyBjb3VudCBvZiBsZWFkaW5nIHplcm9zLiovXG4gIGNvbnN0IGRpZmYgPSArYSAtICtiO1xuICBjb25zdCBmaW5pdGVEaWZmID1cbiAgICAoTnVtYmVyLmlzRmluaXRlKGRpZmYpICYmIGRpZmYpIHx8XG4gICAgKGEgPT09IGIgPyAwIDogTnVtYmVyKEJpZ0ludChhKSAtIEJpZ0ludChiKSkgfHwgYS5sZW5ndGggLSBiLmxlbmd0aCk7XG5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciB0aGlzIGNhbGwgcmVhbGx5IGRvZXMgcmV0dXJuIC0xIHwgMCB8IDEqL1xuICByZXR1cm4gTWF0aC5zaWduKGZpbml0ZURpZmYpO1xufTtcblxuLyogVE9ETzogY29tcGFyZUJ5Q29kZVBvaW50cyovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8yMDA4Ki9cblxuY29uc3QgY29tcGFyZVN0cmluZ3MgPSAoYSwgYikgPT4gKGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwKTtcblxuY29uc3QgckNhcHR1cmVEaWdpdHMgPSAvKFswLTldKykvO1xuXG4vKipcbiAqIFNwbGl0dGluZyBieSByZWd1bGFyIGV4cHJlc3Npb24gY2FuIGJlIGV4cGVuc2l2ZTsgd2UgZG9uJ3Qgd2FudCB0byByZXBlYXRcbiAqIHRoYXQgZm9yIGV2ZXJ5IGNvbXBhcmlzb24gYWdhaW5zdCB0aGUgc2FtZSBzdHJpbmcuXG4gKlxuICogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZ1tdPn1cbiAqL1xuY29uc3QgcGFydHNDYWNoZSA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBQZXJmb3JtIGEgbXVsdGktbGV2ZWwgbmF0dXJhbC1zb3J0IGNvbXBhcmlzb24sIGZpbmRpbmcgdGhlIGRlY2ltYWwgZGlnaXRcbiAqIHNlcXVlbmNlcyBpbiBlYWNoIG9wZXJhbmQgYW5kIGNvbXBhcmluZyBmaXJzdCBieSBlYWNoIChbcG9zc2libHkgZW1wdHldXG4gKiBzdHJpbmcgcHJlZml4LCBpbnRlZ2VyKSBwYWlyIGluIHR1cm4sIHdpdGggYSBmaW5hbCBjb21wYXJpc2lvbiBieSBzdHJpbmdcbiAqIHN1ZmZpeCBhcyBuZWNlc3NhcnkgKGUuZy4sIHNvcnRpbmcgJ2tvNDInIGJlZm9yZSAna28xMDAnIGFzIFsna28nLCA0Ml0gdnMuXG4gKiBbJ2tvJywgMTAwXSBhbmQgJ3BhcmVudDEuY2hpbGQ4JyBiZWZvcmUgJ3BhcmVudDEuY2hpbGQxMCcgYXMgWydwYXJlbnQnLCAxLFxuICogJ2NoaWxkJywgOF0gdnMuIFsncGFyZW50JywgMSwgJ2NoaWxkJywgMTBdKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYVxuICogQHBhcmFtIHtzdHJpbmd9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG4gICAgICAgY29uc3QgbmF0dXJhbENvbXBhcmUgPSAoYSwgYikgPT4ge1xuICAvKiBXZSB3YW50IHRvIG1haW50YWluIGEgY2FjaGUgb25seSBmb3IgdGhlIGR1cmF0aW9uIG9mIGVhY2ggY2FsbCB0byovXG4gIC8qIGFycmF5LnNvcnQsIGFuZCBsZXZlcmFnZSB0aGUgc3luY2hyb25vdXMgbmF0dXJlIG9mIHRoYXQgbWV0aG9kIGluIHRoZSBmaXJzdCovXG4gIC8qIGludm9jYXRpb24gb2YgZWFjaCB0dXJuIChpbmRpY2F0ZWQgYnkgYW4gZW1wdHkgY2FjaGUpIHRvIHNjaGVkdWxlIGNhY2hlKi9cbiAgLyogY2xlYXJpbmcgaW4gdGhlICpuZXh0KiB0dXJuLiovXG4gIGlmICghcGFydHNDYWNoZS5zaXplKSB2b2lkIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gcGFydHNDYWNoZS5jbGVhcigpKTtcblxuICBjb25zdCBhUGFydHMgPSBwcm92aWRlTGF6eU1hcChwYXJ0c0NhY2hlLCBhLCAoKSA9PiBhLnNwbGl0KHJDYXB0dXJlRGlnaXRzKSk7XG4gIGNvbnN0IGJQYXJ0cyA9IHByb3ZpZGVMYXp5TWFwKHBhcnRzQ2FjaGUsIGIsICgpID0+IGIuc3BsaXQockNhcHR1cmVEaWdpdHMpKTtcblxuICAvKiBBbiBldmVuIGluZGV4IGNvcnJlc3BvbmRzIHdpdGggYSBzdHJpbmcgcGFydDsgYW4gb2RkIG9uZSB3aXRoIGEgZGlnaXQgcGFydC4qL1xuICBsZXQgaSA9IDA7XG4gIGZvciAoOyBpICsgMSA8IGFQYXJ0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgIGlmIChpICsgMSA8IGJQYXJ0cy5sZW5ndGgpIHtcbiAgICAgIC8qIEJvdGggYGFgIGFuZCBgYmAgaGF2ZSBhIGRpZ2l0IHBhcnQgaGVyZSwgYnV0IHdlIGNvbXBhcmUgdGhlIHByZWNlZGluZyovXG4gICAgICAvKiBzdHJpbmcgcGFydCBmaXJzdCBpbiBjYXNlIHRob3NlIGFyZSB1bmVxdWFsLiovXG4gICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICBjb21wYXJlU3RyaW5ncyhhUGFydHNbaV0sIGJQYXJ0c1tpXSkgfHxcbiAgICAgICAgY29tcGFyZU5hdHMoYVBhcnRzW2kgKyAxXSwgYlBhcnRzW2kgKyAxXSk7XG4gICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBBZnRlciBhIChwb3NzaWJseSBlbXB0eSkgY29tbW9uIHByZWZpeCwgYGFgIGhhcyBkaWdpdHMgd2hlcmUgYGJgIGRvZXMqL1xuICAgICAgLyogbm90LCBzbyB3ZSB1c2Ugc3RyaW5nIGNvbXBhcmlzb24gb2YgYCR7YVN0cmluZ30ke2FEaWdpdHN9YCB2cy4qL1xuICAgICAgLyogYCR7YlN0cmluZ31gLiovXG4gICAgICByZXR1cm4gY29tcGFyZVN0cmluZ3MoYCR7YVBhcnRzW2ldfSR7YVBhcnRzW2kgKyAxXX1gLCBiUGFydHNbaV0pO1xuICAgIH1cbiAgfVxuICBpZiAoYlBhcnRzLmxlbmd0aCA+IGFQYXJ0cy5sZW5ndGgpIHtcbiAgICAvKiBgYmAgaGFzIGRpZ2l0cyB3aGVyZSBgYWAgZG9lcyBub3QuKi9cbiAgICByZXR1cm4gY29tcGFyZVN0cmluZ3MoYVBhcnRzW2ldLCBgJHtiUGFydHNbaV19JHtiUGFydHNbaSArIDFdfWApO1xuICB9XG4gIC8qIElmIGBhYCBhbmQgYGJgIGRpZmZlciwgaXQncyBvbmx5IGluIHRoZSBmaW5hbCBzdHJpbmcgc3VmZml4LiovXG4gIHJldHVybiBjb21wYXJlU3RyaW5ncyhhUGFydHNbaV0sIGJQYXJ0c1tpXSk7XG59OyRozY9fb25jZS5uYXR1cmFsQ29tcGFyZShuYXR1cmFsQ29tcGFyZSk7XG5oYXJkZW4obmF0dXJhbENvbXBhcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0dXJhbENvbXBhcmUiOlsibmF0dXJhbENvbXBhcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAT8Qll2pIAABqSAAAKAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9zZXMtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1ldGEtbWFwLmpzIiwiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9zdHJlYW0iLCJqZXNzaWUuanMiLCIuL2pzLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIiwiYWdncmVnYXRlVHJ5RmluYWxseSIsImFsbFZhbHVlcyIsImFzc2VydEFsbERlZmluZWQiLCJhdHRlbnVhdGUiLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiLCJmb3JldmVyIiwiZnJvbVVuaXF1ZUVudHJpZXMiLCJtYWtlTGltaXRlZENvbnNvbGUiLCJvYmplY3RNYXAiLCJvYmplY3RNZXRhTWFwIiwic3RyaXBQcmVmaXgiLCJzeW5jaHJvbml6ZWRUZWUiLCJ0aHJvd0Vycm9yQ29kZSIsInRyeUpzb25QYXJzZSIsInRyeU5vdyIsInVudGlsVHJ1ZSIsIndoaWxlVHJ1ZSIsIndpdGhEZWZlcnJlZENsZWFudXAiLCJ6aXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBvYmplY3RNYXAsb2JqZWN0TWV0YU1hcCxmcm9tVW5pcXVlRW50cmllcyxxLGIsRmFpbCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixYLGRlZXBseUZ1bGZpbGxlZCxpc1ByaW1pdGl2ZSxtYWtlUHJvbWlzZUtpdCxtYWtlUXVldWUsYXN5bmNHZW5lcmF0ZSxsb2dMZXZlbHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKSwkaM2PX2xpdmVbXCJvYmplY3RNYXBcIl1dXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanNcIiwgW1tcIm9iamVjdE1ldGFNYXBcIixbJGjNj19hID0+IChvYmplY3RNZXRhTWFwID0gJGjNj19hKSwkaM2PX2xpdmVbXCJvYmplY3RNZXRhTWFwXCJdXV1dXSxbXCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qc1wiLCBbW1wiZnJvbVVuaXF1ZUVudHJpZXNcIixbJGjNj19hID0+IChmcm9tVW5pcXVlRW50cmllcyA9ICRozY9fYSksJGjNj19saXZlW1wiZnJvbVVuaXF1ZUVudHJpZXNcIl1dXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiYlwiLFskaM2PX2EgPT4gKGIgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsWyRozY9fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjNj19hKV1dLFtcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3N0cmVhbVwiLCBbW1wibWFrZVF1ZXVlXCIsWyRozY9fYSA9PiAobWFrZVF1ZXVlID0gJGjNj19hKV1dXV0sW1wiamVzc2llLmpzXCIsIFtbXCJhc3luY0dlbmVyYXRlXCIsWyRozY9fYSA9PiAoYXN5bmNHZW5lcmF0ZSA9ICRozY9fYSldXV1dLFtcIi4vanMtdXRpbHMuanNcIiwgW1tcImxvZ0xldmVsc1wiLFskaM2PX2EgPT4gKGxvZ0xldmVscyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgZnJvbUVudHJpZXMsIGtleXMsIHZhbHVlcyB9ID0gT2JqZWN0O1xuXG4vKiogQHBhcmFtIHsobGV2ZWw6IHN0cmluZykgPT4gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZH0gbWFrZUxvZ2dlciAqL1xuICAgICAgIGNvbnN0IG1ha2VMaW1pdGVkQ29uc29sZSA9IG1ha2VMb2dnZXIgPT4ge1xuICBjb25zdCBsaW1pdGVkQ29uc29sZSA9IC8qKiBAdHlwZSB7YW55fSAqLyAoXG4gICAgZnJvbUVudHJpZXMobG9nTGV2ZWxzLm1hcChsZXZlbCA9PiBbbGV2ZWwsIG1ha2VMb2dnZXIobGV2ZWwpXSkpXG4gICk7XG4gIHJldHVybiAvKiogQHR5cGUge0xpbWl0ZWRDb25zb2xlfSAqLyAoaGFyZGVuKGxpbWl0ZWRDb25zb2xlKSk7XG59OyRozY9fb25jZS5tYWtlTGltaXRlZENvbnNvbGUobWFrZUxpbWl0ZWRDb25zb2xlKTtcbmhhcmRlbihtYWtlTGltaXRlZENvbnNvbGUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7eyBbS2V5VHlwZSBpbiBrZXlvZiBUXTogVFtLZXlUeXBlXSB9ICYge319IFNpbXBsaWZ5IGZsYXR0ZW4gdGhlXG4gKiAgIHR5cGUgb3V0cHV0IHRvIGltcHJvdmUgdHlwZSBoaW50cyBzaG93biBpbiBlZGl0b3JzXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0L2Jsb2IvbWFpbi9zb3VyY2Uvc2ltcGxpZnkuZC50c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHR5cGVkZWYge3tcbiAqICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBDYWxsYWJsZSA/IFRbS10gOiBEZWVwbHlBd2FpdGVkPFRbS10+O1xuICogfX0gRGVlcGx5QXdhaXRlZE9iamVjdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgUHJvbWlzZUxpa2U8YW55PlxuICogICAgID8gQXdhaXRlZDxUPlxuICogICAgIDogVCBleHRlbmRzIFJlbW90YWJsZUJyYW5kPGFueSwgYW55PiB8IFJlbW90YWJsZU9iamVjdFxuICogICAgICAgPyBUXG4gKiAgICAgICA6IFQgZXh0ZW5kcyB7fVxuICogICAgICAgICA/IFNpbXBsaWZ5PERlZXBseUF3YWl0ZWRPYmplY3Q8VD4+XG4gKiAgICAgICAgIDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogQSBtb3JlIGNvbnN0cmFpbmVkIHZlcnNpb24gb2Yge2RlZXBseUZ1bGZpbGxlZH0gZm9yIHR5cGUgc2FmZXR5IHVudGlsXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzEyNTcgVXNlZnVsIGluIHN0YXJ0aW5nIGNvbnRyYWN0cyB0aGF0XG4gKiBuZWVkIGFsbCB0ZXJtcyB0byBiZSBmdWxmaWxsZWQgaW4gb3JkZXIgdG8gYmUgZHVyYWJsZS5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyB7fT4odW5mdWxmaWxsZWRUZXJtczogVCkgPT4gUHJvbWlzZTxEZWVwbHlBd2FpdGVkPFQ+Pn1cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBseUZ1bGZpbGxlZE9iamVjdCA9IGFzeW5jIG9iaiA9PiB7XG4gICFpc1ByaW1pdGl2ZShvYmopIHx8IEZhaWxgcGFyYW0gbXVzdCBiZSBhbiBvYmplY3RgO1xuICByZXR1cm4gZGVlcGx5RnVsZmlsbGVkKG9iaik7XG59O1xuXG4vKipcbiAqIFRvbGVyYXRlIGFic2VuY2Ugb2YgQWdncmVnYXRlRXJyb3IgaW4gZS5nLiB4c25hcC5cbiAqXG4gKiBAdHlwZSB7KGVycm9yczogRXJyb3JbXSwgbWVzc2FnZT86IHN0cmluZywgb3B0aW9ucz86IG9iamVjdCkgPT4gRXJyb3J9XG4gKi8kaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkT2JqZWN0KGRlZXBseUZ1bGZpbGxlZE9iamVjdCk7XG5jb25zdCBtYWtlQWdncmVnYXRlRXJyb3IgPVxuICB0eXBlb2YgQWdncmVnYXRlRXJyb3IgPT09ICdmdW5jdGlvbidcbiAgICA/IChlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpID0+IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgbWVzc2FnZSwgb3B0aW9ucylcbiAgICA6IChlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgcmV0dXJuIG1ha2VFcnJvcihtZXNzYWdlID8/ICdtdWx0aXBsZSBlcnJvcnMnLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIGVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4vKipcbiAqIEFzc2VydCB0aGF0IGEgc3RyaW5nIGhhcyBhIHByZWZpeCwgYW5kIHJldHVybiB0aGUgcGFydCB0aGF0IGZvbGxvd3MgaXQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuICAgICAgIGNvbnN0IHN0cmlwUHJlZml4ID0gKHByZWZpeCwgc3RyKSA9PiB7XG4gIHN0ci5zdGFydHNXaXRoKHByZWZpeCkgfHwgRmFpbGAke3N0cn0gaXMgbWlzc2luZyBwcmVmaXggJHtxKHByZWZpeCl9YDtcbiAgcmV0dXJuIHN0ci5zbGljZShwcmVmaXgubGVuZ3RoKTtcbn07XG5cbi8qKlxuICogVGhyb3cgYW4gZXJyb3Igd2l0aCBhbiBvd24gXCJjb2RlXCIgZGF0YSBwcm9wZXJ0eSwgc3VwcG9ydGluZyBpZGVudGlmaWNhdGlvblxuICogd2l0aG91dCBwYXJzaW5nIGBtZXNzYWdlYC4gTm90ZSB0aGF0IHN1Y2ggZXJyb3JzIGFyZSBub3QgUGFzc2FibGUgYW5kIHRodXNcbiAqIGNhbm5vdCBhcHBlYXIgaW5zaWRlIGEgUGFzc2FibGUgc3RydWN0dXJlLCBhbmQgZXZlbiBhdCB0b3AgbGV2ZWwgdGhlIFwiY29kZVwiXG4gKiBwcm9wZXJ0eSB3aWxsIGJlIHNpbGVudGx5IGRyb3BwZWQgYnkgbWFyc2hhbGxpbmcuXG4gKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IENvZGVcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczx0eXBlb2YgbWFrZUVycm9yPlswXX0gZGV0YWlsc1xuICogQHBhcmFtIHtDb2RlfSBjb2RlXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8dHlwZW9mIG1ha2VFcnJvcj5bMl0gJiB7XG4gKiAgIGNvbnN0cnVjdG9yPzogUGFyYW1ldGVyczx0eXBlb2YgbWFrZUVycm9yPlsxXTtcbiAqIH19IFtvcHRzXVxuICovJGjNj19vbmNlLnN0cmlwUHJlZml4KHN0cmlwUHJlZml4KTtcbiAgICAgICBjb25zdCB0aHJvd0Vycm9yQ29kZSA9IChkZXRhaWxzLCBjb2RlLCBvcHRzKSA9PiB7XG4gIGNvbnN0IGVyciA9IG1ha2VFcnJvcihkZXRhaWxzLCBvcHRzPy5jb25zdHJ1Y3Rvciwge1xuICAgIC4uLm9wdHMsXG4gICAgc2FuaXRpemU6IGZhbHNlLFxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ2NvZGUnLCB7IHZhbHVlOiBjb2RlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICBoYXJkZW4oZXJyKTtcbiAgdGhyb3cgZXJyO1xufTtcblxuLyoqXG4gKiBTeW5jaHJvbnVzbHkgaW52b2tlIGEgZnVuY3Rpb24gd2l0aCB0aGUgb3Bwb3J0dW5pdHkgdG8gaGFuZGxlIGFueSBlcnJvclxuICogc2ltaWxhcmx5IHRvIGEgUHJvbWlzZSBgY2F0Y2hgIGNhbGxiYWNrIChlLmcuLCBzdWJzdGl0dXRpbmcgYSBub24tZXJyb3JcbiAqIHJldHVybmVkIHZhbHVlIG9yIHRocm93aW5nIGEgcG9zc2libHktbmV3IGVycm9yKS4gVGhpcyBpcyB1c2VmdWwgZm9yIChhbW9uZ1xuICogb3RoZXIgdGhpbmdzKSByZXBsYWNpbmcgZ2VuZXJpYyBlcnJvciBtZXNzYWdlcyB3aXRoIHNwZWNpZmljIG9uZXMgKGFzIGluXG4gKiB7QHNlZSB0cnlKc29uUGFyc2V9KS5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBGXG4gKiBAdGVtcGxhdGUgW1U9UmV0dXJuVHlwZTxGPl1cbiAqIEBwYXJhbSB7Rn0gZm4gdG8gaW52b2tlXG4gKiBAcGFyYW0geyhlcnI6IEVycm9yKSA9PiBVfSB0cmFuc2Zvcm1FcnJvciBjYWxsYmFjayB0byByZWNlaXZlIGFueSBlcnJvciBmcm9tXG4gKiAgIGludm9raW5nIGBmbmAgYW5kIGVpdGhlciByZXR1cm4gYSBzdWJzdGl0dXRlIHZhbHVlIG9yIHRocm93IGEgcG90ZW50aWFsbHlcbiAqICAgbmV3IGVycm9yXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8Rj59IGFyZ3MgZm9yIGBmbmBcbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPEY+IHwgVX1cbiAqLyRozY9fb25jZS50aHJvd0Vycm9yQ29kZSh0aHJvd0Vycm9yQ29kZSk7XG4gICAgICAgY29uc3QgdHJ5Tm93ID0gKGZuLCB0cmFuc2Zvcm1FcnJvciwgLi4uYXJncykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBmbiguLi5hcmdzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0cmFuc2Zvcm1FcnJvcihlcnIpO1xuICAgIH0gY2F0Y2ggKG5ld0Vycikge1xuICAgICAgLyogVHJ5IHRvIGFzc29jaWF0ZSBgZXJyYCB3aXRoIGBuZXdFcnJgLiovXG4gICAgICBpZiAoIW5ld0Vyci5jYXVzZSkge1xuICAgICAgICBjb25zdCBkZXNjID0ge1xuICAgICAgICAgIHZhbHVlOiBlcnIsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoIVJlZmxlY3QuZGVmaW5lUHJvcGVydHkobmV3RXJyLCAnY2F1c2UnLCBkZXNjKSkge1xuICAgICAgICAgIGFzc2VydC5ub3RlKG5ld0VyciwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXdFcnI7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFBhcnNlIEpTT04gdGV4dCwgb3IgaGFuZGxlIGFuIGVycm9yIGJ5IGUuZy4gc3Vic3RpdHV0aW5nIGEgZGVmYXVsdCB2YWx1ZSBvclxuICogcmVwbGFjaW5nIGl0IHdpdGggb25lIGJlYXJpbmcgYSBub24tZ2VuZXJpYyBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBqc29uVGV4dFxuICogQHBhcmFtIHtzdHJpbmcgfCAoKGVycjogRXJyb3IpID0+IHVua25vd24pfSBvbkVycm9yIGFuIGVycm9yIG1lc3NhZ2Ugb3JcbiAqICAgY2FsbGJhY2tcbiAqLyRozY9fb25jZS50cnlOb3codHJ5Tm93KTtcbiAgICAgICBjb25zdCB0cnlKc29uUGFyc2UgPSAoanNvblRleHQsIG9uRXJyb3IpID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtRXJyb3IgPVxuICAgIHR5cGVvZiBvbkVycm9yID09PSAnZnVuY3Rpb24nXG4gICAgICA/IG9uRXJyb3JcbiAgICAgIDogZXJyID0+IEZhaWwoW2Ake29uRXJyb3J9OiAke2Vyci5tZXNzYWdlfSBmb3IgaW5wdXQgYCwgJyddLCBqc29uVGV4dCk7XG4gIHJldHVybiB0cnlOb3coKCkgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YganNvblRleHQ7XG4gICAgdHlwZSA9PT0gJ3N0cmluZycgfHwgRmFpbGBJbnB1dCBtdXN0IGJlIGEgc3RyaW5nLCBub3QgJHtiKHR5cGUpfWA7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblRleHQpO1xuICB9LCB0cmFuc2Zvcm1FcnJvcik7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3JlYWRvbmx5IChUIHwgUHJvbWlzZUxpa2U8VD4pW119IGl0ZW1zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUW10+fVxuICovJGjNj19vbmNlLnRyeUpzb25QYXJzZSh0cnlKc29uUGFyc2UpO1xuICAgICAgIGNvbnN0IFByb21pc2VBbGxPckVycm9ycyA9IGFzeW5jIGl0ZW1zID0+IHtcbiAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChpdGVtcykudGhlbihyZXN1bHRzID0+IHtcbiAgICBjb25zdCBlcnJvcnMgPSAvKiogQHR5cGUge1Byb21pc2VSZWplY3RlZFJlc3VsdFtdfSAqLyAoXG4gICAgICByZXN1bHRzLmZpbHRlcigoeyBzdGF0dXMgfSkgPT4gc3RhdHVzID09PSAncmVqZWN0ZWQnKVxuICAgICkubWFwKHJlc3VsdCA9PiByZXN1bHQucmVhc29uKTtcbiAgICBpZiAoIWVycm9ycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge1Byb21pc2VGdWxmaWxsZWRSZXN1bHQ8VD5bXX0gKi8gKHJlc3VsdHMpLm1hcChcbiAgICAgICAgcmVzdWx0ID0+IHJlc3VsdC52YWx1ZSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aHJvdyBlcnJvcnNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG1ha2VBZ2dyZWdhdGVFcnJvcihlcnJvcnMpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IHRyaWVyXG4gKiBAcGFyYW0geyhlcnJvcj86IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj59IGZpbmFsaXplclxuICogQHJldHVybnMge1JldHVyblR5cGU8dHJpZXI+fVxuICovJGjNj19vbmNlLlByb21pc2VBbGxPckVycm9ycyhQcm9taXNlQWxsT3JFcnJvcnMpO1xuICAgICAgIGNvbnN0IGFnZ3JlZ2F0ZVRyeUZpbmFsbHkgPSBhc3luYyAodHJpZXIsIGZpbmFsaXplcikgPT5cbiAgdHJpZXIoKS50aGVuKFxuICAgIGFzeW5jIHJlc3VsdCA9PiBmaW5hbGl6ZXIoKS50aGVuKCgpID0+IHJlc3VsdCksXG4gICAgYXN5bmMgdHJ5RXJyb3IgPT5cbiAgICAgIGZpbmFsaXplcih0cnlFcnJvcilcbiAgICAgICAgLnRoZW4oXG4gICAgICAgICAgKCkgPT4gdHJ5RXJyb3IsXG4gICAgICAgICAgZmluYWxpemVFcnJvciA9PiBtYWtlQWdncmVnYXRlRXJyb3IoW3RyeUVycm9yLCBmaW5hbGl6ZUVycm9yXSksXG4gICAgICAgIClcbiAgICAgICAgLnRoZW4oZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKSxcbiAgKTtcblxuLyoqXG4gKiBSdW4gYSBmdW5jdGlvbiB3aXRoIHRoZSBhYmlsaXR5IHRvIGRlZmVyIGxhc3QtaW4tZmlyc3Qtb3V0IGNsZWFudXAgY2FsbGJhY2tzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geyhcbiAqICAgYWRkQ2xlYW51cDogKGZuOiAoZXJyPzogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPikgPT4gdm9pZCxcbiAqICkgPT4gUHJvbWlzZTxUPn0gZm5cbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPGZuPn1cbiAqLyRozY9fb25jZS5hZ2dyZWdhdGVUcnlGaW5hbGx5KGFnZ3JlZ2F0ZVRyeUZpbmFsbHkpO1xuICAgICAgIGNvbnN0IHdpdGhEZWZlcnJlZENsZWFudXAgPSBhc3luYyBmbiA9PiB7XG4gIC8qKiBAdHlwZSB7KChlcnI/OiB1bmtub3duKSA9PiB1bmtub3duKVtdfSAqL1xuICBjb25zdCBjbGVhbnVwc0xJRk8gPSBbXTtcbiAgLyoqIEB0eXBlIHsoY2xlYW51cDogKGVycj86IHVua25vd24pID0+IHVua25vd24pID0+IHZvaWR9ICovXG4gIGNvbnN0IGFkZENsZWFudXAgPSBjbGVhbnVwID0+IHtcbiAgICBjbGVhbnVwc0xJRk8udW5zaGlmdChjbGVhbnVwKTtcbiAgfTtcbiAgLyoqIEB0eXBlIHsoZXJyPzogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPn0gKi9cbiAgY29uc3QgZmluYWxpemVyID0gYXN5bmMgZXJyID0+IHtcbiAgICAvKiBSdW4gZWFjaCBjbGVhbnVwIGluIGl0cyBvd24gaXNvbGF0ZWQgc3RhY2suKi9cbiAgICBjb25zdCBjbGVhbnVwUmVzdWx0cyA9IGNsZWFudXBzTElGTy5tYXAoYXN5bmMgY2xlYW51cCA9PiB7XG4gICAgICBhd2FpdCBudWxsO1xuICAgICAgcmV0dXJuIGNsZWFudXAoZXJyKTtcbiAgICB9KTtcbiAgICBhd2FpdCBQcm9taXNlQWxsT3JFcnJvcnMoY2xlYW51cFJlc3VsdHMpO1xuICB9O1xuICByZXR1cm4gYWdncmVnYXRlVHJ5RmluYWxseSgoKSA9PiBmbihhZGRDbGVhbnVwKSwgZmluYWxpemVyKTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gVFxuICogQHR5cGVkZWYge3sgW1AgaW4ga2V5b2YgVF06IEV4Y2x1ZGU8VFtQXSwgdW5kZWZpbmVkPiB9fSBBbGxEZWZpbmVkXG4gKi9cblxuLyoqXG4gKiBDb25jaXNlIHdheSB0byBjaGVjayB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBmcm9tIG9iamVjdCBsaXRlcmFsIHNob3J0aGFuZC5cbiAqIFRocm93cyBlcnJvciBtZXNzYWdlIHRvIHNwZWNpZnkgdGhlIG1pc3NpbmcgdmFsdWVzLlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpID0+IGFzc2VydHMgb2JqIGlzIEFsbERlZmluZWQ8VD59XG4gKiBAdGhyb3dzIGlmIGFueSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGVudHJpZXMgaXMgbm90IGRlZmluZWRcbiAqLyRozY9fb25jZS53aXRoRGVmZXJyZWRDbGVhbnVwKHdpdGhEZWZlcnJlZENsZWFudXApO1xuICAgICAgIGNvbnN0IGFzc2VydEFsbERlZmluZWQgPSBvYmogPT4ge1xuICBjb25zdCBtaXNzaW5nID0gW107XG4gIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtaXNzaW5nLnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgIEZhaWxgbWlzc2luZyAke3EobWlzc2luZyl9YDtcbiAgfVxufTtcblxuLyoqXG4gKiBBdHRlbnVhdGUgYHNwZWNpbWVuYCB0byBvbmx5IHByb3BlcnRpZXMgYWxsb3dlZCBieSBgcGVybWl0YC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtQZXJtaXQ8VD59IFBcbiAqIEBwYXJhbSB7VH0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UH0gcGVybWl0XG4gKiBAcGFyYW0gezxVLCBTdWJQIGV4dGVuZHMgUGVybWl0PFU+PihhdHRlbnVhdGlvbjogVSwgcGVybWl0OiBTdWJQKSA9PiBVfSBbdHJhbnNmb3JtXVxuICogICB1c2VkIHRvIHJlcGxhY2UgdGhlIHJlc3VsdHMgb2YgcmVjdXJzaXZlIHBpY2tzIChidXQgbm90IGJsYW5rZXQgcGVybWl0cylcbiAqIEByZXR1cm5zIHtBdHRlbnVhdGVkPFQsIFA+fVxuICovJGjNj19vbmNlLmFzc2VydEFsbERlZmluZWQoYXNzZXJ0QWxsRGVmaW5lZCk7XG4gICAgICAgY29uc3QgYXR0ZW51YXRlID0gKHNwZWNpbWVuLCBwZXJtaXQsIHRyYW5zZm9ybSA9IHggPT4geCkgPT4ge1xuICAvKiBGYXN0LXBhdGggZm9yIG5vIGF0dGVudWF0aW9uLiovXG4gIGlmIChwZXJtaXQgPT09IHRydWUgfHwgdHlwZW9mIHBlcm1pdCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtBdHRlbnVhdGVkPFQsIFA+fSAqLyAoc3BlY2ltZW4pO1xuICB9XG5cbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgcGF0aCA9IFtdO1xuICAvKipcbiAqIEB0ZW1wbGF0ZSBTdWJUXG4gKiBAdGVtcGxhdGUge0V4Y2x1ZGU8UGVybWl0PFN1YlQ+LCBQcmltaXRpdmU+fSBTdWJQXG4gKiBAdHlwZSB7KHNwZWNpbWVuOiBTdWJULCBwZXJtaXQ6IFN1YlApID0+IEF0dGVudWF0ZWQ8U3ViVCwgU3ViUD59XG4gKi9cbiAgY29uc3QgZXh0cmFjdCA9IChzdWJTcGVjaW1lbiwgc3ViUGVybWl0KSA9PiB7XG4gICAgaWYgKHN1YlBlcm1pdCA9PT0gbnVsbCB8fCB0eXBlb2Ygc3ViUGVybWl0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgcGF0aC5sZW5ndGggPT09IDBcbiAgICAgICAgPyBGYWlsYGludmFsaWQgcGVybWl0OiAke3EocGVybWl0KX1gXG4gICAgICAgIDogRmFpbGBpbnZhbGlkIHBlcm1pdCBhdCBwYXRoICR7cShwYXRoKX06ICR7cShzdWJQZXJtaXQpfWA7XG4gICAgfSBlbHNlIGlmIChzdWJTcGVjaW1lbiA9PT0gbnVsbCB8fCB0eXBlb2Ygc3ViU3BlY2ltZW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBwYXRoLmxlbmd0aCA9PT0gMFxuICAgICAgICA/IEZhaWxgc3BlY2ltZW4gbXVzdCBiZSBhbiBvYmplY3QgZm9yIHBlcm1pdCAke3EocGVybWl0KX1gXG4gICAgICAgIDogRmFpbGBzcGVjaW1lbiBhdCBwYXRoICR7cShwYXRoKX0gbXVzdCBiZSBhbiBvYmplY3QgZm9yIHBlcm1pdCAke3Eoc3ViUGVybWl0KX1gO1xuICAgIH1cbiAgICBjb25zdCBwaWNrcyA9IE9iamVjdC5lbnRyaWVzKHN1YlBlcm1pdCkubWFwKChbc3ViS2V5LCBkZWVwUGVybWl0XSkgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaGFzT3duKHN1YlNwZWNpbWVuLCBzdWJLZXkpKSB7XG4gICAgICAgIHRocm93IEZhaWxgc3BlY2ltZW4gaXMgbWlzc2luZyBwYXRoICR7cShwYXRoLmNvbmNhdChzdWJLZXkpKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVlcFNwZWNpbWVuID0gUmVmbGVjdC5nZXQoc3ViU3BlY2ltZW4sIHN1YktleSk7XG4gICAgICBpZiAoZGVlcFBlcm1pdCA9PT0gdHJ1ZSB8fCB0eXBlb2YgZGVlcFBlcm1pdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtzdWJLZXksIGRlZXBTcGVjaW1lbl07XG4gICAgICB9XG4gICAgICBwYXRoLnB1c2goc3ViS2V5KTtcbiAgICAgIGNvbnN0IGV4dHJhY3RlZCA9IGV4dHJhY3QoLyoqIEB0eXBlIHthbnl9ICovIChkZWVwU3BlY2ltZW4pLCBkZWVwUGVybWl0KTtcbiAgICAgIGNvbnN0IGVudHJ5ID0gW3N1YktleSwgZXh0cmFjdGVkXTtcbiAgICAgIHBhdGgucG9wKCk7XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYW5zZm9ybShPYmplY3QuZnJvbUVudHJpZXMocGlja3MpLCBzdWJQZXJtaXQpO1xuICB9O1xuXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIHJldHVybiBleHRyYWN0KHNwZWNpbWVuLCBwZXJtaXQpO1xufTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDx1bmRlZmluZWQsIG5ldmVyPn0gKi8kaM2PX29uY2UuYXR0ZW51YXRlKGF0dGVudWF0ZSk7XG5jb25zdCBub3REb25lID0gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG5cbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8bmV2ZXIsIHZvaWQ+fSAqL1xuY29uc3QgYWx3YXlzRG9uZSA9IGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG5cbiAgICAgICBjb25zdCBmb3JldmVyID0gYXN5bmNHZW5lcmF0ZSgoKSA9PiBub3REb25lKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUfSBwcm9kdWNlIFRoZSB2YWx1ZSBvZiBgYXdhaXQgcHJvZHVjZSgpYCBpcyB1c2VkIGZvciBpdHNcbiAqICAgdHJ1dGhpbmVzcyB2cyBmYWxzaW5lc3MuIElPVywgaXQgaXMgY29lcmNlZCB0byBhIGJvb2xlYW4gc28gdGhlIGNhbGxlciBuZWVkXG4gKiAgIG5vdCBib3RoZXIgZG9pbmcgdGhpcyB0aGVtc2VsdmVzLlxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8QXdhaXRlZDxUPj59XG4gKi8kaM2PX29uY2UuZm9yZXZlcihmb3JldmVyKTtcbiAgICAgICBjb25zdCB3aGlsZVRydWUgPSBwcm9kdWNlID0+XG4gIGFzeW5jR2VuZXJhdGUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcHJvZHVjZSgpO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiBhbHdheXNEb25lO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG4gIH0pO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFR9IHByb2R1Y2UgVGhlIHZhbHVlIG9mIGBhd2FpdCBwcm9kdWNlKClgIGlzIHVzZWQgZm9yIGl0c1xuICogICB0cnV0aGluZXNzIHZzIGZhbHNpbmVzcy4gSU9XLCBpdCBpcyBjb2VyY2VkIHRvIGEgYm9vbGVhbiBzbyB0aGUgY2FsbGVyIG5lZWRcbiAqICAgbm90IGJvdGhlciBkb2luZyB0aGlzIHRoZW1zZWx2ZXMuXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxBd2FpdGVkPFQ+Pn1cbiAqLyRozY9fb25jZS53aGlsZVRydWUod2hpbGVUcnVlKTtcbiAgICAgICBjb25zdCB1bnRpbFRydWUgPSBwcm9kdWNlID0+XG4gIGFzeW5jR2VuZXJhdGUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcHJvZHVjZSgpO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIGRvbmU6IHRydWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgfSk7XG5cbi8qKiBAdHlwZSB7PFgsIFk+KHhzOiBYW10sIHlzOiBZW10pID0+IFtYLCBZXVtdfSAqLyRozY9fb25jZS51bnRpbFRydWUodW50aWxUcnVlKTtcbiAgICAgICBjb25zdCB6aXAgPSAoeHMsIHlzKSA9PiBoYXJkZW4oeHMubWFwKCh4LCBpKSA9PiBbeCwgeXNbK2ldXSkpO1xuXG4vKipcbiAqIEB0eXBlIHs8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEVSZWY8YW55Pj4+KFxuICogICBvYmo6IFQsXG4gKiApID0+IFByb21pc2U8eyBbSyBpbiBrZXlvZiBUXTogQXdhaXRlZDxUW0tdPiB9Pn1cbiAqLyRozY9fb25jZS56aXAoemlwKTtcbiAgICAgICBjb25zdCBhbGxWYWx1ZXMgPSBhc3luYyBvYmogPT4ge1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IFByb21pc2UuYWxsKHZhbHVlcyhvYmopKTtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgcmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyh6aXAoa2V5cyhvYmopLCByZXNvbHZlZCkpKTtcbn07XG5cbi8qKlxuICogQSB0ZWUgaW1wbGVtZW50YXRpb24gd2hlcmUgYWxsIHJlYWRlcnMgYXJlIHN5bmNocm9uaXplZCB3aXRoIGVhY2ggb3RoZXIuIFRoZXlcbiAqIGFsbCBjb25zdW1lIHRoZSBzb3VyY2Ugc3RyZWFtIGluIGxvY2tzdGVwLCBhbmQgYW55IG9uZSByZXR1cm5pbmcgb3IgdGhyb3dpbmdcbiAqIGVhcmx5IHdpbGwgYWZmZWN0IHRoZSBvdGhlcnMuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0FzeW5jSXRlcmF0b3I8VCwgdm9pZCwgdm9pZD59IHNvdXJjZVN0cmVhbVxuICogQHBhcmFtIHtudW1iZXJ9IHJlYWRlckNvdW50XG4gKi8kaM2PX29uY2UuYWxsVmFsdWVzKGFsbFZhbHVlcyk7XG4gICAgICAgY29uc3Qgc3luY2hyb25pemVkVGVlID0gKHNvdXJjZVN0cmVhbSwgcmVhZGVyQ291bnQpID0+IHtcbiAgLyoqIEB0eXBlIHtJdGVyYXRvclJldHVyblJlc3VsdDx2b2lkPiB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IGRvbmVSZXN1bHQ7XG5cbiAgLyoqXG4gKiBAdHlwZWRlZiB7SXRlcmF0b3JSZXN1bHQ8XG4gKiAgICh2YWx1ZTogUHJvbWlzZUxpa2U8SXRlcmF0b3JSZXN1bHQ8VD4+KSA9PiB2b2lkXG4gKiA+fSBRdWV1ZVBheWxvYWRcbiAqL1xuICAvKiogQHR5cGUge0FzeW5jUXVldWU8UXVldWVQYXlsb2FkPltdfSAqL1xuICBjb25zdCBxdWV1ZXMgPSBbXTtcblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGNvbnN0IHB1bGxOZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHF1ZXVlcy5tYXAocXVldWUgPT4gcXVldWUuZ2V0KCkpKTtcbiAgICBjb25zdCByZWplY3Rpb25zID0gW107XG4gICAgLyoqIEB0eXBlIHtBcnJheTwodmFsdWU6IFByb21pc2VMaWtlPEl0ZXJhdG9yUmVzdWx0PFQ+PikgPT4gdm9pZD59ICovXG4gICAgY29uc3QgcmVzb2x2ZXJzID0gW107XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHNldHRsZWRSZXN1bHQgb2YgcmVxdWVzdHMpIHtcbiAgICAgIGlmIChzZXR0bGVkUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICByZWplY3Rpb25zLnB1c2goc2V0dGxlZFJlc3VsdC5yZWFzb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZSB8fD0gISFzZXR0bGVkUmVzdWx0LnZhbHVlLmRvbmU7XG4gICAgICAgIHJlc29sdmVycy5wdXNoKHNldHRsZWRSZXN1bHQudmFsdWUudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiogQHR5cGUge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+fSAqL1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKGRvbmVSZXN1bHQpIHtcbiAgICAgIHJlc3VsdCA9IFByb21pc2UucmVzb2x2ZShkb25lUmVzdWx0KTtcbiAgICB9IGVsc2UgaWYgKHJlamVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG1ha2VFcnJvcihYYFRlZWQgc3RyZWFtIHRocmV3YCk7XG4gICAgICBhbm5vdGF0ZUVycm9yKGVycm9yLCBYYFRlZWQgcmVqZWN0aW9uczogJHtyZWplY3Rpb25zfWApO1xuICAgICAgcmVzdWx0ID1cbiAgICAgICAgc291cmNlU3RyZWFtLnRocm93Py4oZXJyb3IpIHx8XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShzb3VyY2VTdHJlYW0ucmV0dXJuPy4oKSkudGhlbigoKSA9PlxuICAgICAgICAgIFByb21pc2UucmVqZWN0KGVycm9yKSxcbiAgICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGRvbmUpIHtcbiAgICAgIHJlc3VsdCA9XG4gICAgICAgIHNvdXJjZVN0cmVhbS5yZXR1cm4/LigpIHx8XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHNvdXJjZVN0cmVhbS5uZXh0KCk7XG4gICAgfVxuICAgIHJlc3VsdC50aGVuKFxuICAgICAgciA9PiB7XG4gICAgICAgIGlmIChyLmRvbmUpIHtcbiAgICAgICAgICBkb25lUmVzdWx0ID0gcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgZG9uZVJlc3VsdCA9IHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgfSxcbiAgICApO1xuICAgIGZvciAoY29uc3QgcmVzb2x2ZSBvZiByZXNvbHZlcnMpIHtcbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHB1bGxOZXh0KCk7XG4gIH07XG5cbiAgY29uc3QgcmVhZGVycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHJlYWRlckNvdW50IH0pLm1hcCgoKSA9PiB7XG4gICAgLyoqIEB0eXBlIHtBc3luY1F1ZXVlPFF1ZXVlUGF5bG9hZD59ICovXG4gICAgY29uc3QgcXVldWUgPSBtYWtlUXVldWUoKTtcbiAgICBxdWV1ZXMucHVzaChxdWV1ZSk7XG5cbiAgICAvKiogQHR5cGUge0FzeW5jR2VuZXJhdG9yPFQsIHZvaWQsIHZvaWQ+fSAqL1xuICAgIGNvbnN0IHJlYWRlciA9IGhhcmRlbih7XG4gICAgICBhc3luYyBuZXh0KCkge1xuICAgICAgICAvKipcbiAqIEB0eXBlIHtQcm9taXNlS2l0PEl0ZXJhdG9yUmVzdWx0PFQ+Pn1cbiAqL1xuICAgICAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IG1ha2VQcm9taXNlS2l0KCk7XG4gICAgICAgIHF1ZXVlLnB1dCh7IHZhbHVlOiByZXNvbHZlLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgcmV0dXJuKCkge1xuICAgICAgICAvKipcbiAqIEB0eXBlIHtQcm9taXNlS2l0PEl0ZXJhdG9yUmVzdWx0PFQ+Pn1cbiAqL1xuICAgICAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IG1ha2VQcm9taXNlS2l0KCk7XG4gICAgICAgIHF1ZXVlLnB1dCh7IHZhbHVlOiByZXNvbHZlLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgIH0sXG4gICAgICBhc3luYyB0aHJvdyhyZWFzb24pIHtcbiAgICAgICAgY29uc3QgcmVqZWN0aW9uID0gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgcXVldWUucHV0KHJlamVjdGlvbik7XG4gICAgICAgIHJldHVybiByZWplY3Rpb247XG4gICAgICB9LFxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG4gICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gcmVhZGVyO1xuICAgICAgfSxcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuICAgICAgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuICAgICAgICBhd2FpdCByZWFkZXIucmV0dXJuKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiByZWFkZXI7XG4gIH0pO1xuXG4gIHZvaWQgcHVsbE5leHQoKTtcbiAgcmV0dXJuIHJlYWRlcnM7XG59OyRozY9fb25jZS5zeW5jaHJvbml6ZWRUZWUoc3luY2hyb25pemVkVGVlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7Im9iamVjdE1hcCI6WyJvYmplY3RNYXAiLGZhbHNlXSwib2JqZWN0TWV0YU1hcCI6WyJvYmplY3RNZXRhTWFwIixmYWxzZV0sImZyb21VbmlxdWVFbnRyaWVzIjpbImZyb21VbmlxdWVFbnRyaWVzIixmYWxzZV19LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxpbWl0ZWRDb25zb2xlIjpbIm1ha2VMaW1pdGVkQ29uc29sZSJdLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sInN0cmlwUHJlZml4IjpbInN0cmlwUHJlZml4Il0sInRocm93RXJyb3JDb2RlIjpbInRocm93RXJyb3JDb2RlIl0sInRyeU5vdyI6WyJ0cnlOb3ciXSwidHJ5SnNvblBhcnNlIjpbInRyeUpzb25QYXJzZSJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJ3aXRoRGVmZXJyZWRDbGVhbnVwIjpbIndpdGhEZWZlcnJlZENsZWFudXAiXSwiYXNzZXJ0QWxsRGVmaW5lZCI6WyJhc3NlcnRBbGxEZWZpbmVkIl0sImF0dGVudWF0ZSI6WyJhdHRlbnVhdGUiXSwiZm9yZXZlciI6WyJmb3JldmVyIl0sIndoaWxlVHJ1ZSI6WyJ3aGlsZVRydWUiXSwidW50aWxUcnVlIjpbInVudGlsVHJ1ZSJdLCJ6aXAiOlsiemlwIl0sImFsbFZhbHVlcyI6WyJhbGxWYWx1ZXMiXSwic3luY2hyb25pemVkVGVlIjpbInN5bmNocm9uaXplZFRlZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADR3g3QkRIAAJESAAAsAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3Rlc3RpbmctdXRpbHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImV2ZW50TG9vcEl0ZXJhdGlvbiIsImluc3BlY3RNYXBTdG9yZSIsInRlc3RJbnRlcnJ1cHRlZFN0ZXBzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG4vKipcbiAqIEBmaWxlIG5vdGUgdGhpcyBjYW5ub3QgYmUgY2FsbGVkIHRlc3QtdXRpbHMuanMgZHVlIHRvXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNzUwM1xuICovXG4vKiBnbG9iYWwgc2V0SW1tZWRpYXRlICovXG4vKipcbiAqIEBpbXBvcnQge01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqIEBpbXBvcnQge0V4ZWN1dGlvbkNvbnRleHQgYXMgQXZhVH0gZnJvbSAnYXZhJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2V2ZW50dWFsLXNlbmQnO1xuICovXG5cbi8qKlxuICogQSB3b3JrYXJvdW5kIGZvciBzb21lIGlzc3VlcyB3aXRoIGZha2UgdGltZSBpbiB0ZXN0cy5cbiAqXG4gKiBMaW5lcyBvZiB0ZXN0IGNvZGUgY2FuIGRlcGVuZCBvbiBhc3luYyBwcm9taXNlcyBvdXRzaWRlIHRoZSB0ZXN0IHJlc29sdmluZ1xuICogYmVmb3JlIHRoZXkgcnVuLiBBd2FpdGluZyB0aGlzIGZ1bmN0aW9uIHJlc3VsdCBlbnN1cmVzIHRoYXQgYWxsIHByb21pc2VzIHRoYXRcbiAqIGNhbiBkbyByZXNvbHZlLiBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IG1lYW4gYWxsIG91dHN0YW5kaW5nIHByb21pc2VzLlxuICovXG4gICAgICAgY29uc3QgZXZlbnRMb29wSXRlcmF0aW9uID0gYXN5bmMgKCkgPT5cbiAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpOyRozY9fb25jZS5ldmVudExvb3BJdGVyYXRpb24oZXZlbnRMb29wSXRlcmF0aW9uKTtcbmhhcmRlbihldmVudExvb3BJdGVyYXRpb24pO1xuXG4vKiogQHR5cGUgeyh2YWx1ZTogYW55KSA9PiBzdHJpbmd9ICovXG5jb25zdCBzdHJpbmdPclRhZyA9IHZhbHVlID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXTtcbiAgfVxuICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn07XG4vKipcbiAqIEBwYXJhbSB7TWFwU3RvcmV9IHN0b3JlXG4gKiBAcmV0dXJucyB7b2JqZWN0fSB0cmVlIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgc3RvcmVcbiAqL1xuICAgICAgIGNvbnN0IGluc3BlY3RNYXBTdG9yZSA9IHN0b3JlID0+IHtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi9cbiAgY29uc3Qgb2JqID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIHN0b3JlLmtleXMoKSkge1xuICAgIGNvbnN0IHZhbHVlID0gc3RvcmUuZ2V0KGtleSk7XG4gICAgY29uc3QgaGFzS2V5cyA9XG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9IG51bGwgJiYgJ2tleXMnIGluIHZhbHVlO1xuICAgIGNvbnN0IGluZGV4ID0gc3RyaW5nT3JUYWcoa2V5KTtcbiAgICBpZiAoaGFzS2V5cyAmJiAnZ2V0JyBpbiB2YWx1ZSkge1xuICAgICAgb2JqW2luZGV4XSA9IGluc3BlY3RNYXBTdG9yZSh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChoYXNLZXlzKSB7XG4gICAgICBvYmpbaW5kZXhdID0gQXJyYXkuZnJvbSh2YWx1ZS5rZXlzKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmpbaW5kZXhdID1cbiAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlXG4gICAgICAgICAgPyB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddXG4gICAgICAgICAgOiB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn07JGjNj19vbmNlLmluc3BlY3RNYXBTdG9yZShpbnNwZWN0TWFwU3RvcmUpO1xuaGFyZGVuKGluc3BlY3RNYXBTdG9yZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtJbnB1dD1hbnldXG4gKiBAdHlwZWRlZiB7cmVhZG9ubHkgW1xuICogICBzdGVwTmFtZTogc3RyaW5nLFxuICogICBmbjogKGlucHV0OiBQYXJ0aWFsPElucHV0PiwgbGFiZWw6IHN0cmluZykgPT4gUGFydGlhbDxJbnB1dD4gfCBQcm9taXNlTGlrZTxQYXJ0aWFsPElucHV0Pj4sXG4gKiBdfSBUZXN0U3RlcFxuICovXG5cbi8qKlxuICogRm9yIGVhY2ggc3RlcCwgcnVuIHRvIGp1c3QgYmVmb3JlIHRoYXQgcG9pbnQgYW5kIHBhdXNlIGZvciBjb250aW51YXRpb24gYWZ0ZXJcbiAqIGludGVycnVwdC5cbiAqXG4gKiBAdGVtcGxhdGUgW0lucHV0PWFueV1cbiAqIEB0ZW1wbGF0ZSBbQ29udGV4dD11bmtub3duXVxuICogQHBhcmFtIHtBdmFUPENvbnRleHQ+fSB0XG4gKiBAcGFyYW0ge3JlYWRvbmx5IFRlc3RTdGVwPElucHV0PltdfSBhbGxTdGVwc1xuICogQHBhcmFtIHsodDogQXZhVDxDb250ZXh0PikgPT4gRVJlZjx2b2lkPn0gW2RvSW50ZXJydXB0XVxuICovXG4gICAgICAgY29uc3QgdGVzdEludGVycnVwdGVkU3RlcHMgPSBhc3luYyAodCwgYWxsU3RlcHMsIGRvSW50ZXJydXB0KSA9PiB7XG4gIC8qKlxuICogQHR5cGVkZWYge3tcbiAqICAgbGFiZWw6IHN0cmluZztcbiAqICAgYWNjdW06IFBhcnRpYWw8SW5wdXQ+O1xuICogfX0gUnVuU3RhdGVcbiAqL1xuXG4gIC8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcGFyYW0ge3JlYWRvbmx5IFRlc3RTdGVwPElucHV0PltdfSBzdGVwc1xuICogQHBhcmFtIHtSdW5TdGF0ZX0gW3J1blN0YXRlXVxuICogQHJldHVybnMge1Byb21pc2U8UnVuU3RhdGU+fVxuICovXG4gIGNvbnN0IHJ1blN0ZXBzID0gYXN5bmMgKGxhYmVsLCBzdGVwcywgcnVuU3RhdGUgPSB7IGxhYmVsLCBhY2N1bToge30gfSkgPT4ge1xuICAgIGF3YWl0IG51bGw7XG4gICAgbGV0IGFjY3VtID0gcnVuU3RhdGUuYWNjdW07XG4gICAgY29uc3QgcnVuTGFiZWwgPSBydW5TdGF0ZS5sYWJlbDtcbiAgICBmb3IgKGNvbnN0IFtzdGVwTmFtZSwgZm5dIG9mIHN0ZXBzKSB7XG4gICAgICBhd2FpdCB0Lm5vdFRocm93c0FzeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgYWNjdW0gPSBhd2FpdCBmbihhY2N1bSwgcnVuTGFiZWwpO1xuICAgICAgfSwgYCR7bGFiZWx9ICR7c3RlcE5hbWV9IG11c3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5YCk7XG4gICAgfVxuICAgIHJldHVybiB7IGxhYmVsOiBydW5MYWJlbCwgYWNjdW0gfTtcbiAgfTtcblxuICAvKiBTYW5pdHkgY2hlY2sqL1xuICBhd2FpdCBydW5TdGVwcygncHJlLWludGVycnVwdCcsIGFsbFN0ZXBzKTtcbiAgaWYgKCFkb0ludGVycnVwdCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICogQHR5cGUge3tcbiAqICAgcnVuU3RhdGU6IFJ1blN0YXRlO1xuICogICByZW1haW5pbmdTdGVwczogcmVhZG9ubHkgVGVzdFN0ZXA8SW5wdXQ+W107XG4gKiB9W119XG4gKi9cbiAgY29uc3QgcGF1c2VkUnVucyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFN0ZXBzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgW2JlZm9yZVN0ZXBOYW1lXSA9IGFsbFN0ZXBzW2ldO1xuICAgIGNvbnN0IHJ1blN0YXRlID0gYXdhaXQgcnVuU3RlcHMoXG4gICAgICBgcHJlLSR7YmVmb3JlU3RlcE5hbWV9YCxcbiAgICAgIGFsbFN0ZXBzLnNsaWNlKDAsIGkpLFxuICAgICAgeyBsYWJlbDogYHBhdXNlLWJlZm9yZS0ke2JlZm9yZVN0ZXBOYW1lfWAsIGFjY3VtOiB7fSB9LFxuICAgICk7XG4gICAgcGF1c2VkUnVucy5wdXNoKHsgcnVuU3RhdGUsIHJlbWFpbmluZ1N0ZXBzOiBhbGxTdGVwcy5zbGljZShpKSB9KTtcbiAgfVxuXG4gIC8qIFJ1biB0aGUgdXNlciBjb2RlIHRoYXQgaW50ZXJydXB0cyB0aGUgc3RlcHMuKi9cbiAgYXdhaXQgZG9JbnRlcnJ1cHQodCk7XG5cbiAgLyogVmVyaWZ5IGEgY29tcGxldGUgcnVuIHBvc3QtaW50ZXJydXB0LiovXG4gIGF3YWl0IHJ1blN0ZXBzKCdwb3N0LWludGVycnVwdCcsIGFsbFN0ZXBzKTtcblxuICAvKiBWZXJpZnkgY29tcGxldGlvbiBvZiBlYWNoIHBhdXNlZCBzdGVwLiovXG4gIGZvciAoY29uc3QgeyBydW5TdGF0ZSwgcmVtYWluaW5nU3RlcHMgfSBvZiBwYXVzZWRSdW5zKSB7XG4gICAgY29uc3QgW2JlZm9yZVN0ZXBOYW1lXSA9IHJlbWFpbmluZ1N0ZXBzWzBdO1xuICAgIGF3YWl0IHJ1blN0ZXBzKGByZXN1bWVkLSR7YmVmb3JlU3RlcE5hbWV9YCwgcmVtYWluaW5nU3RlcHMsIHJ1blN0YXRlKTtcbiAgfVxufTskaM2PX29uY2UudGVzdEludGVycnVwdGVkU3RlcHModGVzdEludGVycnVwdGVkU3RlcHMpO1xuaGFyZGVuKHRlc3RJbnRlcnJ1cHRlZFN0ZXBzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImV2ZW50TG9vcEl0ZXJhdGlvbiI6WyJldmVudExvb3BJdGVyYXRpb24iXSwiaW5zcGVjdE1hcFN0b3JlIjpbImluc3BlY3RNYXBTdG9yZSJdLCJ0ZXN0SW50ZXJydXB0ZWRTdGVwcyI6WyJ0ZXN0SW50ZXJydXB0ZWRTdGVwcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADaiNsr1gMAANYDAAAlAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3RtcERpci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVRlbXBEaXJGYWN0b3J5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qKlxuICogQ3JlYXRlIGEgYHRtcERpcmAgZnVuY3Rpb24gdGhhdCBzeW5jaHJvbm91c2x5IGNyZWF0ZXMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5XG4gKiBhbmQgYSBmdW5jdGlvbiBmb3IgZGVsZXRpbmcgaXQgYWxvbmcgd2l0aCBhbnkgYWRkZWQgY29udGVudHMuXG4gKlxuICogQHBhcmFtIHtQaWNrPElNUE9SVCgndG1wJyksICdkaXJTeW5jJz59IHRtcFxuICovXG4gICAgICAgY29uc3QgbWFrZVRlbXBEaXJGYWN0b3J5ID0gdG1wID0+IHtcbiAgLyoqIEB0eXBlIHsocHJlZml4Pzogc3RyaW5nKSA9PiBbZGlyTmFtZTogc3RyaW5nLCBjbGVhbnVwOiAoKSA9PiB2b2lkXX0gKi9cbiAgY29uc3QgdG1wRGlyID0gcHJlZml4ID0+IHtcbiAgICBjb25zdCB7IG5hbWUsIHJlbW92ZUNhbGxiYWNrIH0gPSB0bXAuZGlyU3luYyh7XG4gICAgICBwcmVmaXgsXG4gICAgICB1bnNhZmVDbGVhbnVwOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBbbmFtZSwgcmVtb3ZlQ2FsbGJhY2tdO1xuICB9O1xuICByZXR1cm4gdG1wRGlyO1xufTskaM2PX29uY2UubWFrZVRlbXBEaXJGYWN0b3J5KG1ha2VUZW1wRGlyRmFjdG9yeSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGVtcERpckZhY3RvcnkiOlsibWFrZVRlbXBEaXJGYWN0b3J5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE5ip5ahBAAAoQQAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUNoZWNrLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiY2FzdCIsIm11c3RNYXRjaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHR5cGVsZXNzTXVzdE1hdGNoOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKHR5cGVsZXNzTXVzdE1hdGNoID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBpbXBvcnQge011c3RNYXRjaCwgUGF0dGVyblR5cGUsIFR5cGVkUGF0dGVybn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqIEB0eXBlIHtNdXN0TWF0Y2h9ICovXG4gICAgICAgY29uc3QgbXVzdE1hdGNoID0gdHlwZWxlc3NNdXN0TWF0Y2g7XG5cbi8qKlxuICogQHRlbXBsYXRlIE1cbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7VHlwZWRQYXR0ZXJuPE0+fSBwYXR0XG4gKiBAcmV0dXJucyB7TX1cbiAqLyRozY9fb25jZS5tdXN0TWF0Y2gobXVzdE1hdGNoKTtcbiAgICAgICBjb25zdCBjYXN0ID0gKHNwZWNpbWVuLCBwYXR0KSA9PiB7XG4gIC8qIG11c3RNYXRjaCB0aHJvd3MgaWYgdGhleSBkb24ndCwgd2hpY2ggbWVhbnMgdGhhdCBgY2FzdGAgYWxzbyBuYXJyb3dzIHRoZSovXG4gIC8qIHR5cGUgYnV0IGEgZnVuY3Rpb24gY2FuJ3QgYm90aCBuYXJyb3cgYW5kIHJldHVybiBhIHR5cGUuIFRoYXQgaXMgYnkgZGVzaWduOiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzQ2MzYjaXNzdWVjb21tZW50LTU0NTAyNTkxNiovXG4gIG11c3RNYXRjaChzcGVjaW1lbiwgcGF0dCk7XG4gIHJldHVybiBzcGVjaW1lbjtcbn07JGjNj19vbmNlLmNhc3QoY2FzdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl0sImNhc3QiOlsiY2FzdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACrfHXEowUAAKMFAAApAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJCcmlkZ2VCaWdJbnRTaGFwZSIsIlN0b3JhZ2VOb2RlU2hhcGUiLCJVbmd1YXJkZWRIZWxwZXJJIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7VHlwZWRQYXR0ZXJufSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4gICAgICAgY29uc3QgU3RvcmFnZU5vZGVTaGFwZSA9IE0ucmVtb3RhYmxlKCdTdG9yYWdlTm9kZScpO1xuXG4vKiogVG8gYmUgdXNlZCBvbmx5IGZvciAnaGVscGVyJyBmYWNldHMgd2hlcmUgdGhlIGNhbGxzIGFyZSBmcm9tIHRydXN0ZWQgY29kZS4gKi8kaM2PX29uY2UuU3RvcmFnZU5vZGVTaGFwZShTdG9yYWdlTm9kZVNoYXBlKTtcbiAgICAgICBjb25zdCBVbmd1YXJkZWRIZWxwZXJJID0gTS5pbnRlcmZhY2UoXG4gICdoZWxwZXInLFxuICB7fSxcbiAgLyogbm90IGV4cG9zZWQgc28gdXNpbmcgYGRlZmF1bHRHdWFyZHNgIGlzIGZpbmUuKi9cbiAgeyBkZWZhdWx0R3VhcmRzOiAncGFzc2FibGUnIH0sXG4pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtudW1iZXIgfCBgJHtiaWdpbnR9YH0gQnJpZGdlQmlnSW50IEVuc3VyZSB0aGF0IGNhbGxlZXMgcGFzc2VkIGFcbiAqICAgYnJpZGdlIG1lc3NhZ2UgdGhhdCB3YXMgc2VyaWFsaXNlZCBmcm9tIGEgR29sYW5nIGludDY0IG9yIHVpbnQ2NCBhY2NlcHRcbiAqICAgZWl0aGVyIGEgSlMgbnVtYmVyIG9yIGEgc3RyaW5naWZpZWQgSlMgYmlnaW50LlxuICovXG5cbi8qKlxuICogQHR5cGUge1R5cGVkUGF0dGVybjxCcmlkZ2VCaWdJbnQ+fVxuICovJGjNj19vbmNlLlVuZ3VhcmRlZEhlbHBlckkoVW5ndWFyZGVkSGVscGVySSk7XG4gICAgICAgY29uc3QgQnJpZGdlQmlnSW50U2hhcGUgPSBNLm9yKE0ubnVtYmVyKCksIE0uc3RyaW5nKCkpOyRozY9fb25jZS5CcmlkZ2VCaWdJbnRTaGFwZShCcmlkZ2VCaWdJbnRTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTdG9yYWdlTm9kZVNoYXBlIjpbIlN0b3JhZ2VOb2RlU2hhcGUiXSwiVW5ndWFyZGVkSGVscGVySSI6WyJVbmd1YXJkZWRIZWxwZXJJIl0sIkJyaWRnZUJpZ0ludFNoYXBlIjpbIkJyaWRnZUJpZ0ludFNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACoAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA14cZPXAMAABwDAAAKgAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91cGdyYWRlLWFwaS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiLCJpc0FiYW5kb25lZEVycm9yIiwiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiIsIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sbWF0Y2hlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbmNvbnN0IHsgaXNGcm96ZW4gfSA9IE9iamVjdDtcblxuLyoqXG4gKiBBbiBFcnJvci1saWtlIG9iamVjdCBmb3IgdXNlIGFzIHRoZSByZWplY3Rpb24gcmVhc29uIG9mIHByb21pc2VzIGFiYW5kb25lZCBieVxuICogdXBncmFkZS5cbiAqXG4gKiBAdHlwZWRlZiB7e1xuICogICBuYW1lOiAndmF0VXBncmFkZWQnO1xuICogICB1cGdyYWRlTWVzc2FnZTogc3RyaW5nO1xuICogICBpbmNhcm5hdGlvbk51bWJlcjogbnVtYmVyO1xuICogfX0gVXBncmFkZURpc2Nvbm5lY3Rpb25cbiAqL1xuXG4gICAgICAgY29uc3QgVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSA9IGhhcmRlbih7XG4gIG5hbWU6ICd2YXRVcGdyYWRlZCcsXG4gIHVwZ3JhZGVNZXNzYWdlOiBNLnN0cmluZygpLFxuICBpbmNhcm5hdGlvbk51bWJlcjogTS5udW1iZXIoKSxcbn0pO1xuXG4vKipcbiAqIE1ha2VzIGFuIEVycm9yLWxpa2Ugb2JqZWN0IGZvciB1c2UgYXMgdGhlIHJlamVjdGlvbiByZWFzb24gb2YgcHJvbWlzZXNcbiAqIGFiYW5kb25lZCBieSB1cGdyYWRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cGdyYWRlTWVzc2FnZVxuICogQHBhcmFtIHtudW1iZXJ9IHRvSW5jYXJuYXRpb25OdW1iZXJcbiAqIEByZXR1cm5zIHtVcGdyYWRlRGlzY29ubmVjdGlvbn1cbiAqLyRozY9fb25jZS5VcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiA9ICh1cGdyYWRlTWVzc2FnZSwgdG9JbmNhcm5hdGlvbk51bWJlcikgPT5cbiAgaGFyZGVuKHtcbiAgICBuYW1lOiAndmF0VXBncmFkZWQnLFxuICAgIHVwZ3JhZGVNZXNzYWdlLFxuICAgIGluY2FybmF0aW9uTnVtYmVyOiB0b0luY2FybmF0aW9uTnVtYmVyLFxuICB9KTskaM2PX29uY2UubWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5oYXJkZW4obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gcmVhc29uIElmIGByZWFzb25gIGlzIG5vdCBmcm96ZW4sIGl0IGNhbm5vdCBiZSBhblxuICogICBVcGdyYWRlRGlzY29ubmVjdGlvbiwgc28gcmV0dXJucyBmYWxzZSB3aXRob3V0IGV2ZW4gY2hlY2tpbmcgYWdhaW5zdCB0aGVcbiAqICAgc2hhcGUuXG4gKiBAcmV0dXJucyB7cmVhc29uIGlzIFVwZ3JhZGVEaXNjb25uZWN0aW9ufVxuICovXG4gICAgICAgY29uc3QgaXNVcGdyYWRlRGlzY29ubmVjdGlvbiA9IHJlYXNvbiA9PlxuICByZWFzb24gIT0gbnVsbCAmJiAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcSovXG4gIGlzRnJvemVuKHJlYXNvbikgJiZcbiAgbWF0Y2hlcyhyZWFzb24sIFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpOyRozY9fb25jZS5pc1VwZ3JhZGVEaXNjb25uZWN0aW9uKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuaGFyZGVuKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhIHJlYXNvbiBpcyBhICd2YXQgdGVybWluYXRlZCcgZXJyb3IgZ2VuZXJhdGVkIHdoZW4gYW4gb2JqZWN0XG4gKiBpcyBhYmFuZG9uZWQgYnkgYSB2YXQgZHVyaW5nIGFuIHVwZ3JhZGUuXG4gKlxuICogTm9ybWFsbHkgd2UgZG8gbm90IHdhbnQgdG8gcmVseSBvbiB0aGUgYG1lc3NhZ2VgIG9mIGFuIGVycm9yIG9iamVjdCwgYnV0IHRoaXNcbiAqIGlzIGEgcHJhZ21hdGljIHNvbHV0aW9uIHRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHZhdCB1cGdyYWRlIGVycm9ycy4gSW4gdGhlXG4gKiBmdXR1cmUgd2UnZCBwcmVmZXIgaGF2aW5nIGFuIGVycm9yIHdpdGggYSBjYXVzZSByZWZlcmVuY2luZyBhIGRpc2Nvbm5lY3Rpb25cbiAqIG9iamVjdCBsaWtlIGZvciBwcm9taXNlIHJlamVjdGlvbnMuIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85NTgyXG4gKlxuICogQHBhcmFtIHthbnl9IHJlYXNvblxuICogQHJldHVybnMge3JlYXNvbiBpcyBFcnJvcn1cbiAqL1xuICAgICAgIGNvbnN0IGlzQWJhbmRvbmVkRXJyb3IgPSByZWFzb24gPT5cbiAgcmVhc29uICE9IG51bGwgJiYgLyogZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXEqL1xuICBpc0Zyb3plbihyZWFzb24pICYmXG4gIG1hdGNoZXMocmVhc29uLCBNLmVycm9yKCkpICYmXG4gIC8qIFdlJ3JlIG5vdCB1c2luZyBhIGNvbnN0YW50IGhlcmUgc2luY2UgdGhpcyBzcGVjaWFsIHZhbHVlIGlzIGFscmVhZHkqL1xuICAvKiBzcHJpbmtsZWQgdGhyb3VnaG91dCB0aGUgU0RLKi9cbiAgcmVhc29uLm1lc3NhZ2UgPT09ICd2YXQgdGVybWluYXRlZCc7JGjNj19vbmNlLmlzQWJhbmRvbmVkRXJyb3IoaXNBYmFuZG9uZWRFcnJvcik7XG5oYXJkZW4oaXNBYmFuZG9uZWRFcnJvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlIjpbIlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiXSwibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIjpbIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIjpbImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwiaXNBYmFuZG9uZWRFcnJvciI6WyJpc0FiYW5kb25lZEVycm9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD/hQTwZFAAAGRQAADMAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlTm90aWZpZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLHN1YnNjcmliZUxhdGVzdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7QmFzZU5vdGlmaWVyLCBJdGVyYXRpb25PYnNlcnZlciwgTGF0ZXN0VG9waWN9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYHN1YnNjcmliZUxhdGVzdGAgZnJvbSBgQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanNgIGluc3RlYWQuXG4gKlxuICogQWRhcHRvciBmcm9tIGEgbm90aWZpZXJQIHRvIGFuIGFzeW5jIGl0ZXJhYmxlLlxuICogVGhlIG5vdGlmaWVyUCBjYW4gYmUgYW55IG9iamVjdCB0aGF0IGhhcyBhbiBldmVudHVhbGx5IGludm9jYWJsZVxuICogYGdldFVwZGF0ZVNpbmNlYCBtZXRob2QgdGhhdCBiZWhhdmVzIGFjY29yZGluZyB0byB0aGUgbm90aWZpZXJcbiAqIHNwZWMuIFRoaXMgY2FuIGJlIGEgbm90aWZpZXIsIGEgcHJvbWlzZSBmb3IgYSBsb2NhbCBvciByZW1vdGVcbiAqIG5vdGlmaWVyLCBvciBhIHByZXNlbmNlIG9mIGEgcmVtb3RlIG5vdGlmaWVyLlxuICpcbiAqIEl0IGlzIGFsc28gdXNlZCBpbnRlcm5hbGx5IGJ5IG5vdGlmaWVyLmpzIHNvIHRoYXQgYSBub3RpZmllciBpdHNlbGYgaXMgYW5cbiAqIGFzeW5jIGl0ZXJhYmxlLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhYmxlIGlzIGFuIG9iamVjdCB3aXRoIGEgYFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKWAgbWV0aG9kXG4gKiB0aGF0IHJldHVybnMgYW4gYXN5bmMgaXRlcmF0b3IuIFRoZSBhc3luYyBpdGVyYXRvciB3ZSByZXR1cm4gaGVyZSBoYXMgb25seVxuICogYSBgbmV4dCgpYCBtZXRob2QsIHdpdGhvdXQgdGhlIG9wdGlvbmFsIGByZXR1cm5gIGFuZCBgdGhyb3dgIG1ldGhvZHMuIFRoZVxuICogb21pdHRlZCBtZXRob2RzLCBpZiBwcmVzZW50LCB3b3VsZCBiZSB1c2VkIGJ5IHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB0b1xuICogaW5mb3JtIHRoZSBpdGVyYXRvciBvZiBlYXJseSB0ZXJtaW5hdGlvbi4gQnV0IHRoaXMgYWRhcHRvciB3b3VsZCBub3QgZG9cbiAqIGFueXRoaW5nIHVzZWZ1bCBpbiByZWFjdGlvbiB0byB0aGlzIG5vdGlmaWNhdGlvbi5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYXRvcidzIGBuZXh0KClgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gaXRlcmF0aW9uXG4gKiByZXN1bHQuIEFuIGl0ZXJhdGlvbiByZXN1bHQgaXMgYSByZWNvcmQgd2l0aCBgdmFsdWVgIGFuZCBgZG9uZWAgcHJvcGVydGllcy5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiBidWlsZGluZyBvbiB0aGUgbm90aWZpZXIgcHJvdG9jb2wgaXMgdG8gaGF2ZSBhIGxvc3N5XG4gKiBhZGFwdG9yLCB3aGVyZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBjYW4gYmUgbWlzc2VkIGluIGZhdm9yIG9mIG1vcmUgcmVjZW50XG4gKiByZXN1bHRzIHdoaWNoIGFyZSB0aGVyZWZvcmUgbGVzcyBzdGFsZS4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2RvY3VtZW50YXRpb24vYmxvYi9IRUFEL21haW4vZ3VpZGVzL2pzLXByb2dyYW1taW5nL25vdGlmaWVycy5tZFxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QmFzZU5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIgPSBzdWJzY3JpYmVMYXRlc3Q7XG5cbi8qKlxuICogVGhpcyBhZHZhbmNlcyBgYXN5bmNJdGVyYXRvclBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRvcmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYXRvcjxUPj59IGFzeW5jSXRlcmF0b3JQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRozY9fb25jZS5tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcik7XG4gICAgICAgY29uc3Qgb2JzZXJ2ZUl0ZXJhdG9yID0gKGFzeW5jSXRlcmF0b3JQLCBpdGVyYXRpb25PYnNlcnZlcikgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKGFjaywgb2JzZXJ2ZXJFcnJvcikgPT4ge1xuICAgIGNvbnN0IHJlY3VyID0gKCkgPT4ge1xuICAgICAgRS53aGVuKFxuICAgICAgICBFKGFzeW5jSXRlcmF0b3JQKS5uZXh0KCksXG4gICAgICAgICh7IHZhbHVlLCBkb25lIH0pID0+IHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoICYmIGl0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCh2YWx1ZSk7XG4gICAgICAgICAgICBhY2sodW5kZWZpbmVkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUgJiZcbiAgICAgICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUodmFsdWUpO1xuICAgICAgICAgICAgcmVjdXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbiA9PiB7XG4gICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbCAmJiBpdGVyYXRpb25PYnNlcnZlci5mYWlsKHJlYXNvbik7XG4gICAgICAgICAgYWNrKHVuZGVmaW5lZCk7XG4gICAgICAgIH0sXG4gICAgICApLmNhdGNoKG9ic2VydmVyRXJyb3IpO1xuICAgIH07XG4gICAgcmVjdXIoKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFRoaXMgcmVhZHMgZnJvbSBgYXN5bmNJdGVyYWJsZVBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRpb25gIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaM2PX29uY2Uub2JzZXJ2ZUl0ZXJhdG9yKG9ic2VydmVJdGVyYXRvcik7XG4gICAgICAgY29uc3Qgb2JzZXJ2ZUl0ZXJhdGlvbiA9IChhc3luY0l0ZXJhYmxlUCwgaXRlcmF0aW9uT2JzZXJ2ZXIpID0+IHtcbiAgY29uc3QgaXRlcmF0b3JQID0gRShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gIHJldHVybiBvYnNlcnZlSXRlcmF0b3IoaXRlcmF0b3JQLCBpdGVyYXRpb25PYnNlcnZlcik7XG59O1xuXG4vKipcbiAqIEFzIHVwZGF0ZXMgY29tZSBpbiBmcm9tIHRoZSBwb3NzaWJseSByZW1vdGUgYG5vdGlmaWVyUGAsIHVwZGF0ZVxuICogdGhlIGxvY2FsIGB1cGRhdGVyYC4gU2luY2UgdGhlIHVwZGF0ZXMgY29tZSBmcm9tIGEgbm90aWZpZXIsIHRoZXlcbiAqIGFyZSBsb3NzeSwgaS5lLiwgb25jZSBhIG1vcmUgcmVjZW50IHN0YXRlIGNhbiBiZSByZXBvcnRlZCwgbGVzcyByZWNlbnRcbiAqIHN0YXRlcyBhcmUgYXNzdW1lZCBpcnJlbGV2YW50IGFuZCBkcm9wcGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSBub3RpZmllclBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjNj19vbmNlLm9ic2VydmVJdGVyYXRpb24ob2JzZXJ2ZUl0ZXJhdGlvbik7XG4gICAgICAgY29uc3Qgb2JzZXJ2ZU5vdGlmaWVyID0gKG5vdGlmaWVyUCwgaXRlcmF0aW9uT2JzZXJ2ZXIpID0+XG4gIG9ic2VydmVJdGVyYXRpb24oc3Vic2NyaWJlTGF0ZXN0KG5vdGlmaWVyUCksIGl0ZXJhdGlvbk9ic2VydmVyKTskaM2PX29uY2Uub2JzZXJ2ZU5vdGlmaWVyKG9ic2VydmVOb3RpZmllcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdLCJvYnNlcnZlSXRlcmF0b3IiOlsib2JzZXJ2ZUl0ZXJhdG9yIl0sIm9ic2VydmVJdGVyYXRpb24iOlsib2JzZXJ2ZUl0ZXJhdGlvbiJdLCJvYnNlcnZlTm90aWZpZXIiOlsib2JzZXJ2ZU5vdGlmaWVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMI+7bjrBwAA6wcAACQAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlLmpzIiwiLi9ub3RpZmllci5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIi4vdG9waWMuanMiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9zdG9yZXN1Yi5qcyIsIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllcktpdCIsIm1ha2VOb3RpZmllcktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0Iiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZUl0ZXJhdG9yIiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Iiwic3Vic2NyaWJlTGF0ZXN0Iiwic3Vic2NyaWJlTGF0ZXN0IixudWxsXSwicmVleHBvcnRzIjpbIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi9zdG9yZXN1Yi5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW11dLFtcIi4vbm90aWZpZXIuanNcIiwgW11dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbXV0sW1wiLi90b3BpYy5qc1wiLCBbXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbXV0sW1wiLi9zdG9yZXN1Yi5qc1wiLCBbXV0sW1wiLi9zdG9yZWQtbm90aWZpZXIuanNcIiwgW11dLFtcIi4vdHlwZXMtaW5kZXguanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3B1Ymxpc2gta2l0LmpzIjpbWyJtYWtlUHVibGlzaEtpdCIsIm1ha2VQdWJsaXNoS2l0Il0sWyJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiXSxbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIl0sWyJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUVhY2hUb3BpY0kiXSxbIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIiwiSXRlcmFibGVMYXRlc3RUb3BpY0kiXSxbIlN1YnNjcmliZXJTaGFwZSIsIlN1YnNjcmliZXJTaGFwZSJdXSwiLi9zdWJzY3JpYmUuanMiOltbInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVFYWNoIl0sWyJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiXV0sIi4vbm90aWZpZXIuanMiOltbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllciJdLFsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0Il0sWyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl0sWyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl1dLCIuL3N1YnNjcmliZXIuanMiOltbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uIl0sWyJtYWtlU3Vic2NyaXB0aW9uS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCJdXSwiLi90b3BpYy5qcyI6W1sibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyIsIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXV0sIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOltbIm9ic2VydmVOb3RpZmllciIsIm9ic2VydmVOb3RpZmllciJdLFsib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZUl0ZXJhdG9yIl0sWyJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdGlvbiJdLFsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAs0n/TsUbAADFGwAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9ub3RpZmllci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0LEUsRmFyLG1ha2VQdWJsaXNoS2l0LHN1YnNjcmliZUxhdGVzdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUxhdGVzdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UmVtb3RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0xhdGVzdFRvcGljLCBOb3RpZmllciwgTm90aWZpZXJSZWNvcmQsIFB1Ymxpc2hLaXQsIFN1YnNjcmliZXIsIFVwZGF0ZVJlY29yZH0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gc2hhcmFibGVJbnRlcm5hbHNQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXIgPSBzaGFyYWJsZUludGVybmFsc1AgPT4ge1xuICAvKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuICBjb25zdCBub3RpZmllciA9IEZhcignbm90aWZpZXInLCB7XG4gICAgLi4uc3Vic2NyaWJlTGF0ZXN0KHNoYXJhYmxlSW50ZXJuYWxzUCksXG4gICAgZ2V0VXBkYXRlU2luY2U6IGFzeW5jIHVwZGF0ZUNvdW50ID0+XG4gICAgICBFKHNoYXJhYmxlSW50ZXJuYWxzUCkuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuXG4gICAgLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgTm90aWZpZXIgZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIE5vdGlmaWVyIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VOb3RpZmllcmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBOb3RpZmllciBhdCB0aGF0IHNpdGUuXG4gKi9cbiAgICBnZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOiBhc3luYyAoKSA9PiBzaGFyYWJsZUludGVybmFsc1AsXG4gICAgLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogVXNlZCBvbmx5IGJ5IGBtYWtlQ2FzdGluZ1NwZWNGcm9tUmVmYC4gIEluc3RlYWQgdGhhdCBmdW5jdGlvbiBzaG91bGQgdXNlXG4gKiB0aGUgYFN0b3JlZEZhY2V0YCBBUEkuXG4gKi9cbiAgICBnZXRTdG9yZUtleTogKCkgPT4gaGFyZGVuKHsgbm90aWZpZXIgfSksXG4gIH0pO1xuICByZXR1cm4gbm90aWZpZXI7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj4gfCBSZW1vdGU8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqLyRozY9fb25jZS5tYWtlTm90aWZpZXIobWFrZU5vdGlmaWVyKTtcbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciA9IHN1YnNjcmliZXIgPT4ge1xuICAvKipcbiAqIEB0eXBlIHtMYXRlc3RUb3BpYzxUPn1cbiAqL1xuICBjb25zdCBiYXNlTm90aWZpZXIgPSBoYXJkZW4oe1xuICAgIGdldFVwZGF0ZVNpbmNlOiAodXBkYXRlQ291bnQgPSB1bmRlZmluZWQpID0+XG4gICAgICBFKHN1YnNjcmliZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbiAgY29uc3Qgbm90aWZpZXIgPSBGYXIoJ25vdGlmaWVyJywge1xuICAgIC4uLm1ha2VOb3RpZmllcihiYXNlTm90aWZpZXIpLFxuICAgIC4uLmJhc2VOb3RpZmllcixcbiAgfSk7XG4gIHJldHVybiBub3RpZmllcjtcbn07JGjNj19vbmNlLm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5cbi8qKlxuICogUHJvZHVjZXMgYSBwYWlyIG9mIG9iamVjdHMsIHdoaWNoIGFsbG93IGEgc2VydmljZSB0byBwcm9kdWNlIGEgc3RyZWFtIG9mXG4gKiB1cGRhdGUgcHJvbWlzZXMuXG4gKlxuICogVGhlIGluaXRpYWwgc3RhdGUgYXJndW1lbnQgaGFzIHRvIGJlIHRydWx5IG9wdGlvbmFsIGV2ZW4gdGhvdWdoIGl0IGNhblxuICogYmUgYW55IGZpcnN0IGNsYXNzIHZhbHVlIGluY2x1ZGluZyBgdW5kZWZpbmVkYC4gV2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGVcbiAqIHByZXNlbmNlIHZzIHRoZSBhYnNlbmNlIG9mIGl0LCB3aGljaCB3ZSBjYW5ub3QgZG8gd2l0aCB0aGUgb3B0aW9uYWwgYXJndW1lbnRcbiAqIHN5bnRheC4gUmF0aGVyIHdlIHVzZSB0aGUgYXJpdHkgb2YgdGhlIGBpbml0aWFsU3RhdGVBcnJgIGFycmF5LlxuICpcbiAqIElmIG5vIGluaXRpYWwgc3RhdGUgaXMgcHJvdmlkZWQgdG8gYG1ha2VOb3RpZmllcktpdGAsIHRoZW4gaXQgc3RhcnRzIHdpdGhvdXRcbiAqIGFuIGluaXRpYWwgc3RhdGUuIEl0cyBpbml0aWFsIHN0YXRlIHdpbGwgaW5zdGVhZCBiZSB0aGUgc3RhdGUgb2YgdGhlIGZpcnN0XG4gKiB1cGRhdGUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W10gfCBbVF19IGluaXRpYWxTdGF0ZUFyciB0aGUgZmlyc3Qgc3RhdGUgdG8gYmUgcmV0dXJuZWQgKHR5cGVkIGFzIHJlc3QgYXJyYXkgdG8gcGVybWl0IGB1bmRlZmluZWRgKVxuICogQHJldHVybnMge05vdGlmaWVyUmVjb3JkPFQ+fSB0aGUgbm90aWZpZXIgYW5kIHVwZGF0ZXJcbiAqL1xuICAgICAgIGNvbnN0IG1ha2VOb3RpZmllcktpdCA9ICguLi5pbml0aWFsU3RhdGVBcnIpID0+IHtcbiAgLyoqIEB0eXBlIHtQdWJsaXNoS2l0PFQ+fSAqL1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcblxuICBjb25zdCBub3RpZmllciA9IG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKHN1YnNjcmliZXIpO1xuXG4gIGNvbnN0IHVwZGF0ZXIgPSBGYXIoJ3VwZGF0ZXInLCB7XG4gICAgdXBkYXRlU3RhdGU6IHN0YXRlID0+IHB1Ymxpc2hlci5wdWJsaXNoKHN0YXRlKSxcbiAgICBmaW5pc2g6IGNvbXBsZXRpb24gPT4gcHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbiAgICBmYWlsOiByZWFzb24gPT4gcHVibGlzaGVyLmZhaWwocmVhc29uKSxcbiAgfSk7XG5cbiAgYXNzZXJ0KGluaXRpYWxTdGF0ZUFyci5sZW5ndGggPD0gMSwgJ3RvbyBtYW55IGFyZ3VtZW50cycpO1xuICBpZiAoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aCA9PT0gMSkge1xuICAgIHVwZGF0ZXIudXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlQXJyWzBdKTtcbiAgfVxuXG4gIC8qIG5vdGlmaWVyIGZhY2V0IGlzIHNlcGFyYXRlIHNvIGl0IGNhbiBiZSBoYW5kZWQgb3V0IHdoaWxlIHVwZGF0ZXIqL1xuICAvKiBpcyB0aWdodGx5IGhlbGQqL1xuICByZXR1cm4gaGFyZGVuKHsgbm90aWZpZXIsIHVwZGF0ZXIgfSk7XG59O1xuXG4vKipcbiAqIEFkYXB0b3IgZnJvbSBhc3luYyBpdGVyYWJsZSB0byBub3RpZmllci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBUaGUgcmVzdWx0aW5nIG5vdGlmaWVyIGlzIGxvc3NsZXNzLCB3aGljaCBpcyBub3QgZGVzaXJhYmxlLlxuICogUHJlZmVyIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyLCBhbmQgcmVmZXIgdG9cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNTQxMyBhbmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU2OTUgZm9yIGNvbnRleHQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqLyRozY9fb25jZS5tYWtlTm90aWZpZXJLaXQobWFrZU5vdGlmaWVyS2l0KTtcbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSA9IGFzeW5jSXRlcmFibGVQID0+IHtcbiAgY29uc3QgaXRlcmF0b3JQID0gRShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbiAgLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xuICBsZXQgb3B0TmV4dFByb21pc2U7XG4gIGxldCBjdXJyZW50VXBkYXRlQ291bnQgPSAwbjtcbiAgLyoqIEB0eXBlIHtFUmVmPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xuICBsZXQgY3VycmVudFJlc3BvbnNlO1xuICBsZXQgZmluYWwgPSBmYWxzZTtcblxuICAvKipcbiAqIEB0eXBlIHtMYXRlc3RUb3BpYzxUPn1cbiAqL1xuICBjb25zdCBiYXNlTm90aWZpZXIgPSBGYXIoJ2Jhc2VOb3RpZmllcicsIHtcbiAgICBnZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCA9IC0xbikge1xuICAgICAgaWYgKHVwZGF0ZUNvdW50IDwgY3VycmVudFVwZGF0ZUNvdW50KSB7XG4gICAgICAgIGlmIChjdXJyZW50UmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodXBkYXRlQ291bnQgIT09IGN1cnJlbnRVcGRhdGVDb3VudCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAnZ2V0VXBkYXRlU2luY2UgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHVwZGF0ZUNvdW50LicsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8qIFJldHVybiBhIGZpbmFsIHJlc3BvbnNlIGlmIHdlIGhhdmUgb25lLCBvdGhlcndpc2UgYSBwcm9taXNlIGZvciB0aGUgbmV4dCBzdGF0ZS4qL1xuICAgICAgaWYgKGZpbmFsKSB7XG4gICAgICAgIGFzc2VydChjdXJyZW50UmVzcG9uc2UgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICAgIGlmICghb3B0TmV4dFByb21pc2UpIHtcbiAgICAgICAgY29uc3QgbmV4dEl0ZXJSZXN1bHRQID0gRShpdGVyYXRvclApLm5leHQoKTtcbiAgICAgICAgb3B0TmV4dFByb21pc2UgPSBFLndoZW4oXG4gICAgICAgICAgbmV4dEl0ZXJSZXN1bHRQLFxuICAgICAgICAgICh7IGRvbmUsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICAgIGFzc2VydCghZmluYWwpO1xuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgZmluYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudFVwZGF0ZUNvdW50ICs9IDFuO1xuICAgICAgICAgICAgY3VycmVudFJlc3BvbnNlID0gaGFyZGVuKHtcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIHVwZGF0ZUNvdW50OiBkb25lID8gdW5kZWZpbmVkIDogY3VycmVudFVwZGF0ZUNvdW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcHROZXh0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBfcmVhc29uID0+IHtcbiAgICAgICAgICAgIGZpbmFsID0gdHJ1ZTtcbiAgICAgICAgICAgIGN1cnJlbnRSZXNwb25zZSA9XG4gICAgICAgICAgICAgIC8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSAqL1xuICAgICAgICAgICAgICAobmV4dEl0ZXJSZXN1bHRQKTtcbiAgICAgICAgICAgIG9wdE5leHRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdE5leHRQcm9taXNlO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG4gIGNvbnN0IG5vdGlmaWVyID0gRmFyKCdub3RpZmllcicsIHtcbiAgICAvKiBEb24ndCBsZWFrIHRoZSBvcmlnaW5hbCBhc3luY0l0ZXJhYmxlUCBzaW5jZSBpdCBtYXkgYmUgcmVtb3RlIGFuZCB3ZSBhbHNvKi9cbiAgICAvKiB3YW50IHRoZSBzYW1lIHNlbWFudGljcyBmb3IgdGhpcyBleHBvc2VkIGl0ZXJhYmxlIGFuZCB0aGUgYmFzZU5vdGlmaWVyLiovXG4gICAgLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4gICAgLi4uYmFzZU5vdGlmaWVyLFxuICB9KTtcbiAgcmV0dXJuIG5vdGlmaWVyO1xufTskaM2PX29uY2UubWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUobWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VOb3RpZmllciI6WyJtYWtlTm90aWZpZXIiXSwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiOlsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXSwibWFrZU5vdGlmaWVyS2l0IjpbIm1ha2VOb3RpZmllcktpdCJdLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSI6WyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAbIRejM0IAADNCAAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3B1Ymxpc2gta2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vcGF0dGVybnMiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSIsIkl0ZXJhYmxlRWFjaFRvcGljSSIsIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIiwiUHVibGlzaGVySSIsIlN1YnNjcmliZXJJIiwiU3Vic2NyaWJlclNoYXBlIiwiVXBkYXRlQ291bnRTaGFwZSIsIm1ha2VQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHVibGlzaEtpdElLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRSxGYXIsbWFrZVByb21pc2VLaXQsTSxnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQsY2FuQmVEdXJhYmxlLHByZXBhcmVFeG9DbGFzc0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZUd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImNhbkJlRHVyYWJsZVwiLFskaM2PX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlLCBEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eSwgTGF0ZXN0VG9waWMsIE5vdGlmaWVyLCBOb3RpZmllclJlY29yZCwgUHVibGljYXRpb25SZWNvcmQsIFB1Ymxpc2hlciwgUHVibGlzaEtpdCwgU3Vic2NyaWJlciwgVXBkYXRlUmVjb3JkfSBmcm9tICcuLi9zcmMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICovXG5cbmNvbnN0IHNpbmsgPSAoKSA9PiB7fTtcbmNvbnN0IG1ha2VRdWlldFJlamVjdGlvbiA9IHJlYXNvbiA9PiB7XG4gIGNvbnN0IHJlamVjdGlvbiA9IGhhcmRlbihQcm9taXNlLnJlamVjdChyZWFzb24pKTtcbiAgdm9pZCBFLndoZW4ocmVqZWN0aW9uLCBzaW5rLCBzaW5rKTtcbiAgcmV0dXJuIHJlamVjdGlvbjtcbn07XG5jb25zdCB0b29GYXJSZWplY3Rpb24gPSBtYWtlUXVpZXRSZWplY3Rpb24oXG4gIGhhcmRlbihFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKSxcbik7XG5cbiAgICAgICBjb25zdCBQdWJsaXNoZXJJID0gTS5pbnRlcmZhY2UoJ1B1Ymxpc2hlcicsIHtcbiAgcHVibGlzaDogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbiAgZmluaXNoOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBmYWlsOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxufSk7XG5cbi8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIE5vdGlmaWVyIGBnZXRVcGRhdGVTaW5jZWAuKi8kaM2PX29uY2UuUHVibGlzaGVySShQdWJsaXNoZXJJKTtcbiAgICAgICBjb25zdCBVcGRhdGVDb3VudFNoYXBlID0gTS5vcihNLmJpZ2ludCgpLCBNLm51bWJlcigpKTskaM2PX29uY2UuVXBkYXRlQ291bnRTaGFwZShVcGRhdGVDb3VudFNoYXBlKTtcbiAgICAgICBjb25zdCBTdWJzY3JpYmVySSA9IE0uaW50ZXJmYWNlKCdTdWJzY3JpYmVyJywge1xuICBzdWJzY3JpYmVBZnRlcjogTS5jYWxsKCkub3B0aW9uYWwoTS5iaWdpbnQoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldFVwZGF0ZVNpbmNlOiBNLmNhbGwoKS5vcHRpb25hbChVcGRhdGVDb3VudFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbn0pOyRozY9fb25jZS5TdWJzY3JpYmVySShTdWJzY3JpYmVySSk7XG4gICAgICAgY29uc3QgcHVibGlzaEtpdElLaXQgPSBoYXJkZW4oe1xuICBwdWJsaXNoZXI6IFB1Ymxpc2hlckksXG4gIHN1YnNjcmliZXI6IFN1YnNjcmliZXJJLFxufSk7JGjNj19vbmNlLnB1Ymxpc2hLaXRJS2l0KHB1Ymxpc2hLaXRJS2l0KTtcblxuICAgICAgIGNvbnN0IEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUgPSBNLmludGVyZmFjZShcbiAgJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyxcbiAge1xuICAgIGZvcms6IE0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogTS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSwgLyogb29wczogcmVjdXJzaXZlIHR5cGUqL1xuICAgIG5leHQ6IE0uY2FsbFdoZW4oKS5yZXR1cm5zKE0uYW55KCkpLFxuICB9LFxuKTskaM2PX29uY2UuRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZShGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlKTtcblxuICAgICAgIGNvbnN0IEl0ZXJhYmxlRWFjaFRvcGljSSA9IE0uaW50ZXJmYWNlKCdJdGVyYWJsZUVhY2hUb3BpYycsIHtcbiAgc3Vic2NyaWJlQWZ0ZXI6XG4gICAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFN1YnNjcmliZXJJKS5tZXRob2RHdWFyZHMuc3Vic2NyaWJlQWZ0ZXIsXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06IE0uY2FsbCgpLnJldHVybnMoXG4gICAgTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyksXG4gICksXG59KTskaM2PX29uY2UuSXRlcmFibGVFYWNoVG9waWNJKEl0ZXJhYmxlRWFjaFRvcGljSSk7XG5cbiAgICAgICBjb25zdCBJdGVyYWJsZUxhdGVzdFRvcGljSSA9IE0uaW50ZXJmYWNlKCdJdGVyYWJsZUxhdGVzdFRvcGljJywge1xuICBnZXRVcGRhdGVTaW5jZTpcbiAgICBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoU3Vic2NyaWJlckkpLm1ldGhvZEd1YXJkcy5nZXRVcGRhdGVTaW5jZSxcbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogTS5jYWxsKCkucmV0dXJucyhcbiAgICBNLnJlbW90YWJsZSgnRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InKSxcbiAgKSxcbn0pO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBBcmdcbiAqIEB0ZW1wbGF0ZSBSZXRcbiAqIEBwYXJhbSB7KGFyZzogQXJnKSA9PiBSZXR9IGZuXG4gKiBAcmV0dXJucyB7KGFyZzogQXJnKSA9PiBSZXR9XG4gKi8kaM2PX29uY2UuSXRlcmFibGVMYXRlc3RUb3BpY0koSXRlcmFibGVMYXRlc3RUb3BpY0kpO1xuY29uc3Qgd2Vha01lbW9pemVVbmFyeSA9IGZuID0+IHtcbiAgY29uc3QgY2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuICByZXR1cm4gYXJnID0+IHtcbiAgICAvKiogQHR5cGUge29iamVjdH0gKi9cbiAgICBjb25zdCBvYXJnID0gYXJnO1xuICAgIGlmIChjYWNoZS5oYXMob2FyZykpIHtcbiAgICAgIHJldHVybiBjYWNoZS5nZXQob2FyZyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGZuKGFyZyk7XG4gICAgY2FjaGUuc2V0KG9hcmcsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UHVibGljYXRpb25SZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge1VwZGF0ZVJlY29yZDxUPn1cbiAqL1xuY29uc3QgbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZCA9IHJlY29yZCA9PiB7XG4gIGNvbnN0IHtcbiAgICBoZWFkOiB7IHZhbHVlLCBkb25lIH0sXG4gICAgcHVibGlzaENvdW50LFxuICB9ID0gcmVjb3JkO1xuICBpZiAoZG9uZSkge1xuICAgIC8qIEZpbmFsIHJlc3VsdHMgaGF2ZSB1bmRlZmluZWQgdXBkYXRlQ291bnQuKi9cbiAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWUsIHVwZGF0ZUNvdW50OiB1bmRlZmluZWQgfSk7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCB1cGRhdGVDb3VudDogcHVibGlzaENvdW50IH0pO1xufTtcblxuLyoqXG4gKiBNYWtlcyBhIGB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9YCBwYWlyIGZvciBkb2luZyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIgc3VwcG9ydGluZyBib3RoIFwiZWFjaFwiIGFuZCBcImxhdGVzdFwiIGl0ZXJhdGlvblxuICogb2YgcHVibGlzaGVkIHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1B1Ymxpc2hLaXQ8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUHVibGlzaEtpdCA9ICgpID0+IHtcbiAgLyoqIEB0eXBlIHtQcm9taXNlPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gKi9cbiAgbGV0IHRhaWxQO1xuICAvKiogQHR5cGUge3VuZGVmaW5lZCB8ICgodmFsdWU6IEVSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+KSA9PiB2b2lkKX0gKi9cbiAgbGV0IHRhaWxSO1xuICAoeyBwcm9taXNlOiB0YWlsUCwgcmVzb2x2ZTogdGFpbFIgfSA9IG1ha2VQcm9taXNlS2l0KCkpO1xuXG4gIGxldCBjdXJyZW50UHVibGlzaENvdW50ID0gMG47XG4gIGxldCBjdXJyZW50UCA9IHRhaWxQO1xuICBjb25zdCBhZHZhbmNlQ3VycmVudCA9IChkb25lLCB2YWx1ZSwgcmVqZWN0aW9uKSA9PiB7XG4gICAgaWYgKHRhaWxSID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRQdWJsaXNoQ291bnQgKz0gMW47XG4gICAgY3VycmVudFAgPSB0YWlsUDtcbiAgICBjb25zdCByZXNvbHZlQ3VycmVudCA9IHRhaWxSO1xuXG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHRhaWxQID0gdG9vRmFyUmVqZWN0aW9uO1xuICAgICAgdGFpbFIgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG4gICAgfVxuXG4gICAgaWYgKHJlamVjdGlvbikge1xuICAgICAgcmVzb2x2ZUN1cnJlbnQocmVqZWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZUN1cnJlbnQoXG4gICAgICAgIGhhcmRlbih7XG4gICAgICAgICAgaGVhZDogeyB2YWx1ZSwgZG9uZSB9LFxuICAgICAgICAgIHB1Ymxpc2hDb3VudDogY3VycmVudFB1Ymxpc2hDb3VudCxcbiAgICAgICAgICB0YWlsOiB0YWlsUCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQgPSB3ZWFrTWVtb2l6ZVVuYXJ5KFxuICAgIG1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQsXG4gICk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGUge1N1YnNjcmliZXI8VD59XG4gKi9cbiAgY29uc3Qgc3Vic2NyaWJlciA9IEZhcignU3Vic2NyaWJlcicsIHtcbiAgICBzdWJzY3JpYmVBZnRlcjogKHB1Ymxpc2hDb3VudCA9IC0xbikgPT4ge1xuICAgICAgYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsICdiaWdpbnQnKTtcbiAgICAgIGlmIChwdWJsaXNoQ291bnQgPT09IGN1cnJlbnRQdWJsaXNoQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIHRhaWxQO1xuICAgICAgfSBlbHNlIGlmIChwdWJsaXNoQ291bnQgPCBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50UDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICdzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRVcGRhdGVTaW5jZTogdXBkYXRlQ291bnQgPT4ge1xuICAgICAgaWYgKHVwZGF0ZUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gICAgICB9XG4gICAgICB1cGRhdGVDb3VudCA9IEJpZ0ludCh1cGRhdGVDb3VudCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzdWJzY3JpYmVyXG4gICAgICAgICAgLyogYHN1YnNjcmliZUFmdGVyYCBtYXkgcmVzb2x2ZSB3aXRoIHRoZSB1cGRhdGUgcmVjb3JkIG51bWJlcmVkKi9cbiAgICAgICAgICAvKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuICAgICAgICAgIC8qIHNhbWUgY3JhbmsuLi4qL1xuICAgICAgICAgIC5zdWJzY3JpYmVBZnRlcih1cGRhdGVDb3VudClcbiAgICAgICAgICAvKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbiAgICAgICAgICAvKiBmdXJ0aGVyIG9uZXMuKi9cbiAgICAgICAgICAudGhlbigoKSA9PiBzdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKCkpXG4gICAgICApO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7UHVibGlzaGVyPFQ+fSAqL1xuICBjb25zdCBwdWJsaXNoZXIgPSBGYXIoJ1B1Ymxpc2hlcicsIHtcbiAgICBwdWJsaXNoOiB2YWx1ZSA9PiB7XG4gICAgICBhZHZhbmNlQ3VycmVudChmYWxzZSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZmluaXNoOiBmaW5hbFZhbHVlID0+IHtcbiAgICAgIGFkdmFuY2VDdXJyZW50KHRydWUsIGZpbmFsVmFsdWUpO1xuICAgIH0sXG4gICAgZmFpbDogcmVhc29uID0+IHtcbiAgICAgIGFkdmFuY2VDdXJyZW50KHRydWUsIHVuZGVmaW5lZCwgbWFrZVF1aWV0UmVqZWN0aW9uKHJlYXNvbikpO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gaGFyZGVuKHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0pO1xufTskaM2PX29uY2UubWFrZVB1Ymxpc2hLaXQobWFrZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VQdWJsaXNoS2l0KTtcblxuY29uc3QgRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlID0gaGFyZGVuKHtcbiAgdmFsdWVEdXJhYmlsaXR5OiBNLmFueSgpLFxuICBwdWJsaXNoQ291bnQ6IE0uYW55KCksXG4gIHN0YXR1czogTS5hbnkoKSxcbiAgaGFzVmFsdWU6IE0uYW55KCksXG4gIHZhbHVlOiBNLmFueSgpLFxufSk7XG5cbi8qIFRPRE86IE1vdmUgZHVyYWJsZSBwdWJsaXNoIGtpdCB0byBhIG5ldyBmaWxlPyovXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eSAmICdtYW5kYXRvcnknfSBbb3B0aW9ucy52YWx1ZUR1cmFiaWxpdHldXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX1cbiAqL1xuY29uc3QgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGUgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHsgdmFsdWVEdXJhYmlsaXR5ID0gJ21hbmRhdG9yeScgfSA9IG9wdGlvbnM7XG4gIGFzc2VydC5lcXVhbCh2YWx1ZUR1cmFiaWxpdHksICdtYW5kYXRvcnknKTtcbiAgcmV0dXJuIHtcbiAgICAvKiBjb25maWd1cmF0aW9uKi9cbiAgICB2YWx1ZUR1cmFiaWxpdHksXG5cbiAgICAvKiBsaWZlY3ljbGUgcHJvZ3Jlc3MqL1xuICAgIHB1Ymxpc2hDb3VudDogMG4sXG4gICAgc3RhdHVzOiAnbGl2ZScsIC8qIHwgJ2ZpbmlzaGVkJyB8ICdmYWlsZWQnKi9cblxuICAgIC8qIHBlcnNpc3RlZCByZXN1bHQgZGF0YSovXG4gICAgLyogTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIG5vbi10ZXJtaW5hbCB2YWx1ZXMgZnJvbSBgcHVibGlzaGAsKi9cbiAgICAvKiB2YWx1ZSBhbHNvIGhvbGRzIHRoZSB0ZXJtaW5hbCB2YWx1ZSBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYC4qL1xuICAgIGhhc1ZhbHVlOiBmYWxzZSxcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICB9O1xufTtcblxuLyogV2UgbmVlZCB0aGUgV2Vha01hcCBrZXkgZm9yIGEga2l0IHRvIGJlIGEgdnJlZi1iZWFyaW5nIG9iamVjdCovXG4vKiBpbiBpdHMgY29ob3J0LCBhbmQgaGF2ZSBhcmJpdHJhcmlseSBjaG9zZW4gdGhlIHB1Ymxpc2hlciBmYWNldC4qL1xuLyoqIEB0eXBlZGVmIHtQdWJsaXNoZXI8Kj59IER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5ICovXG4vKipcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXl9XG4gKi9cbmNvbnN0IGdldEVwaGVtZXJhbEtleSA9IGZhY2V0cyA9PiBmYWNldHMucHVibGlzaGVyO1xuXG4vKipcbiAqIEB0eXBlZGVmIER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YVxuICogQHByb3BlcnR5IHtQcm9taXNlPCo+IHwgdW5kZWZpbmVkfSBjdXJyZW50UCBUaGUgY3VycmVudC1yZXN1bHQgcHJvbWlzZVxuICogICAodW5kZWZpbmVkIHVubGVzcyByZXNvbHZlZCB3aXRoIHVucmVjb3ZlcmFibGUgZXBoZW1lcmFsIGRhdGEpXG4gKiBAcHJvcGVydHkge1Byb21pc2U8Kj59IHRhaWxQIFRoZSBuZXh0LXJlc3VsdCBwcm9taXNlXG4gKiBAcHJvcGVydHkgeygodmFsdWU6IGFueSkgPT4gdm9pZCkgfCB1bmRlZmluZWR9IHRhaWxSIFRoZSBuZXh0LXJlc3VsdCByZXNvbHZlclxuICogICAodW5kZWZpbmVkIHdoZW4gdGhlIHB1Ymxpc2gga2l0IGhhcyB0ZXJtaW5hdGVkKVxuICovXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleSwgRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPn0gKi9cbmNvbnN0IGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YSA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudC1yZXN1bHQgcHJvbWlzZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBkdXJhYmxlXG4gKiBwdWJsaXNoIGtpdCwgcmVjcmVhdGVkIHVubGVzcyB3ZSBhbHJlYWR5IGhhdmUgb25lIHdpdGggcmV0YWluZWRcbiAqIGVwaGVtZXJhbCBkYXRhLlxuICpcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcGFyYW0ge1Byb21pc2U8Kj59IHRhaWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICovXG5jb25zdCBwcm92aWRlQ3VycmVudFAgPSAoc3RhdGUsIGZhY2V0cywgdGFpbCkgPT4ge1xuICBjb25zdCBlcGhlbWVyYWxLZXkgPSBnZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbiAgY29uc3QgZm91bmREYXRhID0gZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLmdldChlcGhlbWVyYWxLZXkpO1xuICBjb25zdCBjdXJyZW50UCA9IGZvdW5kRGF0YSAmJiBmb3VuZERhdGEuY3VycmVudFA7XG4gIGlmIChjdXJyZW50UCkge1xuICAgIHJldHVybiBjdXJyZW50UDtcbiAgfVxuXG4gIGNvbnN0IHsgcHVibGlzaENvdW50LCBzdGF0dXMsIGhhc1ZhbHVlLCB2YWx1ZSB9ID0gc3RhdGU7XG4gIGlmICghaGFzVmFsdWUpIHtcbiAgICBhc3NlcnQoc3RhdHVzID09PSAnbGl2ZScpO1xuICAgIHJldHVybiB0YWlsO1xuICB9XG4gIGlmIChzdGF0dXMgPT09ICdsaXZlJyB8fCBzdGF0dXMgPT09ICdmaW5pc2hlZCcpIHtcbiAgICBjb25zdCBjZWxsID0gaGFyZGVuKHtcbiAgICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmU6IHN0YXR1cyAhPT0gJ2xpdmUnIH0sXG4gICAgICBwdWJsaXNoQ291bnQsXG4gICAgICB0YWlsLFxuICAgIH0pO1xuICAgIHJldHVybiBFLnJlc29sdmUoY2VsbCk7XG4gIH0gZWxzZSBpZiAoc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgIHJldHVybiBtYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEZhaWxgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuZXh0LXJlc3VsdCBwcm9taXNlIGFuZCByZXNvbHZlciBhc3NvY2lhdGVkIHdpdGggYSBnaXZlblxuICogZHVyYWJsZSBwdWJsaXNoIGtpdC5cbiAqIFRoZXNlIGFyZSBsb3N0IG9uIHVwZ3JhZGUgYnV0IHJlY3JlYXRlZCBvbi1kZW1hbmQsIHByZXNlcnZpbmcgdGhlXG4gKiB2YWx1ZSBpbiAoYnV0IG5vdCB0aGUgaWRlbnRpdHkgb2YpIHRoZSBjdXJyZW50IHsgdmFsdWUsIGRvbmUgfSByZXN1bHRcbiAqIHdoZW4gcG9zc2libGUsIHdoaWNoIGlzIGFsd2F5cyB0aGUgY2FzZSB3aGVuIHRoYXQgdmFsdWUgaXMgdGVybWluYWxcbiAqIChpLmUuLCBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYCkgb3Igd2hlbiB0aGUgZHVyYWJsZSBwdWJsaXNoIGtpdCBpc1xuICogY29uZmlndXJlZCB3aXRoIGB2YWx1ZUR1cmFiaWxpdHk6ICdtYW5kYXRvcnknYC5cbiAqXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9IHN0YXRlXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YX1cbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YSA9IChzdGF0ZSwgZmFjZXRzKSA9PiB7XG4gIGNvbnN0IGVwaGVtZXJhbEtleSA9IGdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuICBjb25zdCBmb3VuZERhdGEgPSBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG4gIGlmIChmb3VuZERhdGEpIHtcbiAgICByZXR1cm4gZm91bmREYXRhO1xuICB9XG5cbiAgY29uc3QgeyBzdGF0dXMgfSA9IHN0YXRlO1xuICBsZXQgdGFpbFA7XG4gIGxldCB0YWlsUjtcbiAgaWYgKHN0YXR1cyA9PT0gJ2xpdmUnKSB7XG4gICAgKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKTtcbiAgICB2b2lkIEUud2hlbih0YWlsUCwgc2luaywgc2luayk7XG4gIH0gZWxzZSBpZiAoc3RhdHVzID09PSAnZmluaXNoZWQnIHx8IHN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICB0YWlsUCA9IHRvb0ZhclJlamVjdGlvbjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBGYWlsYEludmFsaWQgZHVyYWJsZSBwcm9taXNlIGtpdCBzdGF0dXM6ICR7cShzdGF0dXMpfWA7XG4gIH1cbiAgLyogY3VycmVudFAgaXMgbm90IGVwaGVtZXJhbCB3aGVuIHJlc3RvcmluZyBmcm9tIHBlcnNpc3RlZCBzdGF0ZS4qL1xuICBjb25zdCBvYmogPSBoYXJkZW4oeyBjdXJyZW50UDogdW5kZWZpbmVkLCB0YWlsUCwgdGFpbFIgfSk7XG4gIGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoZXBoZW1lcmFsS2V5LCBvYmopO1xuICByZXR1cm4gb2JqO1xufTtcblxuLyoqXG4gKiBFeHRlbmRzIHRoZSBzZXF1ZW5jZSBvZiByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSB7e3N0YXRlOiBEdXJhYmxlUHVibGlzaEtpdFN0YXRlLCBmYWNldHM6IFB1Ymxpc2hLaXQ8Kj59fSBjb250ZXh0XG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVsnc3RhdHVzJ119IFt0YXJnZXRTdGF0dXNdXG4gKi9cbmNvbnN0IGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCA9IChjb250ZXh0LCB2YWx1ZSwgdGFyZ2V0U3RhdHVzID0gJ2xpdmUnKSA9PiB7XG4gIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gY29udGV4dDtcbiAgY29uc3QgeyB2YWx1ZUR1cmFiaWxpdHksIHN0YXR1cyB9ID0gc3RhdGU7XG4gIGlmIChzdGF0dXMgIT09ICdsaXZlJykge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuICB9XG4gIGNvbnN0IGRvbmUgPSB0YXJnZXRTdGF0dXMgIT09ICdsaXZlJztcbiAgaWYgKGRvbmUgfHwgdmFsdWVEdXJhYmlsaXR5ID09PSAnbWFuZGF0b3J5Jykge1xuICAgIGNhbkJlRHVyYWJsZSh2YWx1ZSkgfHwgRmFpbGBDYW5ub3QgYWNjZXB0IG5vbi1kdXJhYmxlIHZhbHVlOiAke3ZhbHVlfWA7XG4gIH1cbiAgY29uc3QgeyB0YWlsUDogb2xkVGFpbFAsIHRhaWxSOiByZXNvbHZlT2xkVGFpbCB9ID1cbiAgICBwcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKHN0YXRlLCBmYWNldHMpO1xuICBhc3NlcnQudHlwZW9mKHJlc29sdmVPbGRUYWlsLCAnZnVuY3Rpb24nKTtcblxuICBjb25zdCBwdWJsaXNoQ291bnQgPSBzdGF0ZS5wdWJsaXNoQ291bnQgKyAxbjtcbiAgc3RhdGUucHVibGlzaENvdW50ID0gcHVibGlzaENvdW50O1xuXG4gIGxldCB0YWlsUDtcbiAgbGV0IHRhaWxSO1xuICBpZiAoZG9uZSkge1xuICAgIHN0YXRlLnN0YXR1cyA9IHRhcmdldFN0YXR1cztcbiAgICB0YWlsUCA9IHRvb0ZhclJlamVjdGlvbjtcbiAgICB0YWlsUiA9IHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICAoeyBwcm9taXNlOiB0YWlsUCwgcmVzb2x2ZTogdGFpbFIgfSA9IG1ha2VQcm9taXNlS2l0KCkpO1xuICAgIHZvaWQgRS53aGVuKHRhaWxQLCBzaW5rLCBzaW5rKTtcbiAgfVxuXG4gIGxldCBjdXJyZW50UDtcbiAgaWYgKHRhcmdldFN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICBzdGF0ZS5oYXNWYWx1ZSA9IHRydWU7XG4gICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICBjb25zdCByZWplY3Rpb24gPSBtYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xuICAgIHJlc29sdmVPbGRUYWlsKHJlamVjdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgLyogUGVyc2lzdCBhIHRlcm1pbmFsIHZhbHVlLCBvciBhIG5vbi10ZXJtaW5hbCB2YWx1ZSovXG4gICAgLyogaWYgY29uZmlndXJlZCBhcyAnbWFuZGF0b3J5JyBvciAnb3Bwb3J0dW5pc3RpYycuKi9cbiAgICBpZiAoZG9uZSB8fCAodmFsdWVEdXJhYmlsaXR5ICE9PSAnaWdub3JlZCcgJiYgY2FuQmVEdXJhYmxlKHZhbHVlKSkpIHtcbiAgICAgIHN0YXRlLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIC8qIFJldGFpbiBhbnkgcHJvbWlzZSB3aXRoIG5vbi1kdXJhYmxlIHJlc29sdXRpb24uKi9cbiAgICAgIGN1cnJlbnRQID0gb2xkVGFpbFA7XG4gICAgfVxuXG4gICAgcmVzb2x2ZU9sZFRhaWwoXG4gICAgICBoYXJkZW4oe1xuICAgICAgICBoZWFkOiB7IHZhbHVlLCBkb25lIH0sXG4gICAgICAgIHB1Ymxpc2hDb3VudCxcbiAgICAgICAgdGFpbDogdGFpbFAsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLnNldChcbiAgICBnZXRFcGhlbWVyYWxLZXkoZmFjZXRzKSxcbiAgICBoYXJkZW4oeyBjdXJyZW50UCwgdGFpbFAsIHRhaWxSIH0pLFxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHJldHVybnMgezxUPihvcHRpb25zPzogUGFyYW1ldGVyczx0eXBlb2YgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGU+WzBdKSA9PiBQdWJsaXNoS2l0PFQ+fVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0ID0gKGJhZ2dhZ2UsIGtpbmROYW1lKSA9PiB7XG4gIC8qIFRPRE86IE9uY2Ugd2UgdW5pZnkgd2l0aCBtYWtlUHVibGlzaEtpdCwgd2Ugd2lsbCB1c2UgYSBab25lLWNvbXBhdGlibGUgd2VhayovXG4gIC8qIG1hcCBmb3IgbWVtb2l6YXRpb24uKi9cbiAgY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkID0gbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZDtcblxuICByZXR1cm4gcHJlcGFyZUV4b0NsYXNzS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgcHVibGlzaEtpdElLaXQsXG4gICAgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGUsXG4gICAge1xuICAgICAgLyogVGhlIHB1Ymxpc2hlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuICAgICAgLyogYWNjZXB0cyBuZXcgdmFsdWVzLiovXG4gICAgICBwdWJsaXNoZXI6IHtcbiAgICAgICAgcHVibGlzaCh2YWx1ZSkge1xuICAgICAgICAgIGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZpbmlzaChmaW5hbFZhbHVlKSB7XG4gICAgICAgICAgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsIGZpbmFsVmFsdWUsICdmaW5pc2hlZCcpO1xuICAgICAgICB9LFxuICAgICAgICBmYWlsKHJlYXNvbikge1xuICAgICAgICAgIGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLCByZWFzb24sICdmYWlsZWQnKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC8qIFRoZSBzdWJzY3JpYmVyIGZhY2V0IG9mIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCovXG4gICAgICAvKiBwcm9wYWdhdGVzIHZhbHVlcy4qL1xuICAgICAgc3Vic2NyaWJlcjoge1xuICAgICAgICBzdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQgPSAtMW4pIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBwdWJsaXNoQ291bnQ6IGN1cnJlbnRQdWJsaXNoQ291bnQgfSA9IHN0YXRlO1xuICAgICAgICAgIGNvbnN0IHsgY3VycmVudFAsIHRhaWxQIH0gPSBwcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKFxuICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICBmYWNldHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocHVibGlzaENvdW50ID09PSBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFpbFA7XG4gICAgICAgICAgfSBlbHNlIGlmIChwdWJsaXNoQ291bnQgPCBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFAgfHwgcHJvdmlkZUN1cnJlbnRQKHN0YXRlLCBmYWNldHMsIHRhaWxQKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICdzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmYWNldHM6IHsgc3Vic2NyaWJlciB9LFxuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIGlmICh1cGRhdGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpLnRoZW4obWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdXBkYXRlQ291bnQgPSBCaWdJbnQodXBkYXRlQ291bnQpO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBzdWJzY3JpYmVyXG4gICAgICAgICAgICAgIC8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4gICAgICAgICAgICAgIC8qIGB1cGRhdGVDb3VudCArIDFgLCBldmVuIGlmIHNldmVyYWwgdXBkYXRlcyBhcmUgcHVibGlzaGVkIGluIHRoZSovXG4gICAgICAgICAgICAgIC8qIHNhbWUgY3JhbmsuLi4qL1xuICAgICAgICAgICAgICAuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4gICAgICAgICAgICAgIC8qIC4uLiBzbyB3ZSBwb2xsIHRoZSBsYXRlc3QgcHVibGlzaGVkIHVwZGF0ZSwgd2l0aG91dCB3YWl0aW5nIGZvciBhbnkqL1xuICAgICAgICAgICAgICAvKiBmdXJ0aGVyIG9uZXMuKi9cbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gc3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgc3RhdGVTaGFwZTogRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlLFxuICAgIH0sXG4gICk7XG59OyRozY9fb25jZS5wcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcbmhhcmRlbihwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQpO1xuXG4gICAgICAgY29uc3QgU3Vic2NyaWJlclNoYXBlID0gTS5yZW1vdGFibGUoJ1N1YnNjcmliZXInKTskaM2PX29uY2UuU3Vic2NyaWJlclNoYXBlKFN1YnNjcmliZXJTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQdWJsaXNoZXJJIjpbIlB1Ymxpc2hlckkiXSwiVXBkYXRlQ291bnRTaGFwZSI6WyJVcGRhdGVDb3VudFNoYXBlIl0sIlN1YnNjcmliZXJJIjpbIlN1YnNjcmliZXJJIl0sInB1Ymxpc2hLaXRJS2l0IjpbInB1Ymxpc2hLaXRJS2l0Il0sIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiOlsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSJdLCJJdGVyYWJsZUVhY2hUb3BpY0kiOlsiSXRlcmFibGVFYWNoVG9waWNJIl0sIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIjpbIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIl0sIm1ha2VQdWJsaXNoS2l0IjpbIm1ha2VQdWJsaXNoS2l0Il0sInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCI6WyJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiXSwiU3Vic2NyaWJlclNoYXBlIjpbIlN1YnNjcmliZXJTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAsSEQ3qgwAAKoMAAAuAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3JlZC1ub3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBlbmRvL2ZhciIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiXSwiZXhwb3J0cyI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UsRSxGYXIsb2JzZXJ2ZU5vdGlmaWVyOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLFskaM2PX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsWyRozY9fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZU5vdGlmaWVyXCIsWyRozY9fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0Jhc2VOb3RpZmllciwgTm90aWZpZXJ9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7RVJlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtFTWFyc2hhbGxlcn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMnO1xuICogQGltcG9ydCB7U3RvcmVkRmFjZXQsIFN0b3JhZ2VOb2RlLCBVbnNlcmlhbGl6ZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICogQGltcG9ydCB7UGFzc2FibGVDYXB9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD4gJiBPbWl0PFN0b3JlZEZhY2V0LCAnZ2V0U3RvcmVLZXknPn0gU3RvcmVkTm90aWZpZXJcbiAqL1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkTm90aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGVDYXB9IFRcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjxUPj59IG5vdGlmaWVyXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZE5vdGlmaWVyPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVN0b3JlZE5vdGlmaWVyID0gKG5vdGlmaWVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICBhc3NlcnRBbGxEZWZpbmVkKHsgbm90aWZpZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyIH0pO1xuXG4gIGNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlID0gbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcik7XG5cbiAgb2JzZXJ2ZU5vdGlmaWVyKG5vdGlmaWVyLCB7XG4gICAgdXBkYXRlU3RhdGUodmFsdWUpIHtcbiAgICAgIG1hcnNoYWxsVG9TdG9yYWdlKHZhbHVlKS5jYXRjaChyZWFzb24gPT5cbiAgICAgICAgY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIHVwZGF0ZVN0YXRlJywgcmVhc29uKSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBmYWlsKHJlYXNvbikge1xuICAgICAgY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLCByZWFzb24pO1xuICAgIH0sXG4gIH0pLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgaGFsdGVkIGl0ZXJhdGlvbicsIHJlYXNvbik7XG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuICBjb25zdCB1bnNlcmlhbGl6ZXIgPSBGYXIoJ3Vuc2VyaWFsaXplcicsIHtcbiAgICBmcm9tQ2FwRGF0YTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICAgIHVuc2VyaWFsaXplOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7U3RvcmVkTm90aWZpZXI8VD59ICovXG4gIGNvbnN0IHN0b3JlZE5vdGlmaWVyID0gRmFyKCdTdG9yZWROb3RpZmllcicsIHtcbiAgICBnZXRVcGRhdGVTaW5jZTogdXBkYXRlQ291bnQgPT4gRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuICAgIGdldFBhdGg6ICgpID0+IEUoc3RvcmFnZU5vZGUpLmdldFBhdGgoKSxcbiAgICBnZXRVbnNlcmlhbGl6ZXI6ICgpID0+IHVuc2VyaWFsaXplcixcbiAgfSk7XG4gIHJldHVybiBzdG9yZWROb3RpZmllcjtcbn07JGjNj19vbmNlLm1ha2VTdG9yZWROb3RpZmllcihtYWtlU3RvcmVkTm90aWZpZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN0b3JlZE5vdGlmaWVyIjpbIm1ha2VTdG9yZWROb3RpZmllciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB65k5eJCYAACQmAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3Jlc3ViLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmVyLmpzIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiLCJtYWtlU3RvcmVkUHVibGlzaEtpdCIsIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiLCJtYWtlU3RvcmVkU3Vic2NyaWJlciIsIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhcixtYWtlTWFyc2hhbCxhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Usb2JzZXJ2ZUl0ZXJhdGlvbixtYWtlUHVibGlzaEtpdCxtYWtlU3Vic2NyaXB0aW9uS2l0LHN1YnNjcmliZUVhY2g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIixbJGjNj19hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjNj19hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLFskaM2PX2EgPT4gKG9ic2VydmVJdGVyYXRpb24gPSAkaM2PX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCIsWyRozY9fYSA9PiAobWFrZVN1YnNjcmlwdGlvbktpdCA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVtb3RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtJdGVyYXRpb25PYnNlcnZlciwgTGF0ZXN0VG9waWMsIE5vdGlmaWVyLCBOb3RpZmllclJlY29yZCwgUHVibGljYXRpb25SZWNvcmQsIFB1Ymxpc2hlciwgUHVibGlzaEtpdCwgU3RvcmVkUHVibGlzaEtpdCwgU3RvcmVkU3Vic2NyaXB0aW9uLCBTdG9yZWRTdWJzY3JpYmVyLCBTdWJzY3JpYmVyLCBTdWJzY3JpcHRpb24sIFVwZGF0ZVJlY29yZH0gZnJvbSAnLi4vc3JjL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1N0b3JhZ2VOb2RlLCBVbnNlcmlhbGl6ZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICogQGltcG9ydCB7RU1hcnNoYWxsZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlQ2FwfSBmcm9tICdAZW5kby9tYXJzaGFsJztcbiAqL1xuXG4vKipcbiAqIE5COiBkb2VzIG5vdCB5ZXQgc3Vydml2ZSB1cGdyYWRlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjg5M1xuICpcbiAqIEBhbHBoYVxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHsodjogVCkgPT4gdm9pZH0gY29uc3VtZVZhbHVlXG4gKi9cbiAgICAgICBjb25zdCBmb3JFYWNoUHVibGljYXRpb25SZWNvcmQgPSBhc3luYyAoc3Vic2NyaWJlciwgY29uc3VtZVZhbHVlKSA9PiB7XG4gIC8qIFdlIG9wZW4tY29kZSB0aGUgZm9yLWF3YWl0LW9mIGltcGxlbWVudGF0aW9uIHJhdGhlciB0aGFuIHVzaW5nIHRoYXQgc3ludGF4Ki9cbiAgLyogZGlyZWN0bHkgYmVjYXVzZSB3ZSB3YW50IHRvIHJ1biB0aGUgY29uc3VtZXIgb24gdGhlIGRvbmUgdmFsdWUgYXMgd2VsbC4qL1xuICBjb25zdCBpdGVyYXRvciA9IHN1YnNjcmliZUVhY2goc3Vic2NyaWJlcilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gIGF3YWl0IG51bGw7XG4gIHdoaWxlICghZmluaXNoZWQpIHtcbiAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG4gICAgYXdhaXQgY29uc3VtZVZhbHVlKHZhbHVlKTtcbiAgICBmaW5pc2hlZCA9ICEhZG9uZTtcbiAgfVxufTtcblxuLyoqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgbm8gZnVydGhlciB3cml0ZXMgdG8gaXQgd2lsbFxuICogYmUgYXR0ZW1wdGVkIChidXQgcmVzdWx0cyB3aWxsIHJlbWFpbiBhdmFpbGFibGUgZnJvbSB0aGUgc3Vic2NyaWJlcikuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmliZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGVDYXB9IFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fVxuICovJGjNj19vbmNlLmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChmb3JFYWNoUHVibGljYXRpb25SZWNvcmQpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRTdWJzY3JpYmVyID0gKHN1YnNjcmliZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGFzc2VydEFsbERlZmluZWQoeyBzdWJzY3JpYmVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlciB9KTtcblxuICBjb25zdCBtYXJzaGFsbFRvU3RvcmFnZSA9IG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpO1xuXG4gIC8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xuICBmb3JFYWNoUHVibGljYXRpb25SZWNvcmQoc3Vic2NyaWJlciwgbWFyc2hhbGxUb1N0b3JhZ2UpLmNhdGNoKGVyciA9PiB7XG4gICAgLyogVE9ETzogSG93IHNob3VsZCB3ZSBoYW5kbGUgYW5kL29yIHN1cmZhY2UgdGhpcyBmYWlsdXJlPyovXG4gICAgLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTc2NiNkaXNjdXNzaW9uX3I5MjI0OTgwODgqL1xuICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JlZFN1YnNjcmliZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLCBlcnIpO1xuICB9KTtcblxuICAvKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbiAgY29uc3QgdW5zZXJpYWxpemVyID0gRmFyKCd1bnNlcmlhbGl6ZXInLCB7XG4gICAgZnJvbUNhcERhdGE6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgICB1bnNlcmlhbGl6ZTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICB9KTtcblxuICAvKiogQHR5cGUge1N0b3JlZFN1YnNjcmliZXI8VD59ICovXG4gIGNvbnN0IHN0b3Jlc3ViID0gRmFyKCdTdG9yZWRTdWJzY3JpYmVyJywge1xuICAgIHN1YnNjcmliZUFmdGVyOiBwdWJsaXNoQ291bnQgPT4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuICAgIGdldFVwZGF0ZVNpbmNlOiB1cGRhdGVDb3VudCA9PiBzdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbiAgICBnZXRQYXRoOiAoKSA9PiBFKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG4gICAgZ2V0U3RvcmVLZXk6ICgpID0+IEUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCksXG4gICAgZ2V0VW5zZXJpYWxpemVyOiAoKSA9PiB1bnNlcmlhbGl6ZXIsXG4gIH0pO1xuICByZXR1cm4gc3RvcmVzdWI7XG59O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBtYWtlU3RvcmVkU3Vic2NyaWJlclxuICpcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCB0aGUgaXRlcmF0aW9uIHdpbGwgYmUgdGVybWluYXRlZC5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPiB8IG51bGx9IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IFttYXJzaGFsbGVyXVxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn1cbiAqLyRozY9fb25jZS5tYWtlU3RvcmVkU3Vic2NyaWJlcihtYWtlU3RvcmVkU3Vic2NyaWJlcik7XG4gICAgICAgY29uc3QgbWFrZVN0b3JlZFN1YnNjcmlwdGlvbiA9IChcbiAgc3Vic2NyaXB0aW9uLFxuICBzdG9yYWdlTm9kZSxcbiAgbWFyc2hhbGxlciA9IG1ha2VNYXJzaGFsKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG4gICAgbWFyc2hhbFNhdmVFcnJvcjogKCkgPT4ge30sXG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG4gIH0pLFxuKSA9PiB7XG4gIC8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuICBjb25zdCB1bnNlcmlhbGl6ZXIgPSBGYXIoJ3Vuc2VyaWFsaXplcicsIHtcbiAgICBmcm9tQ2FwRGF0YTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICAgIHVuc2VyaWFsaXplOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gIH0pO1xuXG4gIC8qIEFib3J0IHRoZSBpdGVyYXRpb24gb24gdGhlIG5leHQgb2JzZXJ2YXRpb24gaWYgdGhlIHB1Ymxpc2hlciBldmVyIGZhaWxzLiovXG4gIGxldCBwdWJsaXNoRmFpbGVkID0gZmFsc2U7XG4gIGxldCBwdWJsaXNoRXhjZXB0aW9uO1xuXG4gIGNvbnN0IGZhaWwgPSBlcnIgPT4ge1xuICAgIHB1Ymxpc2hGYWlsZWQgPSB0cnVlO1xuICAgIHB1Ymxpc2hFeGNlcHRpb24gPSBlcnI7XG4gIH07XG5cbiAgLyogTXVzdCAqbm90KiBiZSBhbiBhc3luYyBmdW5jdGlvbiwgYmVjYXVzZSBpdCBzb21ldGltZXMgbXVzdCB0aHJvdyB0byBhYm9ydCovXG4gIC8qIHRoZSBpdGVyYXRpb24uKi9cbiAgY29uc3QgcHVibGlzaFZhbHVlID0gb2JqID0+IHtcbiAgICBhc3NlcnQoc3RvcmFnZU5vZGUpO1xuICAgIGlmIChwdWJsaXNoRmFpbGVkKSB7XG4gICAgICAvKiBUbyBwcm9wZXJseSBhYm9ydCB0aGUgaXRlcmF0aW9uLCB0aGlzIG11c3QgYmUgYSBzeW5jaHJvbm91cyBleGNlcHRpb24uKi9cbiAgICAgIHRocm93IHB1Ymxpc2hFeGNlcHRpb247XG4gICAgfVxuXG4gICAgLyogUHVibGlzaCB0aGUgdmFsdWUsIGNhcHR1cmluZyBhbnkgZXJyb3IuKi9cbiAgICBFKG1hcnNoYWxsZXIpXG4gICAgICAudG9DYXBEYXRhKG9iailcbiAgICAgIC50aGVuKHNlcmlhbGl6ZWQgPT4ge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCk7XG4gICAgICAgIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShlbmNvZGVkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZmFpbCk7XG4gIH07XG5cbiAgaWYgKHN0b3JhZ2VOb2RlKSB7XG4gICAgLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG4gICAgb2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpcHRpb24sIHtcbiAgICAgIHVwZGF0ZVN0YXRlOiBwdWJsaXNoVmFsdWUsXG4gICAgICBmaW5pc2g6IHB1Ymxpc2hWYWx1ZSxcbiAgICB9KS5jYXRjaChmYWlsKTtcbiAgfVxuXG4gIC8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSAqL1xuICBjb25zdCBzdG9yZXN1YiA9IEZhcignU3RvcmVkU3Vic2NyaXB0aW9uJywge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgZ2V0U3RvcmVLZXkgdHlwZSBkb2VzIG5vdCBoYXZlIGBzdWJzY3JpcHRpb25gKi9cbiAgICBnZXRTdG9yZUtleTogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzdG9yYWdlTm9kZSkge1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgc3Vic2NyaXB0aW9uIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RvcmVLZXkgPSBhd2FpdCBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IC4uLnN0b3JlS2V5LCBzdWJzY3JpcHRpb24gfSk7XG4gICAgfSxcbiAgICBnZXRVbnNlcmlhbGl6ZXI6ICgpID0+IHVuc2VyaWFsaXplcixcbiAgICBnZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczogKCkgPT5cbiAgICAgIHN1YnNjcmlwdGlvbi5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFscygpLFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHN1YnNjcmlwdGlvbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSxcbiAgICBzdWJzY3JpYmVBZnRlcjogcHVibGlzaENvdW50ID0+IHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuICB9KTtcbiAgcmV0dXJuIHN0b3Jlc3ViO1xufTskaM2PX29uY2UubWFrZVN0b3JlZFN1YnNjcmlwdGlvbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgU3RvcmVkUHVibGlzaEtpdFxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZFB1Ymxpc2hlcktpdFxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpcHRpb248VD59IHN1YnNjcmliZXJcbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHB1Ymxpc2hlclxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgaW5jb21wYXRpYmxlIHdpdGggZHVyYWJpbGl0eTsgaW5zdGVhZCBoYW5kbGUgdnN0b3JhZ2UgZXBoZW1lcmFsbHkgb24gYSBkdXJhYmxlIFB1Ymxpc2hLaXRcbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT4gfCBudWxsfSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBbbWFyc2hhbGxlcl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hpbGRQYXRoXVxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hlcktpdDxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQgPSAoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIsIGNoaWxkUGF0aCkgPT4ge1xuICBjb25zdCB7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfSA9IG1ha2VTdWJzY3JpcHRpb25LaXQoKTtcblxuICBpZiAoc3RvcmFnZU5vZGUgJiYgY2hpbGRQYXRoKSB7XG4gICAgc3RvcmFnZU5vZGUgPSBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkUGF0aCk7XG4gIH1cblxuICAvKiB3cmFwIHRoZSBzdWJzY3JpcHRpb24gdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlLCByZXBlYXRpbmcgdG8gdGhpcyBgc3Vic2NyaWJlcmAqL1xuICBjb25zdCBzdWJzY3JpYmVyID0gbWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbiAgICBzdWJzY3JpcHRpb24sXG4gICAgc3RvcmFnZU5vZGUsXG4gICAgbWFyc2hhbGxlcixcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHB1Ymxpc2hlcjogcHVibGljYXRpb24sXG4gICAgc3Vic2NyaWJlcixcbiAgfTtcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgaW5jb21wYXRpYmxlIHdpdGggZHVyYWJpbGl0eTsgaW5zdGVhZCBoYW5kbGUgdnN0b3JhZ2UgZXBoZW1lcmFsbHkgb24gYSBkdXJhYmxlIFB1Ymxpc2hLaXRcbiAqXG4gKiBMaWtlIG1ha2VQdWJsaXNoS2l0IHRoaXMgbWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogV2hhdCdzIGRpZmZlcmVudCBpcyBgc3Vic2NyaWJlcmAgdGVlcyByZWNvcmRzLCB3cml0aW5nIG91dCB0byBzdG9yYWdlTm9kZS5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaEtpdDxUPn1cbiAqLyRozY9fb25jZS5tYWtlU3RvcmVkUHVibGlzaGVyS2l0KG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRQdWJsaXNoS2l0ID0gKHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuXG4gIHJldHVybiB7XG4gICAgcHVibGlzaGVyLFxuICAgIC8qIHdyYXAgdGhlIHN1YnNjcmliZXIgdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlKi9cbiAgICBzdWJzY3JpYmVyOiBtYWtlU3RvcmVkU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlciksXG4gIH07XG59OyRozY9fb25jZS5tYWtlU3RvcmVkUHVibGlzaEtpdChtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCJdLCJtYWtlU3RvcmVkU3Vic2NyaWJlciI6WyJtYWtlU3RvcmVkU3Vic2NyaWJlciJdLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIjpbIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCI6WyJtYWtlU3RvcmVkUHVibGlzaGVyS2l0Il0sIm1ha2VTdG9yZWRQdWJsaXNoS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGQOvXzyKQAA8ikAACgAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyJdLCJleHBvcnRzIjpbInN1YnNjcmliZSIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLEZhaWwsYW5ub3RhdGVFcnJvcixFLEZhcixpc1ByaW1pdGl2ZSxpc1VwZ3JhZGVEaXNjb25uZWN0aW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzXCIsIFtbXCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uXCIsWyRozY9fYSA9PiAoaXNVcGdyYWRlRGlzY29ubmVjdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0l0ZXJhdGlvbk9ic2VydmVyLCBMYXRlc3RUb3BpYywgTm90aWZpZXIsIE5vdGlmaWVyUmVjb3JkLCBQdWJsaWNhdGlvblJlY29yZCwgUHVibGlzaGVyLCBQdWJsaXNoS2l0LCBTdG9yZWRQdWJsaXNoS2l0LCBTdG9yZWRTdWJzY3JpcHRpb24sIFN0b3JlZFN1YnNjcmliZXIsIFN1YnNjcmliZXIsIFN1YnNjcmlwdGlvbiwgVXBkYXRlUmVjb3JkLCBFYWNoVG9waWMsIEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yfSBmcm9tICcuLi9zcmMvdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHNpbmsgPSAoKSA9PiB7fTtcblxuLyoqXG4gKiBDaGVjayB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGZvciByZWplY3Rpb24gYnkgdmF0IHVwZ3JhZGUsXG4gKiBhbmQgcmVmZXRjaCB1cG9uIGVuY291bnRlcmluZyB0aGF0IGNvbmRpdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBFUmVmPFQ+fSBnZXR0ZXJcbiAqIEBwYXJhbSB7RVJlZjxUPltdfSBbc2VlZF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fVxuICovXG5jb25zdCByZWNvbm5lY3RBc05lZWRlZCA9IGFzeW5jIChnZXR0ZXIsIHNlZWQgPSBbXSkgPT4ge1xuICBsZXQgZGlzY29ubmVjdGlvbjtcbiAgbGV0IGxhc3RWZXJzaW9uID0gLUluZmluaXR5O1xuICAvKiBFbmQgc3luY2hyb25vdXMgcHJlbHVkZS4qL1xuICBhd2FpdCBudWxsO1xuICBmb3IgKGxldCBpID0gMDsgOyBpICs9IDEpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0UCA9IGkgPCBzZWVkLmxlbmd0aCA/IHNlZWRbaV0gOiBnZXR0ZXIoKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3VsdFA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24oZXJyKSkge1xuICAgICAgICBpZiAoIWRpc2Nvbm5lY3Rpb24pIHtcbiAgICAgICAgICBkaXNjb25uZWN0aW9uID0gZXJyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgaW5jYXJuYXRpb25OdW1iZXI6IHZlcnNpb24gfSA9IGVycjtcbiAgICAgICAgaWYgKHZlcnNpb24gPiBsYXN0VmVyc2lvbikge1xuICAgICAgICAgIC8qIFdlIGRvbid0IGV4cGVjdCBhbm90aGVyIHVwZ3JhZGUgaW4gYmV0d2VlbiByZWNlaXZpbmcqL1xuICAgICAgICAgIC8qIGEgZGlzY29ubmVjdGlvbiBhbmQgcmUtcmVxdWVzdGluZyBhbiB1cGRhdGUsIGJ1dCBtdXN0Ki9cbiAgICAgICAgICAvKiBuZXZlcnRoZWxlc3MgYmUgcHJlcGFyZWQgZm9yIHRoYXQuKi9cbiAgICAgICAgICBsYXN0VmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qIGlmIGBlcnJgIGlzIGFuIChFcnJvcikgb2JqZWN0LCB3ZSBjYW4gdHJ5IHRvIGFzc29jaWF0ZSBpdCB3aXRoKi9cbiAgICAgIC8qIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaXNjb25uZWN0aW9uIHRoYXQgcHJvbXB0ZWQgdGhlIHJlcXVlc3QqL1xuICAgICAgLyogZm9yIHdoaWNoIGl0IGlzIGEgcmVzdWx0LiovXG4gICAgICBpZiAoIWlzUHJpbWl0aXZlKGVycikgJiYgZGlzY29ubmVjdGlvbiAmJiBkaXNjb25uZWN0aW9uICE9PSBlcnIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhbm5vdGF0ZUVycm9yKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgWGBBdHRlbXB0aW5nIHRvIHJlY292ZXIgZnJvbSBkaXNjb25uZWN0aW9uOiAke2Rpc2Nvbm5lY3Rpb259YCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgLyogbm9vcCovXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgbmVhciBpdGVyYWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgcG90ZW50aWFsbHkgZmFyIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGVJdGVyYXRvcjxUPj59IGl0UFxuICovXG4gICAgICAgY29uc3Qgc3Vic2NyaWJlID0gaXRQID0+XG4gIEZhcignQXN5bmNJdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBpdCA9IEUoaXRQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IHNlbGYgPSBGYXIoJ0FzeW5jSXRlcmFibGVJdGVyYXRvcicsIHtcbiAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gc2VsZixcbiAgICAgICAgbmV4dDogYXN5bmMgKCkgPT4gRShpdCkubmV4dCgpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuICB9KTtcblxuLyoqXG4gKiBBc3luY3Jvbm91c2x5IGl0ZXJhdGVzIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGEgUHVibGljYXRpb25SZWNvcmQgY2hhaW4gYXMgdGhleVxuICogYXBwZWFyLiAgVGhpcyBpdGVyYXRpb24gbXVzdCBkcm9wIHBhcnRzIG9mIHB1YmxpY2F0aW9uIHJlY29yZHMgdGhhdCBhcmUgbm9cbiAqIGxvbmdlciBuZWVkZWQgc28gdGhleSBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICogQHBhcmFtIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gbmV4dENlbGxQXG4gKiAgIFB1YmxpY2F0aW9uUmVjb3JkIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgZmlyc3QgaXRlcmF0aW9uIHJlc3VsdFxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovJGjNj19vbmNlLnN1YnNjcmliZShzdWJzY3JpYmUpO1xuY29uc3QgbWFrZUVhY2hJdGVyYXRvciA9ICh0b3BpYywgbmV4dENlbGxQKSA9PiB7XG4gIC8qIFRvIHVuZGVyc3RhbmQgdGhlIGltcGxlbWVudGF0aW9uLCBzdGFydCB3aXRoKi9cbiAgLyogaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTYwNDA0MTIyMjUwL2h0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPXN0cmF3bWFuOmNvbmN1cnJlbmN5I2luZmluaXRlX3F1ZXVlKi9cbiAgY29uc3Qgc2VsZiA9IEZhcignRWFjaEl0ZXJhdG9yJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHNlbGYsXG4gICAgbmV4dDogKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBoZWFkOiByZXN1bHRQLFxuICAgICAgICBwdWJsaXNoQ291bnQ6IHB1Ymxpc2hDb3VudFAsXG4gICAgICAgIHRhaWw6IHRhaWxQLFxuICAgICAgfSA9IEUuZ2V0KG5leHRDZWxsUCk7XG5cbiAgICAgIC8qIElmIHRhaWxQIGlzIGJyb2tlbiBieSB1cGdyYWRlLCB3ZSB3aWxsIG5lZWQgdG8gcmUtcmVxdWVzdCBpdCovXG4gICAgICAvKiBkaXJlY3RseSBmcm9tIGB0b3BpY2AuKi9cbiAgICAgIGNvbnN0IGdldFN1Y2Nlc3NvciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHVibGlzaENvdW50ID0gYXdhaXQgcHVibGlzaENvdW50UDtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsICdiaWdpbnQnKTtcbiAgICAgICAgY29uc3Qgc3VjY2Vzc29yID0gYXdhaXQgRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KTtcbiAgICAgICAgY29uc3QgbmV3UHVibGlzaENvdW50ID0gc3VjY2Vzc29yLnB1Ymxpc2hDb3VudDtcbiAgICAgICAgaWYgKG5ld1B1Ymxpc2hDb3VudCAhPT0gcHVibGlzaENvdW50ICsgMW4pIHtcbiAgICAgICAgICBGYWlsYGVhY2hJdGVyYXRvciBicm9rZW4gYnkgZ2FwIGZyb20gcHVibGlzaENvdW50ICR7cHVibGlzaENvdW50fSB0byAke25ld1B1Ymxpc2hDb3VudH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZXNzb3I7XG4gICAgICB9O1xuXG4gICAgICAvKiBSZXBsYWNlIG5leHRDZWxsUCBvbiBldmVyeSBjYWxsIHRvIG5leHQoKSBzbyB0aGluZ3Mgd29yayBldmVuKi9cbiAgICAgIC8qIHdpdGggYW4gZWFnZXIgY29uc3VtZXIgdGhhdCBkb2Vzbid0IHdhaXQgZm9yIHJlc3VsdHMgdG8gc2V0dGxlLiovXG4gICAgICBuZXh0Q2VsbFAgPSByZWNvbm5lY3RBc05lZWRlZChnZXRTdWNjZXNzb3IsIFt0YWlsUF0pO1xuXG4gICAgICAvKiBBdm9pZCB1bmhhbmRsZWQgcmVqZWN0aW9uIHdhcm5pbmdzIGhlcmUgaWYgdGhlIHByZXZpb3VzIGNlbGwgd2FzIHJlamVjdGVkIG9yKi9cbiAgICAgIC8qIHRoZXJlIGlzIG5vIGZ1cnRoZXIgcmVxdWVzdCBvZiB0aGlzIGl0ZXJhdG9yLiovXG4gICAgICAvKiBgdGFpbFBgIGlzIGhhbmRsZWQgaW5zaWRlIGByZWNvbm5lY3RBc05lZWRlZGAgYW5kIGByZXN1bHRQYCBpcyB0aGUgY2FsbGVyJ3MqL1xuICAgICAgLyogY29uY2VybiwgbGVhdmluZyBvbmx5IGBwdWJsaXNoQ291bnRQYCBhbmQgdGhlIG5ldyBgbmV4dENlbGxQYC4qL1xuICAgICAgdm9pZCBFLndoZW4ocHVibGlzaENvdW50UCwgc2luaywgc2luayk7XG4gICAgICB2b2lkIEUud2hlbihuZXh0Q2VsbFAsIHNpbmssIHNpbmspO1xuICAgICAgcmV0dXJuIHJlc3VsdFA7XG4gICAgfSxcbiAgICBmb3JrOiAoKSA9PiBtYWtlRWFjaEl0ZXJhdG9yKHRvcGljLCBuZXh0Q2VsbFApLFxuICB9KTtcbiAgcmV0dXJuIHNlbGY7XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcInByZWZpeCBsb3NzeVwiIGl0ZXJhdGlvbnMgb2YgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0LlxuICogQnkgXCJwcmVmaXggbG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBldmVyeXRoaW5nIHB1Ymxpc2hlZCBiZWZvcmVcbiAqIHlvdSBhc2sgdGhlIHJldHVybmVkIGl0ZXJhYmxlIGZvciBhbiBpdGVyYXRvci4gQnV0IHRoZSByZXR1cm5lZCBpdGVyYXRvclxuICogd2lsbCBlbnVtZXJhdGUgZWFjaCB0aGluZyBwdWJsaXNoZWQgZnJvbSB0aGF0IGl0ZXJhdG9yJ3Mgc3RhcnRpbmcgcG9pbnRcbiAqIHVwIHRvIGEgZGlzY29ubmVjdGlvbiByZXN1bHQgaW5kaWNhdGluZyB1cGdyYWRlIG9mIHRoZSBwcm9kdWNlclxuICogKHdoaWNoIGJyZWFrcyB0aGUgZ2FwLWZyZWUgZ3VhcmFudGVlIGFuZCB0aGVyZWZvcmUgdGVybWluYXRlcyBhbnkgYWN0aXZlXG4gKiBpdGVyYXRvciB3aGlsZSBzdGlsbCBzdXBwb3J0aW5nIGNyZWF0aW9uIG9mIG5ldyBpdGVyYXRvcnMpLlxuICpcbiAqIElmIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdCBpcyB0ZXJtaW5hdGVkLCB0aGF0IHRlcm1pbmFsIHZhbHVlIHdpbGwgYmVcbiAqIHJlcG9ydGVkIGxvc3NsZXNzbHkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICovXG4gICAgICAgY29uc3Qgc3Vic2NyaWJlRWFjaCA9IHRvcGljID0+IHtcbiAgY29uc3QgaXRlcmFibGUgPSBGYXIoJ0VhY2hJdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdENlbGxQID0gcmVjb25uZWN0QXNOZWVkZWQoKCkgPT4gRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIoKSk7XG4gICAgICByZXR1cm4gbWFrZUVhY2hJdGVyYXRvcih0b3BpYywgZmlyc3RDZWxsUCk7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBpdGVyYWJsZTtcbn07JGjNj19vbmNlLnN1YnNjcmliZUVhY2goc3Vic2NyaWJlRWFjaCk7XG5oYXJkZW4oc3Vic2NyaWJlRWFjaCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKiBAcGFyYW0ge2JpZ2ludH0gW2xvY2FsVXBkYXRlQ291bnRdXG4gKiBAcGFyYW0ge0l0ZXJhdG9yUmV0dXJuUmVzdWx0PFQ+fSBbdGVybWluYWxSZXN1bHRdXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVD59XG4gKi9cbmNvbnN0IGNsb25lTGF0ZXN0SXRlcmF0b3IgPSAodG9waWMsIGxvY2FsVXBkYXRlQ291bnQsIHRlcm1pbmFsUmVzdWx0KSA9PiB7XG4gIGxldCBtdXRleCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKlxuICogUmVxdWVzdCB0aGUgbmV4dCB1cGRhdGUgcmVjb3JkIGZyb20gdGhlIHRvcGljLCB1cGRhdGluZyBvdXIgbG9jYWwgc3RhdGUsXG4gKiBhbmQgY29udmVydCBpdCB0byBhbiBpdGVyYXRvciByZXN1bHQuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVD4+fVxuICovXG4gIGNvbnN0IG1heWJlUmVxdWVzdE5leHRSZXN1bHQgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHRlcm1pbmFsUmVzdWx0KSB7XG4gICAgICAvKiBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHRvcGljLCBqdXN0IGtlZXAgcmV0dXJuaW5nIHRoZSBsYXN0IHJlc3VsdCovXG4gICAgICAvKiB3aXRob3V0IGZ1cnRoZXIgcmVxdWVzdHMuKi9cbiAgICAgIHJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiAgICB9XG5cbiAgICAvKiBTZW5kIHRoZSBuZXh0IHJlcXVlc3Qgbm93LCBza2lwcGluZyBwYXN0IGludGVybWVkaWF0ZSB1cGRhdGVzKi9cbiAgICAvKiBhbmQgdXBncmFkZSBkaXNjb25uZWN0aW9ucy4qL1xuICAgIGNvbnN0IHsgdmFsdWUsIHVwZGF0ZUNvdW50IH0gPSBhd2FpdCByZWNvbm5lY3RBc05lZWRlZCgoKSA9PlxuICAgICAgRSh0b3BpYykuZ2V0VXBkYXRlU2luY2UobG9jYWxVcGRhdGVDb3VudCksXG4gICAgKTtcbiAgICAvKiBNYWtlIHN1cmUgdGhlIG5leHQgcmVxdWVzdCBpcyBmb3IgYSBmcmVzaGVyIHZhbHVlLiovXG4gICAgbG9jYWxVcGRhdGVDb3VudCA9IHVwZGF0ZUNvdW50O1xuXG4gICAgLyogTWFrZSBhbiBJdGVyYXRvclJlc3VsdC4qL1xuICAgIGlmICh1cGRhdGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZXJtaW5hbFJlc3VsdCA9IGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlIH0pO1xuICAgICAgcmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pO1xuICB9O1xuXG4gIGNvbnN0IHNlbGYgPSBGYXIoJ0xhdGVzdEl0ZXJhdG9yJywge1xuICAgIGZvcms6ICgpID0+IGNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMsIGxvY2FsVXBkYXRlQ291bnQsIHRlcm1pbmFsUmVzdWx0KSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzZWxmLFxuICAgIG5leHQ6IGFzeW5jICgpID0+IHtcbiAgICAgIC8qIEluIHRoaXMgYWRhcHRvciwgb25jZSBgbmV4dCgpYCBpcyBjYWxsZWQgYW5kIHJldHVybnMgYW4gdW5yZXNvbHZlZCovXG4gICAgICAvKiBwcm9taXNlLCBmdXJ0aGVyIGBuZXh0KClgIGNhbGxzIHdpbGwgYWxzbyByZXR1cm4gdW5yZXNvbHZlZCBwcm9taXNlcyovXG4gICAgICAvKiBidXQgZWFjaCBjYWxsIHdpbGwgbm90IHRyaWdnZXIgYW5vdGhlciBgdG9waWNgIHJlcXVlc3QgdW50aWwgdGhlIHByaW9yKi9cbiAgICAgIC8qIG9uZSBoYXMgc2V0dGxlZC4qL1xuICAgICAgLyoqL1xuICAgICAgLyogVGhpcyBsaW5lYXIgcXVldWVpbmcgYmVoYXZpb3IgaXMgb25seSBuZWVkZWQgZm9yIGNvZGUgdGhhdCB1c2VzIHRoZSovXG4gICAgICAvKiBhc3luYyBpdGVyYXRvciBwcm90b2NvbCBleHBsaWNpdGx5LiBXaGVuIHRoaXMgYXN5bmMgaXRlcmF0b3IgaXMqL1xuICAgICAgLyogY29uc3VtZWQgYnkgYSBmb3IvYXdhaXQvb2YgbG9vcCwgYG5leHQoKWAgd2lsbCBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUqL1xuICAgICAgLyogcHJvbWlzZSBmb3IgdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiByZXN1bHQgaGFzIGZ1bGZpbGxlZC4gSWYgaXQgZnVsZmlsbHMqL1xuICAgICAgLyogd2l0aCBgZG9uZTogdHJ1ZWAsIHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB3aWxsIG5ldmVyIGNhbGwgYG5leHQoKWAqL1xuICAgICAgLyogYWdhaW4uKi9cbiAgICAgIC8qKi9cbiAgICAgIC8qIFNlZSovXG4gICAgICAvKiBodHRwczovLzJhbGl0eS5jb20vMjAxNi8xMC9hc3luY2hyb25vdXMtaXRlcmF0aW9uLmh0bWwjcXVldWluZy1uZXh0KCktaW52b2NhdGlvbnMqL1xuICAgICAgLyogZm9yIGFuIGV4cGxpY2l0IHVzZSB0aGF0IHNlbmRzIGBuZXh0KClgIHdpdGhvdXQgd2FpdGluZy4qL1xuXG4gICAgICBpZiAodGVybWluYWxSZXN1bHQpIHtcbiAgICAgICAgLyogV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB0b3BpYywganVzdCBrZWVwIHJldHVybmluZyB0aGUgbGFzdCovXG4gICAgICAgIC8qIHJlc3VsdC4qL1xuICAgICAgICByZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8qIEJFR0lOIENSSVRJQ0FMIFNFQ1RJT04gLSBzeW5jaHJvbm91c2x5IGVucXVldWUgYW5kIHJlYXNzaWduIGBtdXRleGAqL1xuICAgICAgLyoqL1xuICAgICAgLyogVXNlIGBtdXRleGAgdG8gZW5zdXJlIHRoYXQgd2UgaGF2ZSBubyBtb3JlIHRoYW4gYSBzaW5nbGUgcmVxdWVzdCBpbiovXG4gICAgICAvKiBmbGlnaHQuKi9cbiAgICAgIGNvbnN0IG5leHRSZXN1bHQgPSBtdXRleC50aGVuKG1heWJlUmVxdWVzdE5leHRSZXN1bHQpO1xuICAgICAgbXV0ZXggPSBuZXh0UmVzdWx0LnRoZW4oc2luaywgc2luayk7XG4gICAgICAvKiBFTkQgQ1JJVElDQUwgU0VDVElPTiovXG5cbiAgICAgIHJldHVybiBuZXh0UmVzdWx0O1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc2VsZjtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVD59XG4gKi9cbmNvbnN0IG1ha2VMYXRlc3RJdGVyYXRvciA9IHRvcGljID0+IGNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMpO1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcImxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcImxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgYW55IHB1Ymxpc2hlZCBzdGF0ZSBpZiBhIG1vcmVcbiAqIHJlY2VudCBwdWJsaXNoZWQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkIGluc3RlYWQuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQgYnkgdXBncmFkZSBvZiB0aGUgcHJvZHVjZXIsXG4gKiBpdCB3aWxsIGJlIHJlLXJlcXVlc3RlZC4gQWxsIG90aGVyIHRlcm1pbmFsIHZhbHVlcyB3aWxsIGJlIGxvc3NsZXNzbHlcbiAqIHByb3BhZ2F0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKi9cbiAgICAgICBjb25zdCBzdWJzY3JpYmVMYXRlc3QgPSB0b3BpYyA9PiB7XG4gIGNvbnN0IGl0ZXJhYmxlID0gRmFyKCdMYXRlc3RJdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBtYWtlTGF0ZXN0SXRlcmF0b3IodG9waWMpLFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2Uuc3Vic2NyaWJlTGF0ZXN0KHN1YnNjcmliZUxhdGVzdCk7XG5oYXJkZW4oc3Vic2NyaWJlTGF0ZXN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN1YnNjcmliZSI6WyJzdWJzY3JpYmUiXSwic3Vic2NyaWJlRWFjaCI6WyJzdWJzY3JpYmVFYWNoIl0sInN1YnNjcmliZUxhdGVzdCI6WyJzdWJzY3JpYmVMYXRlc3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAV6oEkSkNAAApDQAAKQAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIi4vc3Vic2NyaWJlLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vdG9waWMuanMiXSwiZXhwb3J0cyI6WyJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsRmFyLHN1YnNjcmliZUVhY2gsbWFrZVB1Ymxpc2hLaXQsbWFrZVBpbm5lZEhpc3RvcnlUb3BpYzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUVhY2hcIixbJGjNj19hID0+IChzdWJzY3JpYmVFYWNoID0gJGjNj19hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChtYWtlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIi4vdG9waWMuanNcIiwgW1tcIm1ha2VQaW5uZWRIaXN0b3J5VG9waWNcIixbJGjNj19hID0+IChtYWtlUGlubmVkSGlzdG9yeVRvcGljID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RWFjaFRvcGljLCBJdGVyYXRpb25PYnNlcnZlciwgTGF0ZXN0VG9waWMsIE5vdGlmaWVyLCBOb3RpZmllclJlY29yZCwgU3Vic2NyaXB0aW9uUmVjb3JkLCBQdWJsaXNoZXIsIFB1Ymxpc2hLaXQsIFN0b3JlZFB1Ymxpc2hLaXQsIFN0b3JlZFN1YnNjcmlwdGlvbiwgU3RvcmVkU3Vic2NyaWJlciwgU3Vic2NyaWJlciwgU3Vic2NyaXB0aW9uLCBVcGRhdGVSZWNvcmR9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEVhY2hUb3BpYzxUPj59IHRvcGljXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uID0gdG9waWMgPT4ge1xuICBjb25zdCBzdWJzY3JpcHRpb24gPSBGYXIoJ1N1YnNjcmlwdGlvbicsIHtcbiAgICAuLi5zdWJzY3JpYmVFYWNoKHRvcGljKSxcbiAgICBzdWJzY3JpYmVBZnRlcjogYXN5bmMgcHVibGlzaENvdW50ID0+IEUodG9waWMpLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG5cbiAgICAvKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBTdWJzY3JpcHRpb24gZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIFN1YnNjcmlwdGlvbiB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlU3Vic2NyaXB0aW9uYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIFN1YnNjcmlwdGlvbiBhdCB0aGF0IHNpdGUuXG4gKi9cbiAgICBnZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczogYXN5bmMgKCkgPT4gdG9waWMsXG5cbiAgICBnZXRTdG9yZUtleTogKCkgPT4gaGFyZGVuKHsgc3Vic2NyaXB0aW9uIH0pLFxuICB9KTtcbiAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbn07JGjNj19vbmNlLm1ha2VTdWJzY3JpcHRpb24obWFrZVN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbik7XG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBQcm9kdWNlcnMgc2hvdWxkIHVzZVxuICogYGBganNcbiAqIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuICogY29uc3QgdG9waWMgPSBtYWtlUGlubmVkSGlzdG9yeVRvcGljKHN1YnNjcmliZXIpO1xuICogYGBgXG4gKiBpbnN0ZWFkLCB3aGljaCBtYWtlcyBpdCBjbGVhcmVyIHRoYXQgYWxsIHRoZSBzdWJzY3JpYmVyJ3MgaGlzdG9yeSBpc1xuICogcmV0YWluZWQsIHByZXZlbnRpbmcgR0MuICBQb3RlbnRpYWxseSByZW1vdGUgY29uc3VtZXJzIHVzZVxuICogYGBganNcbiAqIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2Ygc3Vic2NyaWJlRWFjaCh0b3BpYykpIHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIE1ha2VzIGEgYHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9YCBmb3IgZG9pbmcgbG9zc2xlc3MgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uS2l0ID0gKCkgPT4ge1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcblxuICAvKiBUaGUgcHVibGlzaCBraXQgc3Vic2NyaWJlciBpcyBwcmVmaXgtbG9zc3ksIHNvIG1ha2luZyAqdGhpcyogc3Vic2NyaWJlciBjb21wbGV0ZWx5Ki9cbiAgLyogbG9zc2xlc3MgZnJvbSBpbml0aWFsaXNhdGlvbiByZXF1aXJlcyBwaW5uaW5nIHRoZSBmb3JtZXIncyBoaXN0b3J5LiovXG5cbiAgY29uc3QgcGlubmVkSGlzdG9yeVRvcGljID0gbWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhzdWJzY3JpYmVyKTtcbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbWFrZVN1YnNjcmlwdGlvbihwaW5uZWRIaXN0b3J5VG9waWMpO1xuXG4gIC8qKiBAdHlwZSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59ICovXG4gIGNvbnN0IHB1YmxpY2F0aW9uID0gRmFyKCdwdWJsaWNhdGlvbicsIHtcbiAgICB1cGRhdGVTdGF0ZTogbm9uRmluYWxWYWx1ZSA9PiBwdWJsaXNoZXIucHVibGlzaChub25GaW5hbFZhbHVlKSxcbiAgICBmaW5pc2g6IGNvbXBsZXRpb24gPT4gcHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbiAgICBmYWlsOiByZWFzb24gPT4gcHVibGlzaGVyLmZhaWwocmVhc29uKSxcbiAgfSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfSk7XG59OyRozY9fb25jZS5tYWtlU3Vic2NyaXB0aW9uS2l0KG1ha2VTdWJzY3JpcHRpb25LaXQpO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb25LaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIl0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB35kpGlQYAAJUGAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3RvcGljLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VhY2hUb3BpYywgTGF0ZXN0VG9waWN9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBBIHBpbm5lZC1oaXN0b3J5IHRvcGljIHByZXNlcnZlcyBhbGwgb2YgaXRzIHB1Ymxpc2hlZCB2YWx1ZXMgaW5cbiAqIG1lbW9yeS4gIFVzZSBhIHByZWZpeC1sb3NzeSBtYWtlUHVibGlzaEtpdCBpbnN0ZWFkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VhY2hUb3BpYzxUPiAmIExhdGVzdFRvcGljPFQ+fSB0b3BpYyBuZWVkcyB0byBiZSBuZWFyIGluIG9yZGVyIHRvXG4gKiBwcmVzZXJ2ZSBzdWJzY3JpcHRpb24gdGltaW5ncy4gIFRPRE86IGRyb3AgYExhdGVzdFRvcGljPFQ+YCByZXF1aXJlbWVudFxuICogQHJldHVybnMge0VhY2hUb3BpYzxUPiAmIExhdGVzdFRvcGljPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVBpbm5lZEhpc3RvcnlUb3BpYyA9IHRvcGljID0+IHtcbiAgLyogU3VjaCBsb3NzbGVzc25lc3MgaW5oaWJpdHMgR0MsIHdoaWNoIGlzIHdoeSB3ZSdyZSBtb3ZpbmcgYXdheSBmcm9tIGl0LiovXG5cbiAgLyogV2UgbmVlZCB0byB0YWtlIGFuIGltbWVkaWF0ZSBzbmFwc2hvdCBvZiB0aGUgdG9waWMncyBjdXJyZW50IHN0YXRlLiovXG4gIGNvbnN0IHBpbm5lZFB1Ykxpc3QgPSB0b3BpYy5zdWJzY3JpYmVBZnRlcigpO1xuXG4gIHJldHVybiBGYXIoJ1Bpbm5lZEhpc3RvcnlUb3BpYycsIHtcbiAgICBzdWJzY3JpYmVBZnRlcjogYXN5bmMgKHB1Ymxpc2hDb3VudCA9IC0xbikgPT4ge1xuICAgICAgaWYgKHB1Ymxpc2hDb3VudCA9PT0gLTFuKSB7XG4gICAgICAgIHJldHVybiBwaW5uZWRQdWJMaXN0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRvcGljLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCk7XG4gICAgfSxcbiAgICBnZXRVcGRhdGVTaW5jZTogYXN5bmMgKHVwZGF0ZUNvdW50ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAvKiBUT0RPOiBCdWlsZCB0aGlzIG91dCBvZiBFYWNoVG9waWM8VD4uKi9cbiAgICAgIHJldHVybiB0b3BpYy5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlUGlubmVkSGlzdG9yeVRvcGljKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xuaGFyZGVuKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3HPTPWAHAABgBwAALQAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdGVzdGluZy11dGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VGYWtlTWFyc2hhbGxlciIsIm1ha2VGYWtlU3RvcmFnZSIsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzXCIsIFtdXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7SXRlcmF0aW9uT2JzZXJ2ZXI8dW5rbm93bj59IFtwdWJsaWNhdGlvbl1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VGYWtlU3RvcmFnZSA9IChwYXRoLCBwdWJsaWNhdGlvbikgPT4ge1xuICBsZXQgc2V0VmFsdWVDYWxscyA9IDA7XG4gIGNvbnN0IGZ1bGxQYXRoID0gYHB1Ymxpc2guJHtwYXRofWA7XG4gIGNvbnN0IHN0b3JlS2V5ID0gaGFyZGVuKHtcbiAgICBzdG9yZU5hbWU6ICdzd2luZ3NldCcsXG4gICAgc3RvcmVTdWJrZXk6IGBzd2luZ3NldC9kYXRhOiR7ZnVsbFBhdGh9YCxcbiAgICBkYXRhUHJlZml4Qnl0ZXM6ICcnLFxuICB9KTtcbiAgLyoqIEB0eXBlIHtTdG9yYWdlTm9kZSAmIHsgY291bnRTZXRWYWx1ZUNhbGxzOiAoKSA9PiBudW1iZXJ9fSAqL1xuICBjb25zdCBzdG9yYWdlID0gRmFyKCdTdG9yYWdlTm9kZScsIHtcbiAgICBnZXRQYXRoOiAoKSA9PiBwYXRoLFxuICAgIGdldFN0b3JlS2V5OiBhc3luYyAoKSA9PiBzdG9yZUtleSxcbiAgICBzZXRWYWx1ZTogYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgc2V0VmFsdWVDYWxscyArPSAxO1xuICAgICAgYXNzZXJ0LnR5cGVvZih2YWx1ZSwgJ3N0cmluZycpO1xuICAgICAgaWYgKHB1YmxpY2F0aW9uKSB7XG4gICAgICAgIHB1YmxpY2F0aW9uLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1ha2VDaGlsZE5vZGU6ICgpID0+IHN0b3JhZ2UsXG4gICAgY291bnRTZXRWYWx1ZUNhbGxzOiAoKSA9PiBzZXRWYWx1ZUNhbGxzLFxuICB9KTtcbiAgcmV0dXJuIHN0b3JhZ2U7XG59OyRozY9fb25jZS5tYWtlRmFrZVN0b3JhZ2UobWFrZUZha2VTdG9yYWdlKTtcbmhhcmRlbihtYWtlRmFrZVN0b3JhZ2UpO1xuXG4gICAgICAgY29uc3QgbWFrZUZha2VNYXJzaGFsbGVyID0gKCkgPT5cbiAgbWFrZU1hcnNoYWwodW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcbiAgICBtYXJzaGFsU2F2ZUVycm9yOiAoKSA9PiB7fSxcbiAgfSk7JGjNj19vbmNlLm1ha2VGYWtlTWFyc2hhbGxlcihtYWtlRmFrZU1hcnNoYWxsZXIpO1xuaGFyZGVuKG1ha2VGYWtlTWFyc2hhbGxlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjpbWyJldmVudExvb3BJdGVyYXRpb24iLCJldmVudExvb3BJdGVyYXRpb24iXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUZha2VTdG9yYWdlIjpbIm1ha2VGYWtlU3RvcmFnZSJdLCJtYWtlRmFrZU1hcnNoYWxsZXIiOlsibWFrZUZha2VNYXJzaGFsbGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEcacpNGDgAARg4AACEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLCJAZW5kby9leG8iLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiLCJtdXN0TWF0Y2giLCJwcm92aWRlTGF6eSIsInByb3ZpZGVMYXp5IixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgdHlwZWxlc3NNdXN0TWF0Y2g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAodHlwZWxlc3NNdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qc1wiLCBbXV0sW1wiQGVuZG8vZXhvXCIsIFtdXSxbXCIuL2xlZ2FjeS9sZWdhY3lNYXAuanNcIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNcIiwgW11dLFtcIi4vdHlwZXMtaW5kZXguanNcIiwgW11dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIFhYWCBAYWdvcmljL3N0b3JlIHNob3VsZCBub3QgZGVwZW5kIG9uIEBhZ29yaWMvaW50ZXJuYWwqL1xuLyogVE9ETyBtb3ZlIHRvIEVuZG8qL1xuLyoqIEB0eXBlIHtNdXN0TWF0Y2h9ICovXG4gICAgICAgY29uc3QgbXVzdE1hdGNoID0gdHlwZWxlc3NNdXN0TWF0Y2g7JGjNj19vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOltbIm1ha2VBdG9taWNQcm92aWRlciIsIm1ha2VBdG9taWNQcm92aWRlciJdLFsicHJvdmlkZUxhenkiLCJwcm92aWRlTGF6eSJdXSwiQGVuZG8vcGF0dGVybnMiOltbImlzS2V5IiwiaXNLZXkiXSxbImFzc2VydEtleSIsImFzc2VydEtleSJdLFsiYXNzZXJ0U2NhbGFyS2V5IiwiYXNzZXJ0U2NhbGFyS2V5Il0sWyJtYWtlQ29weVNldCIsIm1ha2VDb3B5U2V0Il0sWyJnZXRDb3B5U2V0S2V5cyIsImdldENvcHlTZXRLZXlzIl0sWyJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnIl0sWyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sWyJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlCYWdFbnRyaWVzIl0sWyJtYWtlQ29weU1hcCIsIm1ha2VDb3B5TWFwIl0sWyJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIl0sWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdLFsiY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIl0sWyJjb21wYXJlS2V5cyIsImNvbXBhcmVLZXlzIl0sWyJrZXlMVCIsImtleUxUIl0sWyJrZXlMVEUiLCJrZXlMVEUiXSxbImtleUVRIiwia2V5RVEiXSxbImtleUdURSIsImtleUdURSJdLFsia2V5R1QiLCJrZXlHVCJdLFsiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldENvbXBhcmUiLCJzZXRDb21wYXJlIl0sWyJzZXRVbmlvbiIsInNldFVuaW9uIl0sWyJzZXREaXNqb2ludFVuaW9uIiwic2V0RGlzam9pbnRVbmlvbiJdLFsic2V0SW50ZXJzZWN0aW9uIiwic2V0SW50ZXJzZWN0aW9uIl0sWyJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRTdWJ0cmFjdCJdLFsiYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il0sWyJNIiwiTSJdLFsiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIl0sWyJpc1BhdHRlcm4iLCJpc1BhdHRlcm4iXSxbImFzc2VydFBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIl0sWyJtYXRjaGVzIiwibWF0Y2hlcyJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il0sWyJpc0NvcHlNYXAiLCJpc0NvcHlNYXAiXV0sIkBlbmRvL2V4byI6W1siaW5pdEVtcHR5IiwiaW5pdEVtcHR5Il0sWyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIl0sWyJkZWZpbmVFeG9DbGFzc0tpdCIsImRlZmluZUV4b0NsYXNzS2l0Il0sWyJtYWtlRXhvIiwibWFrZUV4byJdXSwiLi9sZWdhY3kvbGVnYWN5TWFwLmpzIjpbWyJtYWtlTGVnYWN5TWFwIiwibWFrZUxlZ2FjeU1hcCJdXSwiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6W1sibWFrZUxlZ2FjeVdlYWtNYXAiLCJtYWtlTGVnYWN5V2Vha01hcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAA/SRi7iCwAA4gsAACwAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogVGhpcyBtb2R1bGUgYW5kIGl0cyBmcmF0ZXJuYWwgc2libGluZyBsZWdhY3lXZWFrTWFwIGV4aXN0IG9ubHkgdG8gZWFzZSBhXG4gKiB0cmFuc2l0aW9uIHRvIHRoZSBtb2Rlcm4gYHN0b3JlYCBzeXN0ZW0sIGFyZSBkZXByZWNhdGVkLCBhbmQgd2lsbCBldmVudHVhbGx5XG4gKiBkaXNhcHBlYXIuIFRoZXkgYXJlIG5lZWRlZCBmb3Igbm93IHRvIHN1cHBvcnQgc29tZSBvZiB0aGUgdXNlcyBvZiB0aGUgb2xkXG4gKiBiZWhhdmlvciB0aGF0IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBuZXcuIFRoZSBjb25zdHJhaW50IGltcG9zZWQgYnkgdGhlXG4gKiBuZXcgaXMgdGhhdCBvbmx5IHBhc3NhYmxlcyBjYW4gYmUgdXNlZCBhcyB2YWx1ZXMsIGFuZCBvbmx5IGtleXMgKHJvdWdobHksXG4gKiBzdHJ1Y3R1cmVzLCBha2EgY29tcGFyYWJsZXMpIGNhbiBiZSB1c2VkIGFzIHZhbHVlcy5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvMzU2N1xuICpcbiAqIFRPRE8gT25jZSB0aGF0IFBSIGlzIG1lcmdlZCwgbGluayB0byB0aGUgZG9jdW1lbnRzIHJhdGhlciB0aGFuIHRoZSBQUnMuXG4gKlxuICogRWFjaCBvZiB0aGVzZSBub24tY29uZm9ybWluZyB1c2VzIHNob3VsZCBiZSBtYXJrZWQgd2l0aCBhXG4gKlxuICogYGBganNcbiAqIC8vIExlZ2FjeSBiZWNhdXNlLi4uXG4gKiBgYGBcbiAqXG4gKiBjb21tZW50IGV4cGxhaW5pbmcgdGhlIHByb2JsZW0gaW5oaWJpdGluZyBjb252ZXJzaW9uIHRvIHRoZSBuZXcgc3lzdGVtLiBTb21lXG4gKiBvZiB0aGVzZSBwcm9ibGVtcyBhcyBvZiB0aGlzIHdyaXRpbmc6XG4gKlxuICogLSBBIHByb21pc2VLaXQgdXNlZCBhcyBhIHZhbHVlLCBldmVuIHRob3VnaCBhIHByb21pc2VLaXQgaXMgbm90IGEgcGFzc2FibGUuXG4gKiAgIFNvbHV0aW9ucyBhcmUgdG8gbWFrZSBpdCBhIHBhc3NhYmxlLCBvciB0byBjb252ZXJ0IHRoZSBjb250YWluZXIgYmFjayB0byBhXG4gKiAgIGNvbnZlbnRpb25hbCBKYXZhU2NyaXB0IE1hcC5cbiAqIC0gQSBtdXRhYmxlIGFycmF5IHVzZWQgYXMgYSB2YWx1ZSwgdGhhdCBpcyBzdWJzZXF1ZW50bHkgbXV0YXRlZC4gRnJlZXppbmcgdGhlXG4gKiAgIGFycmF5IHdvdWxkbid0IHdvcmsgb2YgY291cnNlIGJlY2F1c2UgaXQgd291bGQgYnJlYWsgdGhlIHN1YnNlcXVlbnRcbiAqICAgbXV0YXRpb24uIFVzaW5nIGEgZmFyIG9iamVjdCB3cmFwcGluZyBhbiBhcnJheSB3b3VsZCBsaWtlbHkgd29yayBmaW5lLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJNYXAgaWYgcG9zc2libGUsIE1hcCBvdGhlcndpc2VcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcmV0dXJucyB7TGVnYWN5TWFwPEssIFY+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUxlZ2FjeU1hcCA9ICh0YWcgPSAna2V5JykgPT4ge1xuICBjb25zdCBtID0gbmV3IE1hcCgpO1xuICBjb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3QgPSBrZXkgPT5cbiAgICAhbS5oYXMoa2V5KSB8fCBGYWlsYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIG0uaGFzKGtleSkgfHwgRmFpbGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBoYXM6IGtleSA9PiB7XG4gICAgICAvKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4gICAgICAvKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4gICAgICAvKiBpbiB0aGlzIG1hcC4qL1xuICAgICAgcmV0dXJuIG0uaGFzKGtleSk7XG4gICAgfSxcbiAgICBpbml0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG4gICAgICBtLnNldChrZXksIHZhbHVlKTtcbiAgICB9LFxuICAgIGdldDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgcmV0dXJuIG0uZ2V0KGtleSk7XG4gICAgfSxcbiAgICBzZXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIG0uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBtLmRlbGV0ZShrZXkpO1xuICAgIH0sXG4gICAga2V5czogKCkgPT4gbS5rZXlzKCksXG4gICAgdmFsdWVzOiAoKSA9PiBtLnZhbHVlcygpLFxuICAgIGVudHJpZXM6ICgpID0+IG0uZW50cmllcygpLFxuICAgIGdldFNpemU6ICgpID0+IG0uc2l6ZSxcbiAgICBjbGVhcjogKCkgPT4gbS5jbGVhcigpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VMZWdhY3lNYXAobWFrZUxlZ2FjeU1hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeU1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5TWFwIjpbIm1ha2VMZWdhY3lNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA28RCNW0HAABtBwAAMAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5V2Vha01hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIFNlZSBkb2Njb21tZW50IGluIHRoZSBjbG9zZWx5IHJlbGF0ZWQgYGxlZ2FjeU1hcC5qc2AgbW9kdWxlLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJXZWFrTWFwIGlmIHBvc3NpYmxlLCBXZWFrTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIHtXZWFrS2V5fSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lXZWFrTWFwPEssIFY+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUxlZ2FjeVdlYWtNYXAgPSAodGFnID0gJ2tleScpID0+IHtcbiAgLyoqIEB0eXBlIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSAqL1xuICBjb25zdCB3bSA9IG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdCA9IGtleSA9PlxuICAgICF3bS5oYXMoa2V5KSB8fCBGYWlsYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIHdtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiBrZXkgPT4ge1xuICAgICAgLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuICAgICAgLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuICAgICAgLyogaW4gdGhpcyBtYXAuKi9cbiAgICAgIHJldHVybiB3bS5oYXMoa2V5KTtcbiAgICB9LFxuICAgIGluaXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbiAgICAgIHdtLnNldChrZXksIHZhbHVlKTtcbiAgICB9LFxuICAgIGdldDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7Vn0gKi8gKHdtLmdldChrZXkpKTtcbiAgICB9LFxuICAgIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgd20uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICB3bS5kZWxldGUoa2V5KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VMZWdhY3lXZWFrTWFwKG1ha2VMZWdhY3lXZWFrTWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5V2Vha01hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5V2Vha01hcCI6WyJtYWtlTGVnYWN5V2Vha01hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADXoUFG6hgAAOoYAAAxAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFyLGFzc2VydFBhc3NhYmxlLGZpbHRlckl0ZXJhYmxlLG1hcEl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weU1hcCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLFskaM2PX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjNj19hKV1dLFtcIm1hcEl0ZXJhYmxlXCIsWyRozY9fYSA9PiAobWFwSXRlcmFibGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLFskaM2PX2EgPT4gKGFzc2VydFNjYWxhcktleSA9ICRozY9fYSldXSxbXCJtYWtlQ29weU1hcFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXV1dLFtcIi4vc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kc1wiLFskaM2PX2EgPT4gKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gJGjNj19hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsWyRozY9fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0tleSwgUGF0dGVybn0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7TWFwU3RvcmUsIE1hcFN0b3JlTWV0aG9kcywgU3RvcmVPcHRpb25zfSBmcm9tICcuLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtNYXA8SywgVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ11cbiAqIEByZXR1cm5zIHtNYXBTdG9yZU1ldGhvZHM8SywgVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWFwU3RvcmVNZXRob2RzID0gKFxuICBqc21hcCxcbiAgYXNzZXJ0S1ZPa1RvQWRkLFxuICBhc3NlcnRLVk9rVG9TZXQsXG4gIGFzc2VydEtleU9rVG9EZWxldGUsXG4gIHRhZyA9ICdrZXknLFxuKSA9PiB7XG4gIGNvbnN0IHsgYXNzZXJ0VXBkYXRlT25BZGQsIGFzc2VydFVwZGF0ZU9uRGVsZXRlLCBpdGVyYWJsZUtleXMgfSA9XG4gICAgbWFrZUN1cnJlbnRLZXlzS2l0KFxuICAgICAgKCkgPT4ganNtYXAua2V5cygpLFxuICAgICAgayA9PiBqc21hcC5oYXMoayksXG4gICAgICBjb21wYXJlUmFuayxcbiAgICAgIGFzc2VydEtWT2tUb0FkZCxcbiAgICAgIGFzc2VydEtleU9rVG9EZWxldGUsXG4gICAgICB0YWcsXG4gICAgKTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbiAgY29uc3Qga2V5cyA9IChrZXlQYXR0LCB2YWx1ZVBhdHQpID0+IHtcbiAgICBpZiAoa2V5UGF0dCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlUGF0dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaXRlcmFibGVLZXlzO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXIgPSBrID0+IHtcbiAgICAgIGlmIChrZXlQYXR0ICE9PSB1bmRlZmluZWQgJiYgIW1hdGNoZXMoaywga2V5UGF0dCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLyogVXNlcyB0aGUgY3VycmVudCBqc21hcCB2YWx1ZSwgc2luY2UgdGhlIGl0ZXJhdGF0b3Igc3Vydml2ZXMgYC5zZXRgKi9cbiAgICAgIGlmICh2YWx1ZVBhdHQgIT09IHVuZGVmaW5lZCAmJiAhbWF0Y2hlcyhqc21hcC5nZXQoayksIHZhbHVlUGF0dCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gZmlsdGVySXRlcmFibGUoaXRlcmFibGVLZXlzLCBmaWx0ZXIpO1xuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxWPn1cbiAqL1xuICBjb25zdCB2YWx1ZXMgPSAoa2V5UGF0dCwgdmFsdWVQYXR0KSA9PlxuICAgIG1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSwgayA9PiAvKiogQHR5cGUge1Z9ICovIChqc21hcC5nZXQoaykpKTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W0ssIFZdPn1cbiAqL1xuICBjb25zdCBlbnRyaWVzID0gKGtleVBhdHQsIHZhbHVlUGF0dCkgPT5cbiAgICBtYXBJdGVyYWJsZShrZXlzKGtleVBhdHQsIHZhbHVlUGF0dCksIGsgPT4gW1xuICAgICAgayxcbiAgICAgIC8qKiBAdHlwZSB7Vn0gKi8gKGpzbWFwLmdldChrKSksXG4gICAgXSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG4gICAgICBqc21hcCxcbiAgICAgIC8qKiBAdHlwZSB7KGs6IEssIHY6IFYpID0+IHZvaWR9ICovIChhc3NlcnRVcGRhdGVPbkFkZCksXG4gICAgICBhc3NlcnRLVk9rVG9TZXQsXG4gICAgICBhc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbiAgICAgIHRhZyxcbiAgICApLFxuICAgIGtleXMsXG4gICAgdmFsdWVzLFxuICAgIGVudHJpZXMsXG5cbiAgICBzbmFwc2hvdDogKGtleVBhdHQgPSB1bmRlZmluZWQsIHZhbHVlUGF0dCA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VDb3B5TWFwKGVudHJpZXMoa2V5UGF0dCwgdmFsdWVQYXR0KSksXG5cbiAgICBnZXRTaXplOiAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAga2V5UGF0dCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlUGF0dCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8ganNtYXAuc2l6ZVxuICAgICAgICA6IFsuLi5rZXlzKGtleVBhdHQsIHZhbHVlUGF0dCldLmxlbmd0aCxcblxuICAgIGNsZWFyOiAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoa2V5UGF0dCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlUGF0dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGpzbWFwLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQsIHZhbHVlUGF0dCkpIHtcbiAgICAgICAganNtYXAuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhZGRpbmcgYSBuZXcga2V5IChpbml0KSBhbmQgdXBkYXRpbmcgb3IgcmVmZXJlbmNpbmcgYVxuICoga2V5IChnZXQsIHNldCwgZGVsZXRlKS5cbiAqXG4gKiBgaW5pdGAgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gYEdldGAsIGBzZXRgIGFuZFxuICogYGRlbGV0ZWAgYXJlIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBUaGlzIGlzIGEgX3NjYWxhcl8gbWFwIGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVNYXBzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogQHRlbXBsYXRlIEs9YW55XG4gKiBAdGVtcGxhdGUgVj1hbnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRoZSBjb2x1bW4gbmFtZSBmb3IgdGhlIGtleVxuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge01hcFN0b3JlPEssIFY+fVxuICovJGjNj19vbmNlLm1ha2VNYXBTdG9yZU1ldGhvZHMobWFrZU1hcFN0b3JlTWV0aG9kcyk7XG4gICAgICAgY29uc3QgbWFrZVNjYWxhck1hcFN0b3JlID0gKFxuICB0YWcgPSAna2V5JyxcbiAgeyBrZXlTaGFwZSwgdmFsdWVTaGFwZSB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QganNtYXAgPSBuZXcgTWFwKCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cbiAgaWYgKHZhbHVlU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLVk9rVG9TZXQgPSAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAvKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG4gICAgaGFyZGVuKHZhbHVlKTtcblxuICAgIGFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbiAgICBpZiAodmFsdWVTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2godmFsdWUsIHZhbHVlU2hhcGUsICdtYXBTdG9yZSB2YWx1ZScpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBhc3NlcnRLVk9rVG9BZGQgPSAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgIC8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbiAgICBoYXJkZW4oa2V5KTtcblxuICAgIGFzc2VydFNjYWxhcktleShrZXkpO1xuICAgIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2goa2V5LCBrZXlTaGFwZSwgJ21hcFN0b3JlIGtleScpO1xuICAgIH1cbiAgICBhc3NlcnRLVk9rVG9TZXQoa2V5LCB2YWx1ZSk7XG4gIH07XG5cbiAgcmV0dXJuIEZhcihgc2NhbGFyIE1hcFN0b3JlIG9mICR7cSh0YWcpfWAsIHtcbiAgICAuLi5tYWtlTWFwU3RvcmVNZXRob2RzKFxuICAgICAganNtYXAsXG4gICAgICBhc3NlcnRLVk9rVG9BZGQsXG4gICAgICBhc3NlcnRLVk9rVG9TZXQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0YWcsXG4gICAgKSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlU2NhbGFyTWFwU3RvcmUobWFrZVNjYWxhck1hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyTWFwU3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcFN0b3JlTWV0aG9kcyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApkJKtRERAAAREQAAMQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXR0ZXJucyIsIi4vc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwiLi9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhcixmaWx0ZXJJdGVyYWJsZSxjb21wYXJlUmFuayxhc3NlcnRTY2FsYXJLZXksbWFrZUNvcHlTZXQsbWF0Y2hlcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyxtYWtlQ3VycmVudEtleXNLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsWyRozY9fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLFskaM2PX2EgPT4gKGFzc2VydFNjYWxhcktleSA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXV1dLFtcIi4vc2NhbGFyV2Vha1NldFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha1NldFN0b3JlTWV0aG9kc1wiLFskaM2PX2EgPT4gKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gJGjNj19hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsWyRozY9fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7S2V5LCBQYXR0ZXJufSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtTZXRTdG9yZSwgU2V0U3RvcmVNZXRob2RzLCBTdG9yZU9wdGlvbnN9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge1NldDxLPn0ganNzZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IGFzc2VydEtleU9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge1NldFN0b3JlTWV0aG9kczxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXRTdG9yZU1ldGhvZHMgPSAoXG4gIGpzc2V0LFxuICBhc3NlcnRLZXlPa1RvQWRkLFxuICBhc3NlcnRLZXlPa1RvRGVsZXRlLFxuICBrZXlOYW1lID0gJ2tleScsXG4pID0+IHtcbiAgY29uc3QgeyBhc3NlcnRVcGRhdGVPbkFkZCwgYXNzZXJ0VXBkYXRlT25EZWxldGUsIGl0ZXJhYmxlS2V5cyB9ID1cbiAgICBtYWtlQ3VycmVudEtleXNLaXQoXG4gICAgICAoKSA9PiBqc3NldC5rZXlzKCksXG4gICAgICBrID0+IGpzc2V0LmhhcyhrKSxcbiAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgYXNzZXJ0S2V5T2tUb0FkZCxcbiAgICAgIGFzc2VydEtleU9rVG9EZWxldGUsXG4gICAgICBrZXlOYW1lLFxuICAgICk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPEs+fVxuICovXG4gIGNvbnN0IGtleXMgPSBrZXlQYXR0ID0+XG4gICAga2V5UGF0dCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IGl0ZXJhYmxlS2V5c1xuICAgICAgOiBmaWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsIGsgPT4gbWF0Y2hlcyhrLCBrZXlQYXR0KSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgLi4ubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMoXG4gICAgICBqc3NldCxcbiAgICAgIGFzc2VydFVwZGF0ZU9uQWRkLFxuICAgICAgYXNzZXJ0VXBkYXRlT25EZWxldGUsXG4gICAgICBrZXlOYW1lLFxuICAgICksXG5cbiAgICBrZXlzLFxuXG4gICAgdmFsdWVzOiBrZXlzLFxuXG4gICAgc25hcHNob3Q6IChrZXlQYXR0ID0gdW5kZWZpbmVkKSA9PiBtYWtlQ29weVNldChrZXlzKGtleVBhdHQpKSxcblxuICAgIGdldFNpemU6IChrZXlQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAga2V5UGF0dCA9PT0gdW5kZWZpbmVkID8ganNzZXQuc2l6ZSA6IFsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbiAgICBjbGVhcjogKGtleVBhdHQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChrZXlQYXR0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAganNzZXQuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpIHtcbiAgICAgICAganNzZXQuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhZGRpbmcgYSBuZXcga2V5IChpbml0KSBhbmQgdXBkYXRpbmcgb3IgcmVmZXJlbmNpbmcgYVxuICoga2V5IChnZXQsIHNldCwgZGVsZXRlKS5cbiAqXG4gKiBgaW5pdGAgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gYEdldGAsIGBzZXRgIGFuZFxuICogYGRlbGV0ZWAgYXJlIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBUaGlzIGlzIGEgX3NjYWxhcl8gc2V0IGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVTZXRzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8Sz59XG4gKi8kaM2PX29uY2UubWFrZVNldFN0b3JlTWV0aG9kcyhtYWtlU2V0U3RvcmVNZXRob2RzKTtcbiAgICAgICBjb25zdCBtYWtlU2NhbGFyU2V0U3RvcmUgPSAodGFnID0gJ2tleScsIHsga2V5U2hhcGUgfSA9IHt9KSA9PiB7XG4gIGNvbnN0IGpzc2V0ID0gbmV3IFNldCgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S2V5T2tUb0FkZCA9IGtleSA9PiB7XG4gICAgLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuICAgIGhhcmRlbihrZXkpO1xuXG4gICAgYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG4gICAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChrZXksIGtleVNoYXBlLCAnc2V0U3RvcmUga2V5Jyk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBTZXRTdG9yZSBvZiAke3EodGFnKX1gLCB7XG4gICAgLi4ubWFrZVNldFN0b3JlTWV0aG9kcyhqc3NldCwgYXNzZXJ0S2V5T2tUb0FkZCwgdW5kZWZpbmVkLCB0YWcpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJTZXRTdG9yZShtYWtlU2NhbGFyU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD5NfOn7RYAAO0WAAA1AAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLEZhcixhc3NlcnRQYXNzYWJsZSxwYXNzU3R5bGVPZixnZXRDb3B5TWFwRW50cmllcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlNYXA7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5TWFwRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyaWVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXSxbXCJpc0NvcHlNYXBcIixbJGjNj19hID0+IChpc0NvcHlNYXAgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7S2V5fSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZSwgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge1dlYWtNYXBTdG9yZSwgU3RvcmVPcHRpb25zfSBmcm9tICcuLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge1dlYWtNYXBTdG9yZTxLLCBWPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gKFxuICBqc21hcCxcbiAgYXNzZXJ0S1ZPa1RvQWRkLFxuICBhc3NlcnRLVk9rVG9TZXQsXG4gIGFzc2VydEtleU9rVG9EZWxldGUgPSB1bmRlZmluZWQsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBjb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3QgPSBrZXkgPT5cbiAgICAhanNtYXAuaGFzKGtleSkgfHwgRmFpbGAke3Eoa2V5TmFtZSl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcblxuICBjb25zdCBhc3NlcnRLZXlFeGlzdHMgPSBrZXkgPT5cbiAgICBqc21hcC5oYXMoa2V5KSB8fCBGYWlsYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGhhczoga2V5ID0+IHtcbiAgICAgIC8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbiAgICAgIC8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbiAgICAgIC8qIGluIHRoaXMgbWFwLiovXG4gICAgICByZXR1cm4ganNtYXAuaGFzKGtleSk7XG4gICAgfSxcbiAgICBnZXQ6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIC8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbiAgICAgIHJldHVybiAvKiogQHR5cGUge1Z9ICovIChqc21hcC5nZXQoa2V5KSk7XG4gICAgfSxcblxuICAgIGluaXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbiAgICAgIGFzc2VydEtWT2tUb0FkZChrZXksIHZhbHVlKTtcbiAgICAgIGpzbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICB9LFxuICAgIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgYXNzZXJ0S1ZPa1RvU2V0KGtleSwgdmFsdWUpO1xuICAgICAganNtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBpZiAoYXNzZXJ0S2V5T2tUb0RlbGV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIGpzbWFwLmRlbGV0ZShrZXkpO1xuICAgIH0sXG5cbiAgICBhZGRBbGw6IGVudHJpZXMgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBlbnRyaWVzW1N5bWJvbC5pdGVyYXRvcl0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbihlbnRyaWVzKSAmJiBpc0NvcHlNYXAoZW50cmllcykpIHtcbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCovXG4gICAgICAgICAgZW50cmllcyA9IGdldENvcHlNYXBFbnRyaWVzKGVudHJpZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIEZhaWxgcHJvdmlkZWQgZGF0YSBzb3VyY2UgaXMgbm90IGl0ZXJhYmxlOiAke2VudHJpZXN9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgLyoqIEB0eXBlIHtJdGVyYWJsZTxbSywgVl0+fSAqLyAoZW50cmllcykpIHtcbiAgICAgICAgLyogRG9uJ3QgYXNzZXJ0IHRoYXQgdGhlIGtleSBlaXRoZXIgZG9lcyBvciBkb2VzIG5vdCBleGlzdC4qL1xuICAgICAgICBhc3NlcnRLVk9rVG9BZGQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIGpzbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogVGhpcyBpcyBhIF9zY2FsYXJfIG1hcFN0b3JlIGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlczpcbiAqIHByaW1pdGl2ZXMgb3IgcmVtb3RhYmxlcy4gT3RoZXIgbWFwU3RvcmVzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSxcbiAqIGNvcHlBcnJheXMgYW5kIGNvcHlSZWNvcmRzIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZlxuICogdGhlaXIgY29udGVudHMuXG4gKlxuICogVE9ETyBGb3Igbm93LCB0aGlzIHNjYWxhcldlYWtNYXAgYWNjZXB0cyBvbmx5IHJlbW90YWJsZXMsIHJlZmxlY3RpbmcgdGhlXG4gKiBjb25zdHJhaW50cyBvZiB0aGUgdW5kZXJseWluZyBKYXZhU2NyaXB0IFdlYWtNYXAgaXQgdXNlcyBpbnRlcm5hbGx5LiBCdXQgaXRcbiAqIHNob3VsZCBhY2NlcHQgdGhlIHByaW1pdGl2ZXMgYXMgd2VsbCwgc3RvcmluZyB0aGVtIGluIGEgc2VwYXJhdGUgaW50ZXJuYWxcbiAqIG1hcC4gV2hhdCBtYWtlcyBpdCBcIndlYWtcIiBpcyB0aGF0IGl0IHByb3ZpZGVzIG5vIEFQSSBmb3IgZW51bWVyYXRpbmcgd2hhdCdzXG4gKiB0aGVyZS4gVGhvdWdoIG5vdGUgdGhhdCB0aGlzIHdvdWxkIG9ubHkgZW5hYmxlcyBjb2xsZWN0aW9uIG9mIHRoZSByZW1vdGFibGVzLFxuICogc2luY2UgdGhlIG90aGVyIHByaW1pdGl2ZXMgbWF5IGFsd2F5cyByZWFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1JlbW90YWJsZU9iamVjdCAmIFdlYWtNYXBTdG9yZTxLLCBWPn1cbiAqLyRozY9fb25jZS5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyk7XG4gICAgICAgY29uc3QgbWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9IChcbiAgdGFnID0gJ2tleScsXG4gIHsgbG9uZ0xpdmVkID0gdHJ1ZSwga2V5U2hhcGUgPSB1bmRlZmluZWQsIHZhbHVlU2hhcGUgPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIC8qKiBAdHlwZSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPn0gKi9cbiAgY29uc3QganNtYXAgPSBsb25nTGl2ZWQgPyBuZXcgV2Vha01hcCgpIDogbmV3IE1hcCgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG4gIGlmICh2YWx1ZVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S1ZPa1RvU2V0ID0gKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuICAgIGhhcmRlbih2YWx1ZSk7XG5cbiAgICBhc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKHZhbHVlLCB2YWx1ZVNoYXBlLCAnd2Vha01hcFN0b3JlIHZhbHVlJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFzc2VydEtWT2tUb0FkZCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuICAgIGhhcmRlbihrZXkpO1xuICAgIHBhc3NTdHlsZU9mKGtleSkgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgICBGYWlsYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha01hcFN0b3JlczogJHtrZXl9YDtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICd3ZWFrTWFwU3RvcmUga2V5Jyk7XG4gICAgfVxuICAgIGFzc2VydEtWT2tUb1NldChrZXksIHZhbHVlKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKGBzY2FsYXIgV2Vha01hcFN0b3JlIG9mICR7cSh0YWcpfWAsIHtcbiAgICAuLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzbWFwLFxuICAgICAgYXNzZXJ0S1ZPa1RvQWRkLFxuICAgICAgYXNzZXJ0S1ZPa1RvU2V0LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGFnLFxuICAgICksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhcldlYWtNYXBTdG9yZShtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACUWqUbThEAAE4RAAA1AAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLEZhcixwYXNzU3R5bGVPZixnZXRDb3B5U2V0S2V5cyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlTZXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiZ2V0Q29weVNldEtleXNcIixbJGjNj19hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV0sW1wiaXNDb3B5U2V0XCIsWyRozY9fYSA9PiAoaXNDb3B5U2V0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0tleX0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7U3RvcmVPcHRpb25zLCBXZWFrU2V0U3RvcmUsIFdlYWtTZXRTdG9yZU1ldGhvZHN9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7V2Vha1NldDxLICYgb2JqZWN0Pn0ganNzZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IGFzc2VydEtleU9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge1dlYWtTZXRTdG9yZU1ldGhvZHM8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyA9IChcbiAganNzZXQsXG4gIGFzc2VydEtleU9rVG9BZGQsXG4gIGFzc2VydEtleU9rVG9EZWxldGUgPSB1bmRlZmluZWQsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBjb25zdCBhc3NlcnRLZXlFeGlzdHMgPSBrZXkgPT5cbiAgICBqc3NldC5oYXMoa2V5KSB8fCBGYWlsYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGhhczoga2V5ID0+IHtcbiAgICAgIC8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbiAgICAgIC8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbiAgICAgIC8qIGluIHRoaXMgc2V0LiovXG4gICAgICByZXR1cm4ganNzZXQuaGFzKGtleSk7XG4gICAgfSxcblxuICAgIGFkZDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleU9rVG9BZGQoa2V5KTtcbiAgICAgIGpzc2V0LmFkZChrZXkpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBpZiAoYXNzZXJ0S2V5T2tUb0RlbGV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIGpzc2V0LmRlbGV0ZShrZXkpO1xuICAgIH0sXG5cbiAgICBhZGRBbGw6IGtleXMgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBrZXlzW1N5bWJvbC5pdGVyYXRvcl0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbihrZXlzKSAmJiBpc0NvcHlTZXQoa2V5cykpIHtcbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCovXG4gICAgICAgICAga2V5cyA9IGdldENvcHlTZXRLZXlzKGtleXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIEZhaWxgcHJvdmlkZWQgZGF0YSBzb3VyY2UgaXMgbm90IGl0ZXJhYmxlOiAke2tleXN9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgLyoqIEB0eXBlIHtJdGVyYWJsZTxLPn0gKi8gKGtleXMpKSB7XG4gICAgICAgIGFzc2VydEtleU9rVG9BZGQoa2V5KTtcbiAgICAgICAganNzZXQuYWRkKGtleSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFRoaXMgaXMgYSBfc2NhbGFyXyBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha1NldCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha1NldCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dCBpdFxuICogc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogc2V0LiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlIHJlbW90YWJsZXMsXG4gKiBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIGFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtXZWFrU2V0U3RvcmU8Sz59XG4gKi8kaM2PX29uY2UubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMpO1xuICAgICAgIGNvbnN0IG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUgPSAoXG4gIHRhZyA9ICdrZXknLFxuICB7IGxvbmdMaXZlZCA9IHRydWUsIGtleVNoYXBlID0gdW5kZWZpbmVkIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCBqc3NldCA9IG5ldyAobG9uZ0xpdmVkID8gV2Vha1NldCA6IFNldCkoKTtcbiAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiAgfVxuXG4gIGNvbnN0IGFzc2VydEtleU9rVG9BZGQgPSBrZXkgPT4ge1xuICAgIC8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbiAgICBoYXJkZW4oa2V5KTtcbiAgICBwYXNzU3R5bGVPZihrZXkpID09PSAncmVtb3RhYmxlJyB8fFxuICAgICAgRmFpbGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtTdG9yZXM6ICR7a2V5fWA7XG4gICAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChrZXksIGtleVNoYXBlLCAnd2Vha1NldFN0b3JlIGtleScpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gRmFyKGBzY2FsYXIgV2Vha1NldFN0b3JlIG9mICR7cSh0YWcpfWAsIHtcbiAgICAuLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhqc3NldCwgYXNzZXJ0S2V5T2tUb0FkZCwgdW5kZWZpbmVkLCB0YWcpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUobWFrZVNjYWxhcldlYWtTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyI6WyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqlfvLtsaAADbGgAALgAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiYXBwZW5kVG9TdG9yZWRBcnJheSIsImlzQ29weU1hcCIsImlzQ29weVNldCIsIm1ha2VBdG9taWNQcm92aWRlciIsIm1ha2VDdXJyZW50S2V5c0tpdCIsInByb3ZpZGVMYXp5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEZhcixpc0NvcHlNYXAsaXNDb3B5U2V0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJpc0NvcHlNYXBcIixbJGjNj19hID0+IChpc0NvcHlNYXAgPSAkaM2PX2EpLCRozY9fbGl2ZVtcImlzQ29weU1hcFwiXV1dLFtcImlzQ29weVNldFwiLFskaM2PX2EgPT4gKGlzQ29weVNldCA9ICRozY9fYSksJGjNj19saXZlW1wiaXNDb3B5U2V0XCJdXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHR5cGVkZWYge29iamVjdH0gQ3VycmVudEtleXNLaXRcbiAqIEBwcm9wZXJ0eSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkFkZFxuICogQHByb3BlcnR5IHsoazogSykgPT4gdm9pZH0gYXNzZXJ0VXBkYXRlT25EZWxldGVcbiAqIEBwcm9wZXJ0eSB7SXRlcmFibGU8Sz59IGl0ZXJhYmxlS2V5c1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmFibGU8Sz59IGdldFJhd0tleXNcbiAqIEBwYXJhbSB7KGs6IEspID0+IGJvb2xlYW59IGNoZWNrSGFzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0geyhrOiBLLCB2PzogVikgPT4gdm9pZH0gYXNzZXJ0T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydE9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7Q3VycmVudEtleXNLaXQ8SywgVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ3VycmVudEtleXNLaXQgPSAoXG4gIGdldFJhd0tleXMsXG4gIGNoZWNrSGFzLFxuICBjb21wYXJlLFxuICBhc3NlcnRPa1RvQWRkLFxuICBhc3NlcnRPa1RvRGVsZXRlLFxuICBrZXlOYW1lID0gJ2tleScsXG4pID0+IHtcbiAgbGV0IHVwZGF0ZUNvdW50ID0gMDtcbiAgLyoqIEB0eXBlIHtBcnJheTxLPiB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IHNvcnRlZEtleXNNZW1vO1xuXG4gIGNvbnN0IGFzc2VydFVwZGF0ZU9uQWRkID0gKGssIHYgPSB1bmRlZmluZWQpID0+IHtcbiAgICBhc3NlcnRPa1RvQWRkKGssIHYpO1xuICAgIHVwZGF0ZUNvdW50ICs9IDE7XG4gICAgc29ydGVkS2V5c01lbW8gPSB1bmRlZmluZWQ7XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0VXBkYXRlT25EZWxldGUgPSBrID0+IGFzc2VydE9rVG9EZWxldGUgJiYgYXNzZXJ0T2tUb0RlbGV0ZShrKTtcblxuICBjb25zdCBnZXRTb3J0ZWRLZXlzID0gKCkgPT4ge1xuICAgIGlmIChzb3J0ZWRLZXlzTWVtbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzb3J0ZWRLZXlzTWVtbyA9IGhhcmRlbihbLi4uZ2V0UmF3S2V5cygpXS5zb3J0KGNvbXBhcmUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvcnRlZEtleXNNZW1vO1xuICB9O1xuXG4gIGNvbnN0IGl0ZXJhYmxlS2V5cyA9IEZhcignSXRlcmFibGUgb2Yga2V5cycsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgZ2VuZXJhdGlvbiA9IHVwZGF0ZUNvdW50O1xuICAgICAgZ2V0U29ydGVkS2V5cygpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBUUyBkb2Vzbid0IHRyYWNrIHRoYXQgc29ydGVkS2V5c01lbW8gaXMgZGVmaW5lZCovXG4gICAgICBjb25zdCBsZW4gPSBzb3J0ZWRLZXlzTWVtby5sZW5ndGg7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICByZXR1cm4gRmFyKCdJdGVyYXRvciBvZiBrZXlzJywge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgZ2VuZXJhdGlvbiA9PT0gdXBkYXRlQ291bnQgfHwgRmFpbGBTdG9yZSAke3Eoa2V5TmFtZSl9IGN1cnNvciBzdGFsZWA7XG4gICAgICAgICAgLyogSWYgdGhleSdyZSBlcXVhbCwgdGhlbiB0aGUgc29ydGVkS2V5TWVtbyBpcyB0aGUgc2FtZSBvbmUqL1xuICAgICAgICAgIC8qIHdlIHN0YXJ0ZWQgd2l0aC4qL1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgVFMgZG9lc24ndCB0cmFjayB0aGF0IHNvcnRlZEtleXNNZW1vIGlzIGRlZmluZWQqL1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNvcnRlZEtleXNNZW1vW2ldO1xuICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgIGlmIChjaGVja0hhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKC8qKiBAdHlwZSB7Y29uc3R9ICovICh7IGRvbmU6IGZhbHNlLCB2YWx1ZSB9KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtjb25zdH0gKi8gKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBhc3NlcnRVcGRhdGVPbkFkZCxcbiAgICBhc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbiAgICBpdGVyYWJsZUtleXMsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUN1cnJlbnRLZXlzS2l0KG1ha2VDdXJyZW50S2V5c0tpdCk7XG5oYXJkZW4obWFrZUN1cnJlbnRLZXlzS2l0KTtcblxuLyoqXG4gKiBDYWxsIGBwcm92aWRlTGF6eWAgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LiBJZiB0aGVyZVxuICogYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsIGNhbGwgYG1ha2VWYWx1ZShrZXkpYCwgcmVtZW1iZXIgaXQgYXNcbiAqIHRoZSB2YWx1ZSBmb3IgdGhhdCBrZXksIGFuZCByZXR1cm4gaXQuXG4gKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssIFY+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuICAgICAgIGNvbnN0IHByb3ZpZGVMYXp5ID0gKG1hcFN0b3JlLCBrZXksIG1ha2VWYWx1ZSkgPT4ge1xuICBpZiAoIW1hcFN0b3JlLmhhcyhrZXkpKSB7XG4gICAgbWFwU3RvcmUuaW5pdChrZXksIG1ha2VWYWx1ZShrZXkpKTtcbiAgfVxuICByZXR1cm4gbWFwU3RvcmUuZ2V0KGtleSk7XG59OyRozY9fb25jZS5wcm92aWRlTGF6eShwcm92aWRlTGF6eSk7XG5oYXJkZW4ocHJvdmlkZUxhenkpO1xuXG4vKipcbiAqIEhlbHBlciBmb3IgdXNlIGNhc2VzIGluIHdoaWNoIHRoZSBtYWtlciBmdW5jdGlvbiBpcyBhc3luYy4gRm9yIHR3b1xuICogcHJvdmlkZUxhenkgY2FsbHMgd2l0aCB0aGUgc2FtZSBrZXksIG9uZSBtYXkgYmUgbWFraW5nIHdoZW4gdGhlIG90aGVyIGNhbGxcbiAqIHN0YXJ0cyBhbmQgaXQgd291bGQgbWFrZSBhZ2Fpbi4gKFRoZW4gdGhlcmUnZCBiZSBhIGNvbGxpc2lvbiB3aGVuIHRoZSBzZWNvbmRcbiAqIHRyaWVzIHRvIHN0b3JlIHRoZSBrZXkuKSBUaGlzIHByZXZlbnRzIHRoYXQgcmFjZSBjb25kaXRpb24gYnkgaW1tZWRpYXRlbHlcbiAqIHN0b3JpbmcgYSBQcm9taXNlIGZvciB0aGUgbWFrZXIgaW4gYW4gZXBoZW1lcmFsIHN0b3JlLlxuICpcbiAqIFdoZW4gdGhlIGBzdG9yZWAgYXJndW1lbnQgaXMgZHVyYWJsZSBzdG9yYWdlLCBub3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3JcbiAqIHRlcm1pbmF0aW9uIHRvIGhhcHBlbiBhZnRlciB0aGUgbWFrZSBjb21wbGV0ZXMgYW5kIGJlZm9yZSBpdCByZWFjaGVzIGR1cmFibGVcbiAqIHN0b3JhZ2UuXG4gKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssIFY+fSBzdG9yZVxuICovXG4gICAgICAgY29uc3QgbWFrZUF0b21pY1Byb3ZpZGVyID0gc3RvcmUgPT4ge1xuICAvKiogQHR5cGUge01hcDxLLCBQcm9taXNlPFY+Pn0gKi9cbiAgY29uc3QgcGVuZGluZyA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAqIENhbGwgYHByb3ZpZGVBc3luY2AgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LCB3aGVuXG4gKiB0aGUgbWFrZXIgaXMgYXN5bmNocm9ub3VzLiBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSxcbiAqIGNhbGwgYG1ha2VWYWx1ZShrZXkpYCwgcmVtZW1iZXIgaXQgYXMgdGhlIHZhbHVlIGZvciB0aGF0IGtleSwgYW5kIHJldHVyblxuICogaXQuXG4gKlxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gUHJvbWlzZTxWPn0gbWFrZVZhbHVlIG1ha2UgdGhlIHZhbHVlIGZvciB0aGUgc3RvcmUgaWZcbiAqICAgaXQgaGFzbid0IGJlZW4gbWFkZSB5ZXQgb3IgdGhlIGxhc3QgbWFrZSBmYWlsZWRcbiAqIEBwYXJhbSB7KGtleTogSywgdmFsdWU6IFYpID0+IFByb21pc2U8dm9pZD59IFtmaW5pc2hWYWx1ZV0gcnVucyBleGFjdGx5XG4gKiAgIG9uY2UgYWZ0ZXIgYSBuZXcgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIHN0b3JlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxWPn1cbiAqL1xuICBjb25zdCBwcm92aWRlQXN5bmMgPSAoa2V5LCBtYWtlVmFsdWUsIGZpbmlzaFZhbHVlKSA9PiB7XG4gICAgaWYgKHN0b3JlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0b3JlLmdldChrZXkpKTtcbiAgICB9XG4gICAgaWYgKCFwZW5kaW5nLmhhcyhrZXkpKSB7XG4gICAgICBjb25zdCB2YWxQID0gbWFrZVZhbHVlKGtleSlcbiAgICAgICAgLnRoZW4odiA9PiB7XG4gICAgICAgICAgc3RvcmUuaW5pdChrZXksIHYpO1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9KVxuICAgICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgICBpZiAoZmluaXNoVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5pc2hWYWx1ZShrZXksIHYpLnRoZW4oKCkgPT4gdik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgcGVuZGluZy5kZWxldGUoa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICBwZW5kaW5nLnNldChrZXksIHZhbFApO1xuICAgIH1cbiAgICBjb25zdCB2YWxQID0gcGVuZGluZy5nZXQoa2V5KTtcbiAgICBhc3NlcnQodmFsUCk7XG4gICAgcmV0dXJuIHZhbFA7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IHByb3ZpZGVBc3luYyB9KTtcbn07JGjNj19vbmNlLm1ha2VBdG9taWNQcm92aWRlcihtYWtlQXRvbWljUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VBdG9taWNQcm92aWRlcik7XG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgbWFrZUF0b21pY1Byb3ZpZGVyPEssIFY+Pn0gQXRvbWljUHJvdmlkZXI8SywgVj5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge01hcFN0b3JlPEssIFZbXT59IG1hcFN0b3JlXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHtWfSBpdGVtXG4gKi9cbiAgICAgICBjb25zdCBhcHBlbmRUb1N0b3JlZEFycmF5ID0gKG1hcFN0b3JlLCBrZXksIGl0ZW0pID0+IHtcbiAgaWYgKG1hcFN0b3JlLmhhcyhrZXkpKSB7XG4gICAgY29uc3QgZXh0YW50ID0gbWFwU3RvcmUuZ2V0KGtleSk7XG4gICAgbWFwU3RvcmUuc2V0KGtleSwgaGFyZGVuKFsuLi5leHRhbnQsIGl0ZW1dKSk7XG4gIH0gZWxzZSB7XG4gICAgbWFwU3RvcmUuaW5pdChrZXksIGhhcmRlbihbaXRlbV0pKTtcbiAgfVxufTskaM2PX29uY2UuYXBwZW5kVG9TdG9yZWRBcnJheShhcHBlbmRUb1N0b3JlZEFycmF5KTtcbmhhcmRlbihhcHBlbmRUb1N0b3JlZEFycmF5KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7ImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiLGZhbHNlXSwiaXNDb3B5U2V0IjpbImlzQ29weVNldCIsZmFsc2VdfSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VDdXJyZW50S2V5c0tpdCI6WyJtYWtlQ3VycmVudEtleXNLaXQiXSwicHJvdmlkZUxhenkiOlsicHJvdmlkZUxhenkiXSwibWFrZUF0b21pY1Byb3ZpZGVyIjpbIm1ha2VBdG9taWNQcm92aWRlciJdLCJhcHBlbmRUb1N0b3JlZEFycmF5IjpbImFwcGVuZFRvU3RvcmVkQXJyYXkiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADt9ZibMAIAADACAAAcAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy90aW1lTWF0aC5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL3RpbWVNYXRoLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL3RpbWVNYXRoLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC0M22UCiUAAAolAAAjAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdGltZU1hdGguanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIlRpbWVNYXRoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTmF0LEZhaWwscSxtdXN0TWF0Y2gsUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsVGltZXN0YW1wUmVjb3JkU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV0sW1wiVGltZXN0YW1wUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChUaW1lc3RhbXBSZWNvcmRTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UmVsYXRpdmVUaW1lLCBSZWxhdGl2ZVRpbWVWYWx1ZSwgVGltZXJCcmFuZCwgVGltZU1hdGhUeXBlLCBUaW1lc3RhbXAsIFRpbWVzdGFtcFJlY29yZCwgVGltZXN0YW1wVmFsdWV9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7UmFua0NvbXBhcmlzb259IGZyb20gJ0BlbmRvL21hcnNoYWwnO1xuICovXG5cbi8qKlxuICogYGFncmVlZFRpbWVyQnJhbmRgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH0gbGVmdEJyYW5kXG4gKiBAcGFyYW0ge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9IHJpZ2h0QnJhbmRcbiAqIEByZXR1cm5zIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBhZ3JlZWRUaW1lckJyYW5kID0gKGxlZnRCcmFuZCwgcmlnaHRCcmFuZCkgPT4ge1xuICBpZiAobGVmdEJyYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocmlnaHRCcmFuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmlnaHRCcmFuZDtcbiAgICB9XG4gIH0gZWxzZSBpZiAocmlnaHRCcmFuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGxlZnRCcmFuZDtcbiAgfSBlbHNlIHtcbiAgICBsZWZ0QnJhbmQgPT09IHJpZ2h0QnJhbmQgfHxcbiAgICAgIEZhaWxgVGltZXJCcmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnRCcmFuZCl9IHZzICR7cShyaWdodEJyYW5kKX1gO1xuICAgIHJldHVybiBsZWZ0QnJhbmQ7XG4gIH1cbn07XG5cbi8qKlxuICogYHNoYXJlZFRpbWVyQnJhbmRgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgaW1wbGVtZW50cyB0aGVcbiAqIHRyYW5zaXRpb25hbCBicmFuZCBjaGVja2luZyBhbmQgY29udGFpZ2lvbiBsb2dpYyBleHBsYWluZWQgaW4gdGhlIGBUaW1lTWF0aGBcbiAqIGNvbW1lbnQuIEl0IGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBiaW5hcnkgb3BlcmF0b3JzIHRoYXQgc2hvdWxkIGZvbGxvd1xuICogdGhpcyBsb2dpYy4gSXQgZG9lcyB0aGUgZXJyb3IgY2hlY2tpbmcgYmV0d2VlbiB0aGUgb3BlcmFuZHMsIGFuZCByZXR1cm5zXG4gKiB0aGUgYnJhbmQsIGlmIGFueSwgdGhhdCBzaG91bGQgbGFiZWwgdGhlIHJlc3VsdGluZyB0aW1lIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSBsZWZ0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gcmlnaHRcbiAqIEByZXR1cm5zIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBzaGFyZWRUaW1lckJyYW5kID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGNvbnN0IGxlZnRCcmFuZCA9IHR5cGVvZiBsZWZ0ID09PSAnYmlnaW50JyA/IHVuZGVmaW5lZCA6IGxlZnQudGltZXJCcmFuZDtcbiAgY29uc3QgcmlnaHRCcmFuZCA9IHR5cGVvZiByaWdodCA9PT0gJ2JpZ2ludCcgPyB1bmRlZmluZWQgOiByaWdodC50aW1lckJyYW5kO1xuICByZXR1cm4gYWdyZWVkVGltZXJCcmFuZChsZWZ0QnJhbmQsIHJpZ2h0QnJhbmQpO1xufTtcblxuLyoqXG4gKiBgYWJzTGlrZWAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5XG4gKiBvcGVyYXRvcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIGEgYFRpbWVzdGFtcGBcbiAqIHJhdGhlciB0aGFuIGEgYFJlbGF0aXZlVGltZWAuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtUaW1lc3RhbXBWYWx1ZX0gYWJzVmFsdWVcbiAqIEByZXR1cm5zIHtUaW1lc3RhbXB9XG4gKi9cbmNvbnN0IGFic0xpa2UgPSAobGVmdCwgcmlnaHQsIGFic1ZhbHVlKSA9PiB7XG4gIE5hdChhYnNWYWx1ZSk7XG4gIGNvbnN0IHRpbWVyQnJhbmQgPSBzaGFyZWRUaW1lckJyYW5kKGxlZnQsIHJpZ2h0KTtcbiAgaWYgKHRpbWVyQnJhbmQpIHtcbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIHRpbWVyQnJhbmQsXG4gICAgICBhYnNWYWx1ZSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYWJzVmFsdWU7XG4gIH1cbn07XG5cbi8qKlxuICogYHJlbExpa2VgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeVxuICogb3BlcmF0b3JzIGluIHRoZSBjYXNlIHdoZXJlIHRoZSByZXR1cm5lZCB0aW1lIHNob3VsZCBiZSBhIGBSZWxhdGl2ZVRpbWVgXG4gKiByYXRoZXIgdGhhbiBhIGBUaW1lc3RhbXBgLlxuICpcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSBsZWZ0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gcmlnaHRcbiAqIEBwYXJhbSB7UmVsYXRpdmVUaW1lVmFsdWV9IHJlbFZhbHVlXG4gKiBAcmV0dXJucyB7UmVsYXRpdmVUaW1lfVxuICovXG5jb25zdCByZWxMaWtlID0gKGxlZnQsIHJpZ2h0LCByZWxWYWx1ZSkgPT4ge1xuICBOYXQocmVsVmFsdWUpO1xuICBjb25zdCB0aW1lckJyYW5kID0gc2hhcmVkVGltZXJCcmFuZChsZWZ0LCByaWdodCk7XG4gIGlmICh0aW1lckJyYW5kKSB7XG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICB0aW1lckJyYW5kLFxuICAgICAgcmVsVmFsdWUsXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlbFZhbHVlO1xuICB9XG59O1xuXG4vKiBGb3IgYWxsIHRoZSBmb2xsb3dpbmcgdGltZSBvcGVyYXRvcnMsIHRoZWlyIGRvY3VtZW50YXRpb24gaXMgaW4qL1xuLyogdGhlIGBUaW1lTWF0aFR5cGVgLCBzaW5jZSB0aGF0IGlzIHRoZSBkb2N1bWVudGF0aW9uIHRoYXQgc2hvd3MgdXAqL1xuLyogaW4gdGhlIElERS4gV2VsbCwgYXQgbGVhc3QgdGhlIHZzY29kZSBJREUuKi9cblxuY29uc3QgYWJzVmFsdWUgPSBhYnMgPT4ge1xuICBpZiAodHlwZW9mIGFicyA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gTmF0KGFicyk7XG4gIH1cbiAgbXVzdE1hdGNoKGFicywgVGltZXN0YW1wUmVjb3JkU2hhcGUsICd0aW1lc3RhbXAnKTtcbiAgcmV0dXJuIE5hdChhYnMuYWJzVmFsdWUpO1xufTtcblxuY29uc3QgcmVsVmFsdWUgPSByZWwgPT4ge1xuICBpZiAodHlwZW9mIHJlbCA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gTmF0KHJlbCk7XG4gIH1cbiAgbXVzdE1hdGNoKHJlbCwgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsICdyZWxhdGl2ZScpO1xuICByZXR1cm4gTmF0KHJlbC5yZWxWYWx1ZSk7XG59O1xuXG5jb25zdCBtYWtlVGltZXN0YW1wUmVjb3JkID0gKGFicywgdGltZXJCcmFuZCkgPT5cbiAgaGFyZGVuKHsgYWJzVmFsdWU6IGFicywgdGltZXJCcmFuZCB9KTtcbmNvbnN0IG1ha2VSZWxhdGl2ZVRpbWVSZWNvcmQgPSAocmVsLCB0aW1lckJyYW5kKSA9PlxuICBoYXJkZW4oeyByZWxWYWx1ZTogcmVsLCB0aW1lckJyYW5kIH0pO1xuXG5jb25zdCBjb2VyY2VUaW1lc3RhbXBSZWNvcmQgPSAodHMsIGJyYW5kKSA9PiB7XG4gIGJyYW5kIHx8IEZhaWxgbXVzdCBoYXZlIGEgYnJhbmRgO1xuICBpZiAodHlwZW9mIHRzID09PSAnbnVtYmVyJykge1xuICAgIHRzID0gTmF0KHRzKTtcbiAgfVxuICBpZiAodHlwZW9mIHRzID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBtYWtlVGltZXN0YW1wUmVjb3JkKHRzLCBicmFuZCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgeyB0aW1lckJyYW5kIH0gPSB0cztcbiAgICBtdXN0TWF0Y2godHMsIFRpbWVzdGFtcFJlY29yZFNoYXBlLCAndGltZXN0YW1wJyk7XG4gICAgYWdyZWVkVGltZXJCcmFuZCh0aW1lckJyYW5kLCBicmFuZCk7XG4gICAgcmV0dXJuIHRzO1xuICB9XG59O1xuXG5jb25zdCBjb2VyY2VSZWxhdGl2ZVRpbWVSZWNvcmQgPSAocnQsIGJyYW5kKSA9PiB7XG4gIGJyYW5kIHx8IEZhaWxgbXVzdCBoYXZlIGEgYnJhbmRgO1xuICBpZiAodHlwZW9mIHJ0ID09PSAnbnVtYmVyJykge1xuICAgIHJ0ID0gTmF0KHJ0KTtcbiAgfVxuICBpZiAodHlwZW9mIHJ0ID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBtYWtlUmVsYXRpdmVUaW1lUmVjb3JkKHJ0LCBicmFuZCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgeyB0aW1lckJyYW5kIH0gPSBydDtcbiAgICBtdXN0TWF0Y2gocnQsIFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLCAncmVsYXRpdmVUaW1lJyk7XG4gICAgYWdyZWVkVGltZXJCcmFuZCh0aW1lckJyYW5kLCBicmFuZCk7XG4gICAgcmV0dXJuIHJ0O1xuICB9XG59O1xuXG5jb25zdCBhZGRBYnNSZWwgPSAoYWJzLCByZWwpID0+XG4gIGFic0xpa2UoYWJzLCByZWwsIGFic1ZhbHVlKGFicykgKyByZWxWYWx1ZShyZWwpKTtcblxuY29uc3QgYWRkUmVsUmVsID0gKHJlbDEsIHJlbDIpID0+XG4gIHJlbExpa2UocmVsMSwgcmVsMiwgcmVsVmFsdWUocmVsMSkgKyByZWxWYWx1ZShyZWwyKSk7XG5cbmNvbnN0IHN1YnRyYWN0QWJzQWJzID0gKGFiczEsIGFiczIpID0+XG4gIHJlbExpa2UoYWJzMSwgYWJzMiwgYWJzVmFsdWUoYWJzMSkgLSBhYnNWYWx1ZShhYnMyKSk7XG5cbmNvbnN0IGNsYW1wZWRTdWJ0cmFjdEFic0FicyA9IChhYnMxLCBhYnMyKSA9PiB7XG4gIGNvbnN0IHZhbDEgPSBhYnNWYWx1ZShhYnMxKTtcbiAgY29uc3QgdmFsMiA9IGFic1ZhbHVlKGFiczIpO1xuICByZXR1cm4gcmVsTGlrZShhYnMxLCBhYnMyLCB2YWwxID4gdmFsMiA/IHZhbDEgLSB2YWwyIDogMG4pO1xufTtcblxuY29uc3Qgc3VidHJhY3RBYnNSZWwgPSAoYWJzLCByZWwpID0+XG4gIGFic0xpa2UoYWJzLCByZWwsIGFic1ZhbHVlKGFicykgLSByZWxWYWx1ZShyZWwpKTtcblxuY29uc3Qgc3VidHJhY3RSZWxSZWwgPSAocmVsMSwgcmVsMikgPT5cbiAgcmVsTGlrZShyZWwxLCByZWwyLCByZWxWYWx1ZShyZWwxKSAtIHJlbFZhbHVlKHJlbDIpKTtcblxuY29uc3QgaXNSZWxaZXJvID0gcmVsID0+IHJlbFZhbHVlKHJlbCkgPT09IDBuO1xuXG5jb25zdCBtdWx0aXBseVJlbE5hdCA9IChyZWwsIG5hdCkgPT4gcmVsTGlrZShyZWwsIG5hdCwgcmVsVmFsdWUocmVsKSAqIG5hdCk7XG5cbmNvbnN0IGRpdmlkZVJlbE5hdCA9IChyZWwsIG5hdCkgPT4gcmVsTGlrZShyZWwsIG5hdCwgcmVsVmFsdWUocmVsKSAvIG5hdCk7XG5cbmNvbnN0IGRpdmlkZVJlbFJlbCA9IChyZWwxLCByZWwyKSA9PiB7XG4gIHNoYXJlZFRpbWVyQnJhbmQocmVsMSwgcmVsMik7IC8qIGp1c3QgZXJyb3IgY2hlY2sqL1xuICByZXR1cm4gcmVsVmFsdWUocmVsMSkgLyByZWxWYWx1ZShyZWwyKTtcbn07XG5cbmNvbnN0IG1vZEFic1JlbCA9IChhYnMsIHN0ZXApID0+XG4gIHJlbExpa2UoYWJzLCBzdGVwLCBhYnNWYWx1ZShhYnMpICUgcmVsVmFsdWUoc3RlcCkpO1xuXG5jb25zdCBtb2RSZWxSZWwgPSAocmVsLCBzdGVwKSA9PlxuICByZWxMaWtlKHJlbCwgc3RlcCwgcmVsVmFsdWUocmVsKSAlIHJlbFZhbHVlKHN0ZXApKTtcblxuLyoqXG4gKiBgY29tcGFyZVZhbHVlc2AgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudFxuICogdGhlIHRpbWUgY29tcGFyaXNvbiBvcGVyYXRvcnMuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtiaWdpbnR9IHYxXG4gKiBAcGFyYW0ge2JpZ2ludH0gdjJcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuY29uc3QgY29tcGFyZVZhbHVlcyA9IChsZWZ0LCByaWdodCwgdjEsIHYyKSA9PiB7XG4gIHNoYXJlZFRpbWVyQnJhbmQobGVmdCwgcmlnaHQpO1xuICBpZiAodjEgPCB2Mikge1xuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIGlmICh2MSA9PT0gdjIpIHtcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQodjEgPiB2Mik7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07XG5cbi8qKlxuICogVGhlIGBUaW1lTWF0aGAgb2JqZWN0IHByb3ZpZGVzIGhlbHBlciBtZXRob2RzIHRvIGRvIGFyaXRobWV0aWMgb24gbGFiZWxlZFxuICogdGltZSB2YWx1ZXMsIG11Y2ggbGlrZSBgQW1vdW50TWF0aGAgcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgdG8gZG8gYXJpdGhtZXRpY1xuICogb24gbGFiZWxlZCBhc3NldC9tb25leSB2YWx1ZXMuIEJvdGggY2hlY2sgZm9yIGNvbnNpc3RlbmN5IG9mIGxhYmVsczogYVxuICogYmluYXJ5IG9wZXJhdGlvbiBvbiB0d28gbGFiZWxlZCBvYmplY3RzIGVuc3VyZXMgdGhhdCB0aGUgYm90aCBjYXJyeVxuICogdGhlIHNhbWUgbGFiZWwuIElmIHRoZXkgcHJvZHVjZSBhbm90aGVyIG9iamVjdCBmcm9tIHRoZSBzYW1lIGRvbWFpbiwgaXRcbiAqIHdpbGwgY2FycnkgdGhlIHNhbWUgbGFiZWwuIElmIHRoZSBvcGVyYW5kcyBoYXZlIGluY29tcGF0aWJsZSBsYWJlbHMsXG4gKiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogVW5saWtlIGFtb3VudCBhcml0aG1ldGljLCB0aW1lIGFyaXRobWV0aWMgZGVhbHMgaW4gdHdvIGtpbmRzIG9mIHRpbWUgb2JqZWN0czpcbiAqIFRpbWVzdGFtcHMsIHdoaWNoIHJlcHJlc2VudCBhYnNvbHV0ZSB0aW1lLCBhbmQgUmVsYXRpdmVUaW1lLCB3aGljaCByZXByZXNlbnRzXG4gKiB0aGUgZHVyYXRpb24gYmV0d2VlbiB0d28gYWJzb2x1dGUgdGltZXMuIEJvdGgga2luZHMgb2YgdGltZSBvYmplY3RcbiAqIGFyZSBsYWJlbGVkIGJ5IGEgYFRpbWVyQnJhbmRgLiBGb3IgYSBUaW1lc3RhbXAgb2JqZWN0LCB0aGUgdmFsdWUgaXNcbiAqIGEgYmlnaW50IGluIGFuIGBhYnNWYWx1ZWAgcHJvcGVydHkuIEZvciBhIFJlbGF0aXZlVGltZSBvYmplY3QsIHRoZSB2YWx1ZVxuICogaXMgYSBiaWdpbnQgaW4gYSBgcmVsVmFsdWVgIHByb3BlcnR5LiBUaHVzIHdlIGhhdmUgYSBydW50aW1lIHNhZmV0eSBjaGVja1xuICogdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgY29uZnVzZWQgdGhlIHR3bywgZXZlbiBpZiB3ZSBoYXZlIG1hbmFnZWQgdG8gZm9vbFxuICogdGhlICh1bnNvdW5kKSBzdGF0aWMgdHlwZSBzeXN0ZW0uXG4gKlxuICogQXMgYSB0cmFuc2l0aW9uYWwgbWVhc3VyZSwgY3VycmVudGx5IG1hbnkgVGltZXN0YW1wcyBhbmQgUmVsYXRpdmVUaW1lcyBhcmVcbiAqIHN0aWxsIHJlcHJlc2VudGVkIGJ5IHVubGFiZWxlZCBiaWdpbnRzLiBEdXJpbmcgdGhpcyB0cmFuc2l0aW9uYWwgcGVyaW9kLFxuICogd2UgYWxsb3cgdGhpcywgYm90aCBzdGF0aWNhbGx5IGFuZCBkeW5hbWljYWxseS4gRm9yIGEgbm9ybWFsIGJpbmFyeVxuICogb3BlcmF0aW9uLCBpZiBib3RoIGlucHV0cyBhcmUgbGFiZWxlZCwgdGhlbiB3ZSBkbyB0aGUgZnVsbCBjaGVja2luZyBhc1xuICogZXhwbGFpbmVkIGFib3ZlIGFuZCByZXR1cm4gYSBsYWJlbGVkIHJlc3VsdC4gSWYgYm90aCBpbnB1dHMgYXJlIHVubGFiZWxlZFxuICogYmlnaW50cywgd2UgKmFzc3VtZSogdGhhdCB0aGV5IGluZGljYXRlIGEgdGltZSBvZiB0aGUgcmlnaHQga2luZFxuICogKFRpbWVzdGFtcCB2cyBSZWxhdGl2ZVRpbWUpIGFuZCB0aW1lciBicmFuZC4gU2luY2Ugd2UgZG9uJ3Qga25vdyB3aGF0XG4gKiBicmFuZCB3YXMgaW50ZW5kZWQsIHdlIGNhbiBvbmx5IHJldHVybiB5ZXQgYW5vdGhlciB1bmxhYmVsZWQgYmlnaW50LlxuICpcbiAqIElmIG9uZSBvcGVyYW5kIGlzIGxhYmVsZWQgYW5kIHRoZSBvdGhlciBpcyBub3QsIHdlIGNoZWNrIHRoZSBsYWJlbGVkIG9wZXJhbmQsXG4gKiAqYXNzdW1lKiB0aGUgdW5sYWJlbGVkIGJpZ2ludCByZXByZXNlbnRzIHRoZSB2YWx1ZSBuZWVkZWQgZm9yIHRoZSBvdGhlclxuICogb3BlcmFuZCwgYW5kIHJldHVybiBhIGxhYmVsZWQgdGltZSBvYmplY3Qgd2l0aCB0aGUgYnJhbmQgb2YgdGhlIGxhYmVsZWRcbiAqIG9wZXJhbmQuXG4gKlxuICogQHR5cGUge1RpbWVNYXRoVHlwZX1cbiAqL1xuICAgICAgIGNvbnN0IFRpbWVNYXRoID0gaGFyZGVuKHtcbiAgYWJzVmFsdWUsXG4gIHJlbFZhbHVlLFxuICBjb2VyY2VUaW1lc3RhbXBSZWNvcmQsXG4gIGNvZXJjZVJlbGF0aXZlVGltZVJlY29yZCxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciB4eHggZHluYW1pYyB0eXBpbmcqL1xuICBhZGRBYnNSZWwsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgeHh4IGR5bmFtaWMgdHlwaW5nKi9cbiAgYWRkUmVsUmVsLFxuICBzdWJ0cmFjdEFic0FicyxcbiAgY2xhbXBlZFN1YnRyYWN0QWJzQWJzLFxuICBzdWJ0cmFjdEFic1JlbCxcbiAgc3VidHJhY3RSZWxSZWwsXG4gIGlzUmVsWmVybyxcbiAgbXVsdGlwbHlSZWxOYXQsXG4gIGRpdmlkZVJlbE5hdCxcbiAgZGl2aWRlUmVsUmVsLFxuICBtb2RBYnNSZWwsXG4gIG1vZFJlbFJlbCxcbiAgY29tcGFyZUFiczogKGFiczEsIGFiczIpID0+XG4gICAgY29tcGFyZVZhbHVlcyhhYnMxLCBhYnMyLCBhYnNWYWx1ZShhYnMxKSwgYWJzVmFsdWUoYWJzMikpLFxuICBjb21wYXJlUmVsOiAocmVsMSwgcmVsMikgPT5cbiAgICBjb21wYXJlVmFsdWVzKHJlbDEsIHJlbDIsIHJlbFZhbHVlKHJlbDEpLCByZWxWYWx1ZShyZWwyKSksXG59KTskaM2PX29uY2UuVGltZU1hdGgoVGltZU1hdGgpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGltZU1hdGgiOlsiVGltZU1hdGgiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANPYVxPMJAADzCQAAJQAAAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSIsIlJlbGF0aXZlVGltZVNoYXBlIiwiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSIsIlRpbWVyQnJhbmRTaGFwZSIsIlRpbWVyU2VydmljZVNoYXBlIiwiVGltZXN0YW1wUmVjb3JkU2hhcGUiLCJUaW1lc3RhbXBTaGFwZSIsIlRpbWVzdGFtcFZhbHVlU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm59IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7VGltZXN0YW1wUmVjb3JkLCBUaW1lc3RhbXBWYWx1ZSwgUmVsYXRpdmVUaW1lVmFsdWUsIFJlbGF0aXZlVGltZVJlY29yZH0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuICAgICAgIGNvbnN0IFRpbWVyQnJhbmRTaGFwZSA9IE0ucmVtb3RhYmxlKCdUaW1lckJyYW5kJyk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPGJpZ2ludD59ICovJGjNj19vbmNlLlRpbWVyQnJhbmRTaGFwZShUaW1lckJyYW5kU2hhcGUpO1xuICAgICAgIGNvbnN0IFRpbWVzdGFtcFZhbHVlU2hhcGUgPSBNLm5hdCgpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxiaWdpbnQ+fSAqLyRozY9fb25jZS5UaW1lc3RhbXBWYWx1ZVNoYXBlKFRpbWVzdGFtcFZhbHVlU2hhcGUpO1xuICAgICAgIGNvbnN0IFJlbGF0aXZlVGltZVZhbHVlU2hhcGUgPSBNLm5hdCgpOyAvKiBTaG91bGQgd2UgYWxsb3cgbmVnYXRpdmVzPyovXG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFRpbWVzdGFtcFJlY29yZD59ICovJGjNj19vbmNlLlJlbGF0aXZlVGltZVZhbHVlU2hhcGUoUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSk7XG4gICAgICAgY29uc3QgVGltZXN0YW1wUmVjb3JkU2hhcGUgPSB7XG4gIHRpbWVyQnJhbmQ6IFRpbWVyQnJhbmRTaGFwZSxcbiAgYWJzVmFsdWU6IFRpbWVzdGFtcFZhbHVlU2hhcGUsXG59OyRozY9fb25jZS5UaW1lc3RhbXBSZWNvcmRTaGFwZShUaW1lc3RhbXBSZWNvcmRTaGFwZSk7XG5oYXJkZW4oVGltZXN0YW1wUmVjb3JkU2hhcGUpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxSZWxhdGl2ZVRpbWVSZWNvcmQ+fSAqL1xuICAgICAgIGNvbnN0IFJlbGF0aXZlVGltZVJlY29yZFNoYXBlID0ge1xuICB0aW1lckJyYW5kOiBUaW1lckJyYW5kU2hhcGUsXG4gIHJlbFZhbHVlOiBSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlLFxufTskaM2PX29uY2UuUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuaGFyZGVuKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48VGltZXN0YW1wUmVjb3JkIHwgVGltZXN0YW1wVmFsdWU+fSAqL1xuICAgICAgIGNvbnN0IFRpbWVzdGFtcFNoYXBlID0gTS5vcihUaW1lc3RhbXBSZWNvcmRTaGFwZSwgVGltZXN0YW1wVmFsdWVTaGFwZSk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFJlbGF0aXZlVGltZVJlY29yZCB8IFJlbGF0aXZlVGltZVZhbHVlPn0gKi8kaM2PX29uY2UuVGltZXN0YW1wU2hhcGUoVGltZXN0YW1wU2hhcGUpO1xuICAgICAgIGNvbnN0IFJlbGF0aXZlVGltZVNoYXBlID0gTS5vcihcbiAgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsXG4gIFJlbGF0aXZlVGltZVZhbHVlU2hhcGUsXG4pOyRozY9fb25jZS5SZWxhdGl2ZVRpbWVTaGFwZShSZWxhdGl2ZVRpbWVTaGFwZSk7XG5cbiAgICAgICBjb25zdCBUaW1lclNlcnZpY2VTaGFwZSA9IE0ucmVtb3RhYmxlKCdUaW1lclNlcnZpY2UnKTskaM2PX29uY2UuVGltZXJTZXJ2aWNlU2hhcGUoVGltZXJTZXJ2aWNlU2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGltZXJCcmFuZFNoYXBlIjpbIlRpbWVyQnJhbmRTaGFwZSJdLCJUaW1lc3RhbXBWYWx1ZVNoYXBlIjpbIlRpbWVzdGFtcFZhbHVlU2hhcGUiXSwiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIl0sIlRpbWVzdGFtcFJlY29yZFNoYXBlIjpbIlRpbWVzdGFtcFJlY29yZFNoYXBlIl0sIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIl0sIlRpbWVzdGFtcFNoYXBlIjpbIlRpbWVzdGFtcFNoYXBlIl0sIlJlbGF0aXZlVGltZVNoYXBlIjpbIlJlbGF0aXZlVGltZVNoYXBlIl0sIlRpbWVyU2VydmljZVNoYXBlIjpbIlRpbWVyU2VydmljZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACYAAABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA2D1iULSwAAC0sAAAoAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2V4by11dGlscy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImlnbm9yZUNvbnRleHQiLCJtYWtlRXhvVXRpbHMiLCJwcmVwYXJlRXhvIiwicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUtpbmQiLCJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZVNpbmdsZXRvbiIsInByb3ZpZGVLaW5kSGFuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaW5pdEVtcHR5LHByb3ZpZGUsZ2xvYmFsVmF0RGF0YTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLFskaM2PX2EgPT4gKGluaXRFbXB0eSA9ICRozY9fYSldXV1dLFtcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW1tcInByb3ZpZGVcIixbJGjNj19hID0+IChwcm92aWRlID0gJGjNj19hKV1dLFtcIlZhdERhdGFcIixbJGjNj19hID0+IChnbG9iYWxWYXREYXRhID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0ludGVyZmFjZUd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7QmFnZ2FnZSwgRGVmaW5lS2luZE9wdGlvbnMsIER1cmFibGVLaW5kSGFuZGxlLCBJbnRlcmZhY2VHdWFyZEtpdH0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7UGx1c0NvbnRleHR9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge1ZhdERhdGF9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge1ByZXBhcmVLaW5kfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtQcmVwYXJlS2luZE11bHRpfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtHdWFyZGVkfSBmcm9tICdAZW5kby9leG8nO1xuICogQGltcG9ydCB7R3VhcmRlZEtpdH0gZnJvbSAnQGVuZG8vZXhvJztcbiAqL1xuXG4vKiBTb21lIGZlZWRiYWNrIGlmIHRoZSBpbml0IGZ1bmN0aW9uIGlzIGFzeW5jKi9cbi8qKlxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJbml0U3RhdGVcbiAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSVxuICogQHR5cGVkZWYge1JldHVyblR5cGU8ST4gZXh0ZW5kcyBQcm9taXNlPGFueT4gPyBuZXZlciA6IFJldHVyblR5cGU8ST59IFN0YXRlUmVzdWx0XG4gKi9cblxuLyoqXG4gKiBNYWtlIGEgdmVyc2lvbiBvZiB0aGUgYXJndW1lbnQgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGtpbmQgY29udGV4dCBidXQgaWdub3Jlc1xuICogaXQuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueSkgPT4gYW55PihcbiAqICAgZm46IFQsXG4gKiApID0+IFBsdXNDb250ZXh0PG5ldmVyLCBUPn1cbiAqL1xuICAgICAgIGNvbnN0IGlnbm9yZUNvbnRleHQgPVxuICBmbiA9PlxuICAoX2NvbnRleHQsIC4uLmFyZ3MpID0+XG4gICAgZm4oLi4uYXJncyk7JGjNj19vbmNlLmlnbm9yZUNvbnRleHQoaWdub3JlQ29udGV4dCk7XG5oYXJkZW4oaWdub3JlQ29udGV4dCk7XG5cbi8qIFRPRE86IEZpbmQgYSBnb29kIGhvbWUgZm9yIHRoaXMgZnVuY3Rpb24gdXNlZCBieSBAYWdvcmljL3ZhdC1kYXRhIGFuZCB0ZXN0aW5nIGNvZGUqL1xuLyoqIEBwYXJhbSB7VmF0RGF0YX0gVmF0RGF0YSAqL1xuICAgICAgIGNvbnN0IG1ha2VFeG9VdGlscyA9IFZhdERhdGEgPT4ge1xuICBjb25zdCB7XG4gICAgZGVmaW5lS2luZCxcbiAgICBkZWZpbmVLaW5kTXVsdGksXG4gICAgZGVmaW5lRHVyYWJsZUtpbmQsXG4gICAgZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxcbiAgICBtYWtlS2luZEhhbmRsZSxcbiAgfSA9IFZhdERhdGE7XG5cbiAgLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRXhvcy9FeG9DbGFzc2VzIGluc3RlYWQgb2YgS2luZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcmV0dXJucyB7RHVyYWJsZUtpbmRIYW5kbGV9XG4gKi9cbiAgY29uc3QgcHJvdmlkZUtpbmRIYW5kbGUgPSAoYmFnZ2FnZSwga2luZE5hbWUpID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBgJHtraW5kTmFtZX1fa2luZEhhbmRsZWAsICgpID0+IG1ha2VLaW5kSGFuZGxlKGtpbmROYW1lKSk7XG4gIGhhcmRlbihwcm92aWRlS2luZEhhbmRsZSk7XG5cbiAgLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4b0NsYXNzIGluc3RlYWRcbiAqIEB0eXBlIHtQcmVwYXJlS2luZH1cbiAqL1xuICBjb25zdCBwcmVwYXJlS2luZCA9IChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIGluaXQsXG4gICAgYmVoYXZpb3IsXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbiAgKSA9PlxuICAgIGRlZmluZUR1cmFibGVLaW5kKFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW5pdCxcbiAgICAgIGJlaGF2aW9yLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUtpbmQpO1xuXG4gIC8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG9DbGFzc0tpdCBpbnN0ZWFkXG4gKiBAdHlwZSB7UHJlcGFyZUtpbmRNdWx0aX1cbiAqL1xuICBjb25zdCBwcmVwYXJlS2luZE11bHRpID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW5pdCxcbiAgICBiZWhhdmlvcixcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShcbiAgICAgIHByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2UsIGtpbmROYW1lKSxcbiAgICAgIGluaXQsXG4gICAgICBiZWhhdmlvcixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgaGFyZGVuKHByZXBhcmVLaW5kTXVsdGkpO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtJbml0U3RhdGV9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIFQgYmVoYXZpb3JcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBzZWxmOiBUO1xuICogICAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqICAgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBUO1xuICogICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWQ8VD59XG4gKi9cbiAgY29uc3QgZGVmaW5lVmlydHVhbEV4b0NsYXNzID0gKHRhZywgaW50ZXJmYWNlR3VhcmQsIGluaXQsIG1ldGhvZHMsIG9wdGlvbnMpID0+XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICBkZWZpbmVLaW5kKHRhZywgaW5pdCwgbWV0aG9kcywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHRoaXNmdWxNZXRob2RzOiB0cnVlLFxuICAgICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgfSk7XG4gIGhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtJbml0U3RhdGV9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmRLaXQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBmYWNldHM6IEd1YXJkZWRLaXQ8VD47XG4gKiAgICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogICB9Pn0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgZmFjZXRzOiBUO1xuICogICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWRLaXQ8VD59XG4gKi9cbiAgY29uc3QgZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0ID0gKFxuICAgIHRhZyxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICBpbml0LFxuICAgIGZhY2V0cyxcbiAgICBvcHRpb25zLFxuICApID0+XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICBkZWZpbmVLaW5kTXVsdGkodGFnLCBpbml0LCBmYWNldHMsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB0aGlzZnVsTWV0aG9kczogdHJ1ZSxcbiAgICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgIH0pO1xuICBoYXJkZW4oZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7SW5pdFN0YXRlfSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkIHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJlxuICogICBUaGlzVHlwZTx7XG4gKiAgICAgc2VsZjogVDtcbiAqICAgICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiAgIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgc2VsZjogVDtcbiAqICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiBHdWFyZGVkPFQ+fVxuICovXG4gIGNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzcyA9IChcbiAgICBraW5kSGFuZGxlLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIGluaXQsXG4gICAgbWV0aG9kcyxcbiAgICBvcHRpb25zLFxuICApID0+XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICBkZWZpbmVEdXJhYmxlS2luZChraW5kSGFuZGxlLCBpbml0LCBtZXRob2RzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtEdXJhYmxlS2luZEhhbmRsZX0ga2luZEhhbmRsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZEtpdCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICZcbiAqICAgVGhpc1R5cGU8e1xuICogICAgIGZhY2V0czogR3VhcmRlZEtpdDxUPjtcbiAqICAgICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiAgIH0+fSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQ7XG4gKiAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZEtpdDxUPn1cbiAqL1xuICBjb25zdCBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQgPSAoXG4gICAga2luZEhhbmRsZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICBpbml0LFxuICAgIGZhY2V0cyxcbiAgICBvcHRpb25zLFxuICApID0+XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpKGtpbmRIYW5kbGUsIGluaXQsIGZhY2V0cywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHRoaXNmdWxNZXRob2RzOiB0cnVlLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgfSk7XG4gIGhhcmRlbihkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtJbml0U3RhdGV9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkIHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJlxuICogICBUaGlzVHlwZTx7XG4gKiAgICAgc2VsZjogUmVtb3RhYmxlT2JqZWN0ICYgVDtcbiAqICAgICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiAgIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgc2VsZjogVDtcbiAqICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiBHdWFyZGVkPFQ+fVxuICovXG4gIGNvbnN0IHByZXBhcmVFeG9DbGFzcyA9IChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIGluaXQsXG4gICAgbWV0aG9kcyxcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzKFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgICBpbml0LFxuICAgICAgbWV0aG9kcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgaGFyZGVuKHByZXBhcmVFeG9DbGFzcyk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmRLaXQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBmYWNldHM6IEd1YXJkZWRLaXQ8VD47XG4gKiAgICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogICB9Pn0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgZmFjZXRzOiBUO1xuICogICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWRLaXQ8VD59XG4gKi9cbiAgY29uc3QgcHJlcGFyZUV4b0NsYXNzS2l0ID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgaW5pdCxcbiAgICBmYWNldHMsXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbiAgKSA9PlxuICAgIGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChcbiAgICAgIHByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2UsIGtpbmROYW1lKSxcbiAgICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgICAgaW5pdCxcbiAgICAgIGZhY2V0cyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgaGFyZGVuKHByZXBhcmVFeG9DbGFzc0tpdCk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj59IE0gbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge00gJlxuICogICBUaGlzVHlwZTx7XG4gKiAgICAgc2VsZjogUmVtb3RhYmxlT2JqZWN0ICYgTTtcbiAqICAgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBNIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtHdWFyZGVkPE0+fVxuICovXG4gIGNvbnN0IHByZXBhcmVFeG8gPSAoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgIGNvbnN0IG1ha2VTaW5nbGV0b24gPSBwcmVwYXJlRXhvQ2xhc3MoXG4gICAgICBiYWdnYWdlLFxuICAgICAga2luZE5hbWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICAgIGluaXRFbXB0eSxcbiAgICAgIG1ldGhvZHMsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG5cbiAgICByZXR1cm4gcHJvdmlkZShiYWdnYWdlLCBgJHtraW5kTmFtZX1fc2luZ2xldG9uYCwgKCkgPT4gbWFrZVNpbmdsZXRvbigpKTtcbiAgfTtcbiAgaGFyZGVuKHByZXBhcmVFeG8pO1xuXG4gIC8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG8gaW5zdGVhZC5cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPn0gTSBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtNfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogTSB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7R3VhcmRlZDxNPn1cbiAqL1xuICBjb25zdCBwcmVwYXJlU2luZ2xldG9uID0gKGJhZ2dhZ2UsIGtpbmROYW1lLCBtZXRob2RzLCBvcHRpb25zID0gdW5kZWZpbmVkKSA9PlxuICAgIHByZXBhcmVFeG8oYmFnZ2FnZSwga2luZE5hbWUsIHVuZGVmaW5lZCwgbWV0aG9kcywgb3B0aW9ucyk7XG4gIGhhcmRlbihwcmVwYXJlU2luZ2xldG9uKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG4gICAgZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0LFxuICAgIGRlZmluZUR1cmFibGVFeG9DbGFzcyxcbiAgICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG4gICAgcHJlcGFyZUV4b0NsYXNzLFxuICAgIHByZXBhcmVFeG9DbGFzc0tpdCxcbiAgICBwcmVwYXJlRXhvLFxuXG4gICAgcHJlcGFyZVNpbmdsZXRvbixcbiAgICBwcm92aWRlS2luZEhhbmRsZSxcbiAgICBwcmVwYXJlS2luZCxcbiAgICBwcmVwYXJlS2luZE11bHRpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VFeG9VdGlscyhtYWtlRXhvVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxFeG9VdGlscyA9IG1ha2VFeG9VdGlscyhnbG9iYWxWYXREYXRhKTtcblxuICAgICAgIGNvbnN0IHtcbiAgZGVmaW5lVmlydHVhbEV4b0NsYXNzLFxuICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG4gIGRlZmluZUR1cmFibGVFeG9DbGFzcyxcbiAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0LFxuICBwcmVwYXJlRXhvQ2xhc3MsXG4gIHByZXBhcmVFeG9DbGFzc0tpdCxcbiAgcHJlcGFyZUV4byxcbiAgcHJlcGFyZVNpbmdsZXRvbixcbn0gPSBnbG9iYWxFeG9VdGlscztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRXhvcy9FeG9DbGFzc2VzIGluc3RlYWQgb2YgS2luZHNcbiAqLyRozY9fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MoZGVmaW5lVmlydHVhbEV4b0NsYXNzKTskaM2PX29uY2UuZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzcyhkZWZpbmVEdXJhYmxlRXhvQ2xhc3MpOyRozY9fb25jZS5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQoZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KTskaM2PX29uY2UucHJlcGFyZUV4b0NsYXNzKHByZXBhcmVFeG9DbGFzcyk7JGjNj19vbmNlLnByZXBhcmVFeG9DbGFzc0tpdChwcmVwYXJlRXhvQ2xhc3NLaXQpOyRozY9fb25jZS5wcmVwYXJlRXhvKHByZXBhcmVFeG8pOyRozY9fb25jZS5wcmVwYXJlU2luZ2xldG9uKHByZXBhcmVTaW5nbGV0b24pO1xuICAgICAgIGNvbnN0IHsgcHJvdmlkZUtpbmRIYW5kbGUsIHByZXBhcmVLaW5kLCBwcmVwYXJlS2luZE11bHRpIH0gPVxuICBnbG9iYWxFeG9VdGlsczskaM2PX29uY2UucHJvdmlkZUtpbmRIYW5kbGUocHJvdmlkZUtpbmRIYW5kbGUpOyRozY9fb25jZS5wcmVwYXJlS2luZChwcmVwYXJlS2luZCk7JGjNj19vbmNlLnByZXBhcmVLaW5kTXVsdGkocHJlcGFyZUtpbmRNdWx0aSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZ25vcmVDb250ZXh0IjpbImlnbm9yZUNvbnRleHQiXSwibWFrZUV4b1V0aWxzIjpbIm1ha2VFeG9VdGlscyJdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG9DbGFzcyI6WyJwcmVwYXJlRXhvQ2xhc3MiXSwicHJlcGFyZUV4b0NsYXNzS2l0IjpbInByZXBhcmVFeG9DbGFzc0tpdCJdLCJwcmVwYXJlRXhvIjpbInByZXBhcmVFeG8iXSwicHJlcGFyZVNpbmdsZXRvbiI6WyJwcmVwYXJlU2luZ2xldG9uIl0sInByb3ZpZGVLaW5kSGFuZGxlIjpbInByb3ZpZGVLaW5kSGFuZGxlIl0sInByZXBhcmVLaW5kIjpbInByZXBhcmVLaW5kIl0sInByZXBhcmVLaW5kTXVsdGkiOlsicHJlcGFyZUtpbmRNdWx0aSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADPnOvptggAALYIAAAkAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiLi9leG8tdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbXV0sW1wiLi9leG8tdXRpbHMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAYWdvcmljL3N0b3JlIjpbWyJNIiwiTSJdLFsibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIl0sWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIl0sWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyI6W1sibWFrZUtpbmRIYW5kbGUiLCJtYWtlS2luZEhhbmRsZSJdLFsicHJvdmlkZVByb21pc2VXYXRjaGVyIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sWyJ3YXRjaFByb21pc2UiLCJ3YXRjaFByb21pc2UiXSxbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSxbImNhbkJlRHVyYWJsZSIsImNhbkJlRHVyYWJsZSJdLFsicGlja0ZhY2V0IiwicGlja0ZhY2V0Il0sWyJwYXJ0aWFsQXNzaWduIiwicGFydGlhbEFzc2lnbiJdLFsicHJvdmlkZSIsInByb3ZpZGUiXSxbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdLFsicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSJdLFsiZGVmaW5lS2luZCIsImRlZmluZUtpbmQiXSxbImRlZmluZUtpbmRNdWx0aSIsImRlZmluZUtpbmRNdWx0aSJdLFsiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZCJdLFsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXV0sIi4vZXhvLXV0aWxzLmpzIjpbWyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSxbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLFsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG9DbGFzcyIsInByZXBhcmVFeG9DbGFzcyJdLFsicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUV4b0NsYXNzS2l0Il0sWyJwcmVwYXJlRXhvIiwicHJlcGFyZUV4byJdLFsicHJlcGFyZVNpbmdsZXRvbiIsInByZXBhcmVTaW5nbGV0b24iXSxbImlnbm9yZUNvbnRleHQiLCJpZ25vcmVDb250ZXh0Il0sWyJwcm92aWRlS2luZEhhbmRsZSIsInByb3ZpZGVLaW5kSGFuZGxlIl0sWyJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kIl0sWyJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZUtpbmRNdWx0aSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA73e+MDkjAAA5IwAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiVmF0RGF0YSIsImNhbkJlRHVyYWJsZSIsImRlZmluZUR1cmFibGVLaW5kIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUtpbmQiLCJkZWZpbmVLaW5kTXVsdGkiLCJtYWtlS2luZEhhbmRsZSIsIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVN0b3JlVXRpbHMiLCJwYXJ0aWFsQXNzaWduIiwicGlja0ZhY2V0IiwicHJvdmlkZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscHJvdmlkZUxhenk7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIixbJGjNj19hID0+IChwcm92aWRlTGF6eSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKiBAaW1wb3J0IHtCYWdnYWdlLCBQaWNrRmFjZXQsIFZhdERhdGF9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJyAqL1xuXG4vKiogQHR5cGUge1ZhdERhdGF9ICovXG5sZXQgVmF0RGF0YUdsb2JhbDtcbmlmICgnVmF0RGF0YScgaW4gZ2xvYmFsVGhpcykge1xuICBnbG9iYWxUaGlzLlZhdERhdGEgfHwgRmFpbGBWYXREYXRhIGRlZmluZWQgaW4gZ2xvYmFsIGFzIG51bGwgb3IgdW5kZWZpbmVkYDtcbiAgLyogWFhYIHR5cGVzIGluY29tcGF0aWJpbGl0eSovXG4gIFZhdERhdGFHbG9iYWwgPSAvKiogQHR5cGUge2FueX0gKi8gKGdsb2JhbFRoaXMuVmF0RGF0YSk7XG59IGVsc2Uge1xuICAvKiBYWFggdGhpcyBtb2R1bGUgaGFzIGJlZW4ga25vd24gdG8gZ2V0IGltcG9ydGVkICh0cmFuc2l0aXZlbHkpIGluIGNhc2VzIHRoYXQqL1xuICAvKiBuZXZlciB1c2UgaXQgc28gd2UgbWFrZSBhIHZlcnNpb24gdGhhdCB3aWxsIHNhdGlzZnkgbW9kdWxlIHJlc29sdXRpb24gYnV0Ki9cbiAgLyogZmFpbCBhdCBydW50aW1lLiovXG4gIGNvbnN0IHVuYXZhaWxhYmxlID0gKCkgPT4gRmFpbGBWYXREYXRhIHVuYXZhaWxhYmxlYDtcbiAgVmF0RGF0YUdsb2JhbCA9IHtcbiAgICBkZWZpbmVLaW5kOiB1bmF2YWlsYWJsZSxcbiAgICBkZWZpbmVLaW5kTXVsdGk6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUR1cmFibGVLaW5kOiB1bmF2YWlsYWJsZSxcbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlS2luZEhhbmRsZTogdW5hdmFpbGFibGUsXG4gICAgcHJvdmlkZVByb21pc2VXYXRjaGVyOiB1bmF2YWlsYWJsZSxcbiAgICB3YXRjaFByb21pc2U6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VTY2FsYXJCaWdNYXBTdG9yZTogdW5hdmFpbGFibGUsXG4gICAgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZTogdW5hdmFpbGFibGUsXG4gICAgbWFrZVNjYWxhckJpZ1NldFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBjYW5CZUR1cmFibGU6IHVuYXZhaWxhYmxlLFxuICB9O1xufVxuXG5jb25zdCBWYXREYXRhRXhwb3J0ID0gVmF0RGF0YUdsb2JhbDskaM2PX29uY2UuVmF0RGF0YUV4cG9ydChWYXREYXRhRXhwb3J0KTtcblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICovXG4gICAgICAgY29uc3Qge1xuICBkZWZpbmVLaW5kLFxuICBkZWZpbmVLaW5kTXVsdGksXG4gIGRlZmluZUR1cmFibGVLaW5kLFxuICBkZWZpbmVEdXJhYmxlS2luZE11bHRpLFxufSA9IFZhdERhdGFHbG9iYWw7JGjNj19vbmNlLmRlZmluZUtpbmQoZGVmaW5lS2luZCk7JGjNj19vbmNlLmRlZmluZUtpbmRNdWx0aShkZWZpbmVLaW5kTXVsdGkpOyRozY9fb25jZS5kZWZpbmVEdXJhYmxlS2luZChkZWZpbmVEdXJhYmxlS2luZCk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVLaW5kTXVsdGkoZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSk7XG5cbiAgICAgICBjb25zdCB7XG4gIG1ha2VLaW5kSGFuZGxlLFxuICBwcm92aWRlUHJvbWlzZVdhdGNoZXIsXG4gIHdhdGNoUHJvbWlzZSxcbiAgbWFrZVNjYWxhckJpZ01hcFN0b3JlLFxuICBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxuICBtYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG4gIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUsXG4gIGNhbkJlRHVyYWJsZSxcbn0gPSBWYXREYXRhR2xvYmFsO1xuXG4vKipcbiAqIFdoZW4gbWFraW5nIGEgbXVsdGktZmFjZXQga2luZCwgaXQncyBjb21tb24gdG8gcGljayBvbmUgZmFjZXQgdG8gZXhwb3NlLlxuICogRS5nLixcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IChhLCBiLCBjLCBkKSA9PiBtYWtlRm9vQmFzZShhLCBiLCBjLCBkKS5zZWxmO1xuICpcbiAqIFRoaXMgaGVscGVyIHJlZHVjZXMgdGhlIGR1cGxpY2F0aW9uOlxuICpcbiAqICAgICBjb25zdCBtYWtlRm9vID0gcGlja0ZhY2V0KG1ha2VGb29CYXNlLCAnc2VsZicpO1xuICpcbiAqIEB0eXBlIHtQaWNrRmFjZXR9XG4gKi8kaM2PX29uY2UubWFrZUtpbmRIYW5kbGUobWFrZUtpbmRIYW5kbGUpOyRozY9fb25jZS5wcm92aWRlUHJvbWlzZVdhdGNoZXIocHJvdmlkZVByb21pc2VXYXRjaGVyKTskaM2PX29uY2Uud2F0Y2hQcm9taXNlKHdhdGNoUHJvbWlzZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdNYXBTdG9yZShtYWtlU2NhbGFyQmlnTWFwU3RvcmUpOyRozY9fb25jZS5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUpOyRozY9fb25jZS5tYWtlU2NhbGFyQmlnU2V0U3RvcmUobWFrZVNjYWxhckJpZ1NldFN0b3JlKTskaM2PX29uY2UubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKTskaM2PX29uY2UuY2FuQmVEdXJhYmxlKGNhbkJlRHVyYWJsZSk7XG4gICAgICAgY29uc3QgcGlja0ZhY2V0ID1cbiAgKG1ha2VyLCBmYWNldE5hbWUpID0+XG4gICguLi5hcmdzKSA9PlxuICAgIG1ha2VyKC4uLmFyZ3MpW2ZhY2V0TmFtZV07JGjNj19vbmNlLnBpY2tGYWNldChwaWNrRmFjZXQpO1xuaGFyZGVuKHBpY2tGYWNldCk7XG5cbi8qKlxuICogQXNzaWduIHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZVxuICogb2JqZWN0IHRvIHRoZWlyIGtleXMgaW4gdGhlIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UGFydGlhbDxUPn0gc291cmNlXG4gKi9cbiAgICAgICBjb25zdCBwYXJ0aWFsQXNzaWduID0gKHRhcmdldCwgc291cmNlKSA9PiB7XG4gIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpO1xufTskaM2PX29uY2UucGFydGlhbEFzc2lnbihwYXJ0aWFsQXNzaWduKTtcbmhhcmRlbihwYXJ0aWFsQXNzaWduKTtcblxuLyoqIEBpbXBvcnQge1N0b3JlT3B0aW9uc30gZnJvbSAnQGFnb3JpYy9zdG9yZScgKi9cblxuLyoqXG4gKiBVbmxpa2UgYHByb3ZpZGVMYXp5YCwgYHByb3ZpZGVgIHNob3VsZCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlIHdpdGhpbiBhbnkgdmF0XG4gKiBpbmNhcm5hdGlvbiB3aXRoIGEgZ2l2ZW4gYGJhZ2dhZ2VgLGBrZXlgIHBhaXIuXG4gKlxuICogYHByb3ZpZGVgIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gcG9wdWxhdGUgYmFnZ2FnZSwgd2hlcmUgdGhlIHRvdGFsIG51bWJlciBvZlxuICogY2FsbHMgdG8gYHByb3ZpZGVgIG11c3QgYmUgbG93IGNhcmRpbmFsaXR5LCBzaW5jZSB3ZSBrZWVwIHRoZSBib29ra2VlcGluZyB0b1xuICogZGV0ZWN0IGNvbGxpc2lvbnMgaW4gbm9ybWFsIGxhbmd1YWdlLWhlYXAgbWVtb3J5LiBBbGwgdGhlIG90aGVyXG4gKiBiYWdnYWdlLW9yaWVudGVkIGBwcm92aWRlKmAgYW5kIGBwcmVwYXJlKmAgZnVuY3Rpb25zIGNhbGwgYHByb3ZpZGVgLCBhbmQgc29cbiAqIGltcG9zZSB0aGUgc2FtZSBjb25zdHJhaW50cy4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggb3VyIGV4cGVjdGVkIGR1cmFiaWxpdHlcbiAqIHBhdHRlcm5zOiBXaGF0IHdlIHN0b3JlIGluIGJhZ2dhZ2UgYXJlXG4gKlxuICogLSBraW5kSGFuZGxlcywgd2hpY2ggYXJlIHBlciBraW5kLCB3aGljaCBtdXN0IGJlIGxvdyBjYXJkaW5hbGl0eVxuICogLSBkYXRhIFwidmFyaWFibGVzXCIgZm9yIHJlZXN0YWJsaXNoaW5nIHRoZSBsZXhpY2FsIHNjb3BlLCBlc3BlY2lhbGx5IG9mXG4gKiAgIHNpbmdsZXRvbnNcbiAqIC0gbmFtZWQgbm9uLWJhZ2dhZ2UgY29sbGVjdGlvbnMgYXQgdGhlIGxlYXZlcyBvZiB0aGUgYmFnZ2FnZSB0cmVlLlxuICpcbiAqIFdoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgaGlnaCBjYXJkaW5hbGl0eSBhcmUgdGhlIGluc3RhbmNlcyBvZiB0aGUga2luZHMsIGFuZFxuICogdGhlIG1lbWJlcnMgb2YgdGhlIG5vbi1iYWdnZ2FnZSBjb2xsZWN0aW9ucy5cbiAqXG4gKiBUT0RPIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU4NzUgOiBJbXBsZW1lbnRcbiAqIGRldmVsb3BtZW50LXRpbWUgaW5zdHJ1bWVudGF0aW9uIHRvIGRldGVjdCB3aGVuIGBwcm92aWRlYCB2aW9sYXRlcyB0aGUgYWJvdmVcbiAqIHByZXNjcmlwdGlvbiwgYW5kIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgc2FtZSB2YXQgaW5jYXJuYXRpb24gd2l0aFxuICogdGhlIHNhbWUgYmFnZ2FnZSxrZXkgcGFpci5cbiAqL1xuXG4gICAgICAgY29uc3QgcHJvdmlkZSA9XG4gIC8qIFhYWCBjYXN0IGJlY2F1c2UgcHJvdmlkZUxhenkgaXMgYGFueWAgZHVlIHRvIGJyb2tlbiB0eXBlIGltcG9ydCovXG4gIC8qKlxuICogQHR5cGUgezxLLCBWPihcbiAqICAgYmFnZ2FnZTogQmFnZ2FnZSxcbiAqICAga2V5OiBLLFxuICogICBtYWtlVmFsdWU6IChrZXk6IEspID0+IFYsXG4gKiApID0+IFZ9XG4gKi8gICAocHJvdmlkZUxhenkpO1xuXG4vKiBUT0RPOiBGaW5kIGEgZ29vZCBob21lIGZvciB0aGlzIGZ1bmN0aW9uIHVzZWQgYnkgQGFnb3JpYy92YXQtZGF0YSBhbmQgdGVzdGluZyBjb2RlKi9cbi8qKiBAcGFyYW0ge1ZhdERhdGF9IFZhdERhdGEgKi8kaM2PX29uY2UucHJvdmlkZShwcm92aWRlKTtcbiAgICAgICBjb25zdCBtYWtlU3RvcmVVdGlscyA9IFZhdERhdGEgPT4ge1xuICBjb25zdCB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbiAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbiAgICBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG4gICAgbWFrZVNjYWxhckJpZ1NldFN0b3JlLFxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG4gICAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSxcbiAgfSA9IFZhdERhdGE7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVNYXBTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlKG5hbWUsIHsgZHVyYWJsZTogdHJ1ZSwgLi4ub3B0aW9ucyB9KSxcbiAgICApO1xuICBoYXJkZW4ocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAoYmFnZ2FnZSwgbmFtZSwgb3B0aW9ucyA9IHt9KSA9PlxuICAgIHByb3ZpZGUoYmFnZ2FnZSwgbmFtZSwgKCkgPT5cbiAgICAgIG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pLFxuICAgICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVTZXRTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1NldFN0b3JlKG5hbWUsIHsgZHVyYWJsZTogdHJ1ZSwgLi4ub3B0aW9ucyB9KSxcbiAgICApO1xuICBoYXJkZW4ocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUgPSAoYmFnZ2FnZSwgbmFtZSwgb3B0aW9ucyA9IHt9KSA9PlxuICAgIHByb3ZpZGUoYmFnZ2FnZSwgbmFtZSwgKCkgPT5cbiAgICAgIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pLFxuICAgICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgcHJvdmlkZUR1cmFibGVNYXBTdG9yZSxcbiAgICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbiAgICBwcm92aWRlRHVyYWJsZVNldFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTdG9yZVV0aWxzKG1ha2VTdG9yZVV0aWxzKTtcblxuY29uc3QgZ2xvYmFsU3RvcmVVdGlscyA9IG1ha2VTdG9yZVV0aWxzKFZhdERhdGFHbG9iYWwpO1xuICAgICAgIGNvbnN0IHtcbiAgcHJvdmlkZUR1cmFibGVNYXBTdG9yZSxcbiAgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsXG4gIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG4gIHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlLFxufSA9IGdsb2JhbFN0b3JlVXRpbHM7JGjNj19vbmNlLnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7JGjNj19vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTskaM2PX29uY2UucHJvdmlkZUR1cmFibGVTZXRTdG9yZShwcm92aWRlRHVyYWJsZVNldFN0b3JlKTskaM2PX29uY2UucHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVmF0RGF0YSI6WyJWYXREYXRhRXhwb3J0Il0sImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCJdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIl0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIl0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdLCJtYWtlS2luZEhhbmRsZSI6WyJtYWtlS2luZEhhbmRsZSJdLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiOlsicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXSwibWFrZVNjYWxhckJpZ01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSwiY2FuQmVEdXJhYmxlIjpbImNhbkJlRHVyYWJsZSJdLCJwaWNrRmFjZXQiOlsicGlja0ZhY2V0Il0sInBhcnRpYWxBc3NpZ24iOlsicGFydGlhbEFzc2lnbiJdLCJwcm92aWRlIjpbInByb3ZpZGUiXSwibWFrZVN0b3JlVXRpbHMiOlsibWFrZVN0b3JlVXRpbHMiXSwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAIfUrYUh4AAFIeAAAoAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY2xlYW5Qcm9wb3NhbC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJNQVhfS0VZV09SRF9MRU5HVEgiLCJhc3NlcnRLZXl3b3JkTmFtZSIsImNsZWFuS2V5d29yZHMiLCJjbGVhblByb3Bvc2FsIiwiY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCIsImNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQW1vdW50TWF0aCxnZXRBc3NldEtpbmQsb2JqZWN0TWFwLGFzc2VydEtleSxhc3NlcnRQYXR0ZXJuLGlzS2V5LG11c3RNYXRjaCxhc3NlcnQsRmFpbCxxLGFzc2VydFJlY29yZCxGdWxsUHJvcG9zYWxTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV0sW1wiZ2V0QXNzZXRLaW5kXCIsWyRozY9fYSA9PiAoZ2V0QXNzZXRLaW5kID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0S2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dLFtcImlzS2V5XCIsWyRozY9fYSA9PiAoaXNLZXkgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhc3NlcnRcIixbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkZ1bGxQcm9wb3NhbFNoYXBlXCIsWyRozY9fYSA9PiAoRnVsbFByb3Bvc2FsU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4gICAgICAgY29uc3QgTUFYX0tFWVdPUkRfTEVOR1RIID0gMTAwO1xuXG4vKipcbiAqIEBpbXBvcnQge0Ftb3VudEtleXdvcmRSZWNvcmQsIEV4aXRSdWxlLCBQcm9wb3NhbCwgUHJvcG9zYWxSZWNvcmR9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0dldEFzc2V0S2luZEJ5QnJhbmR9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnO1xuICovJGjNj19vbmNlLk1BWF9LRVlXT1JEX0xFTkdUSChNQVhfS0VZV09SRF9MRU5HVEgpO1xuXG5jb25zdCBmaXJzdENhcEFTQ0lJID0gL15bQS1aXVthLXpBLVowLTlfJF0qJC87XG5cbi8qIFdlIGFkb3B0IHNpbXBsZSByZXF1aXJlbWVudHMgb24ga2V5d29yZHMgc28gdGhhdCB0aGV5IGRvIG5vdCBhY2NpZGVudGFsbHkqL1xuLyogY29uZmxpY3Qgd2l0aCBleGlzdGluZyBwcm9wZXJ0eSBuYW1lcy4qL1xuLyogV2UgcmVxdWlyZSBrZXl3b3JkcyB0byBiZSBzdHJpbmdzLCBhc2NpaSBpZGVudGlmaWVycyBiZWdpbm5pbmcgd2l0aCBhbiovXG4vKiB1cHBlciBjYXNlIGxldHRlciwgYW5kIGRpc3RpbmN0IGZyb20gdGhlIHN0cmluZ2lmaWVkIGZvcm0gb2YgYW55IG51bWJlci4qL1xuLyoqL1xuLyogT2YgbnVtYmVycywgb25seSBOYU4gYW5kIEluZmluaXR5LCB3aGVuIHN0cmluZ2lmaWVkIHRvIGEgcHJvcGVydHkgbmFtZSwqL1xuLyogcHJvZHVjZSBhbiBhc2NpaSBpZGVudGlmaWVyIGJlZ2lubmluZyB3aXRoIGFuIHVwcGVyIGNhc2UgbGV0dGVyLiovXG4vKiBXaXRoIHRoaXMgcnVsZSwgYSBjb21wdXRlZCBpbmRleGluZyBleHByZXNzaW9uIGxpa2UgYGFbK2ldYCBjYW5ub3QqL1xuLyogbG9va3VwIGEga2V5d29yZC1uYW1lZCBwcm9wZXJ0eSBubyBtYXR0ZXIgd2hhdCBgaWAgaXMuKi9cbiAgICAgICBjb25zdCBhc3NlcnRLZXl3b3JkTmFtZSA9IGtleXdvcmQgPT4ge1xuICBhc3NlcnQudHlwZW9mKGtleXdvcmQsICdzdHJpbmcnKTtcbiAga2V5d29yZC5sZW5ndGggPD0gTUFYX0tFWVdPUkRfTEVOR1RIIHx8XG4gICAgRmFpbGBrZXl3b3JkICR7cShrZXl3b3JkKX0gZXhjZWVkZWQgbWF4aW11bSBsZW5ndGggJHtxKFxuICAgICAgTUFYX0tFWVdPUkRfTEVOR1RILFxuICAgICl9IGNoYXJhY3RlcnM7IGdvdCAke2tleXdvcmQubGVuZ3RofWA7XG4gIGZpcnN0Q2FwQVNDSUkudGVzdChrZXl3b3JkKSB8fFxuICAgIEZhaWxga2V5d29yZCAke3EoXG4gICAgICBrZXl3b3JkLFxuICAgICl9IG11c3QgYmUgYW4gYXNjaWkgaWRlbnRpZmllciBzdGFydGluZyB3aXRoIHVwcGVyIGNhc2UuYDtcbiAgKGtleXdvcmQgIT09ICdOYU4nICYmIGtleXdvcmQgIT09ICdJbmZpbml0eScpIHx8XG4gICAgRmFpbGBrZXl3b3JkICR7cShrZXl3b3JkKX0gbXVzdCBub3QgYmUgYSBudW1iZXIncyBuYW1lYDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHt7W25hbWU6IHN0cmluZ106IGFueX19IHVuY2xlYW5LZXl3b3JkUmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi8kaM2PX29uY2UuYXNzZXJ0S2V5d29yZE5hbWUoYXNzZXJ0S2V5d29yZE5hbWUpO1xuICAgICAgIGNvbnN0IGNsZWFuS2V5d29yZHMgPSB1bmNsZWFuS2V5d29yZFJlY29yZCA9PiB7XG4gIGhhcmRlbih1bmNsZWFuS2V5d29yZFJlY29yZCk7XG4gIGFzc2VydFJlY29yZCh1bmNsZWFuS2V5d29yZFJlY29yZCwgJ2tleXdvcmRSZWNvcmQnKTtcbiAgY29uc3Qga2V5d29yZHMgPSBvd25LZXlzKHVuY2xlYW5LZXl3b3JkUmVjb3JkKTtcblxuICAvKiBBc3NlcnQgYWxsIG5hbWVzIGFyZSBhc2NpaSBpZGVudGlmaWVycyBzdGFydGluZyB3aXRoKi9cbiAgLyogYW4gdXBwZXIgY2FzZSBsZXR0ZXIuKi9cbiAgZm9yIChjb25zdCBrZXl3b3JkIG9mIGtleXdvcmRzKSB7XG4gICAgYXNzZXJ0S2V5d29yZE5hbWUoa2V5d29yZCk7XG4gIH1cblxuICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKGtleXdvcmRzKTtcbn07JGjNj19vbmNlLmNsZWFuS2V5d29yZHMoY2xlYW5LZXl3b3Jkcyk7XG5cbiAgICAgICBjb25zdCBjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCA9IChcbiAgYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG4gIGdldEFzc2V0S2luZEJ5QnJhbmQsXG4pID0+IHtcbiAgY2xlYW5LZXl3b3JkcyhhbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCk7XG4gIC8qIEZJWE1FIG9iamVjdE1hcCBzaG91bGQgY29uc3RyYWluIHRoZSBtYXBwaW5nIGZ1bmN0aW9uIGJ5IHRoZSByZWNvcmQncyB0eXBlKi9cbiAgcmV0dXJuIG9iamVjdE1hcChhbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCwgYW1vdW50ID0+IHtcbiAgICAvKiBDaGVjayB0aGF0IGVhY2ggdmFsdWUgY2FuIGJlIGNvZXJjZWQgdXNpbmcgdGhlIEFtb3VudE1hdGgqL1xuICAgIC8qIGluZGljYXRlZCBieSBicmFuZC4gYEFtb3VudE1hdGguY29lcmNlYCB0aHJvd3MgaWYgY29lcmNpb24gZmFpbHMuKi9cbiAgICBpZiAoaXNLZXkoYW1vdW50KSkge1xuICAgICAgY29uc3QgYnJhbmRBc3NldEtpbmQgPSBnZXRBc3NldEtpbmRCeUJyYW5kKGFtb3VudC5icmFuZCk7XG4gICAgICBjb25zdCBhc3NldEtpbmQgPSBnZXRBc3NldEtpbmQoYW1vdW50KTtcbiAgICAgIC8qIFRPRE86IHJlcGxhY2UgdGhpcyBhc3NlcnRpb24gd2l0aCBhIGNoZWNrIG9mIHRoZSBhc3NldEtpbmQqL1xuICAgICAgLyogcHJvcGVydHkgb24gdGhlIGJyYW5kLCB3aGVuIHRoYXQgZXhpc3RzLiovXG4gICAgICBhc3NldEtpbmQgPT09IGJyYW5kQXNzZXRLaW5kIHx8XG4gICAgICAgIEZhaWxgVGhlIGFtb3VudCAke2Ftb3VudH0gZGlkIG5vdCBoYXZlIHRoZSBhc3NldEtpbmQgb2YgdGhlIGJyYW5kICR7YnJhbmRBc3NldEtpbmR9YDtcbiAgICAgIHJldHVybiBBbW91bnRNYXRoLmNvZXJjZShhbW91bnQuYnJhbmQsIGFtb3VudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydFBhdHRlcm4oYW1vdW50KTtcbiAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmRcbiAqIEBwYXJhbSB7Kn0gZ2V0QXNzZXRLaW5kQnlCcmFuZFxuICogQHJldHVybnMge0Ftb3VudEtleXdvcmRSZWNvcmR9XG4gKi8kaM2PX29uY2UuY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQoY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQpO1xuICAgICAgIGNvbnN0IGNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQgPSAoXG4gIGFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkLFxuICBnZXRBc3NldEtpbmRCeUJyYW5kLFxuKSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkKFxuICAgIGFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkLFxuICAgIGdldEFzc2V0S2luZEJ5QnJhbmQsXG4gICk7XG4gIGFzc2VydEtleShyZXN1bHQpO1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNoZWNrZWQgY2FzdCovXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEp1c3QgY2hlY2tzIHJlc2lkdWFsIGlzc3VlcyBhZnRlciBtYXRjaGluZyBQcm9wb3NhbFNoYXBlLlxuICogT25seSBrbm93biByZXNpZHVhbCBpc3N1ZSBpcyB2ZXJpZnlpbmcgdGhhdCBpdCBvbmx5IGhhcyBvbmUgb2YgdGhlXG4gKiBvcHRpb25hbCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqLyRozY9fb25jZS5jb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkKGNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQpO1xuY29uc3QgYXNzZXJ0RXhpdCA9IGV4aXQgPT5cbiAgb3duS2V5cyhleGl0KS5sZW5ndGggPT09IDEgfHwgRmFpbGBleGl0ICR7ZXhpdH0gc2hvdWxkIG9ubHkgaGF2ZSBvbmUga2V5YDtcblxuLyoqXG4gKiBjaGVjayB0aGF0IGtleXdvcmQgaXMgbm90IGluIGJvdGggJ3dhbnQnIGFuZCAnZ2l2ZScuXG4gKlxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZFtcIndhbnRcIl19IHdhbnRcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmRbXCJnaXZlXCJdfSBnaXZlXG4gKi9cbmNvbnN0IGFzc2VydEtleXdvcmROb3RJbkJvdGggPSAod2FudCwgZ2l2ZSkgPT4ge1xuICBjb25zdCB3YW50S2V5d29yZFNldCA9IG5ldyBTZXQob3duS2V5cyh3YW50KSk7XG4gIGNvbnN0IGdpdmVLZXl3b3JkcyA9IG93bktleXMoZ2l2ZSk7XG5cbiAgZm9yIChjb25zdCBrZXl3b3JkIG9mIGdpdmVLZXl3b3Jkcykge1xuICAgICF3YW50S2V5d29yZFNldC5oYXMoa2V5d29yZCkgfHxcbiAgICAgIEZhaWxgYSBrZXl3b3JkIGNhbm5vdCBiZSBpbiBib3RoICd3YW50JyBhbmQgJ2dpdmUnYDtcbiAgfVxufTtcblxuLyoqXG4gKiBjbGVhblByb3Bvc2FsIGNoZWNrcyB0aGUga2V5cyBhbmQgdmFsdWVzIG9mIHRoZSBwcm9wb3NhbCwgaW5jbHVkaW5nXG4gKiB0aGUga2V5cyBhbmQgdmFsdWVzIG9mIHRoZSBpbnRlcm5hbCBvYmplY3RzLiBUaGUgcHJvcG9zYWwgbWF5IGhhdmVcbiAqIHRoZSBmb2xsb3dpbmcga2V5czogYGdpdmVgLCBgd2FudGAsIGFuZCBgZXhpdGAuIFRoZXNlIGtleXMgbWF5IGJlXG4gKiBvbWl0dGVkIGluIHRoZSBgcHJvcG9zYWxgIGFyZ3VtZW50IHBhc3NlZCB0byBjbGVhblByb3Bvc2FsLCBidXRcbiAqIGFueXRoaW5nIG90aGVyIHRoYW4gdGhlc2Uga2V5cyBpcyBub3QgYWxsb3dlZC4gVGhlIHZhbHVlcyBvZiBgZ2l2ZWBcbiAqIGFuZCBgd2FudGAgbXVzdCBiZSBcImFtb3VudEtleXdvcmRSZWNvcmRzXCIsIG1lYW5pbmcgdGhhdCB0aGUga2V5c1xuICogbXVzdCBiZSBrZXl3b3JkcyBhbmQgdGhlIHZhbHVlcyBtdXN0IGJlIGFtb3VudHMuIFRoZSB2YWx1ZSBvZlxuICogYGV4aXRgLCBpZiBwcmVzZW50LCBtdXN0IGJlIGEgcmVjb3JkIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOlxuICogYHsgd2FpdmVkOiBudWxsIH1gIGB7IG9uRGVtYW5kOiBudWxsIH1gIGB7IGFmdGVyRGVhZGxpbmU6IHsgdGltZXJcbiAqIDpUaW1lciwgZGVhZGxpbmUgOmJpZ2ludCB9IH1cbiAqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsfSBwcm9wb3NhbFxuICogQHBhcmFtIHtHZXRBc3NldEtpbmRCeUJyYW5kfSBnZXRBc3NldEtpbmRCeUJyYW5kXG4gKiBAcmV0dXJucyB7UHJvcG9zYWxSZWNvcmR9XG4gKi9cbiAgICAgICBjb25zdCBjbGVhblByb3Bvc2FsID0gKHByb3Bvc2FsLCBnZXRBc3NldEtpbmRCeUJyYW5kKSA9PiB7XG4gIGFzc2VydFJlY29yZChwcm9wb3NhbCwgJ3Byb3Bvc2FsJyk7XG4gIC8qIFdlIGZpbGwgaW4gdGhlIGRlZmF1bHQgdmFsdWVzIGlmIHRoZSBrZXlzIGFyZSBhYnNlbnQgb3IgdW5kZWZpbmVkLiovXG4gIGNvbnN0IHtcbiAgICB3YW50ID0gaGFyZGVuKHt9KSxcbiAgICBnaXZlID0gaGFyZGVuKHt9KSxcbiAgICBleGl0ID0gaGFyZGVuKHsgb25EZW1hbmQ6IG51bGwgfSksXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcG9zYWw7XG4gIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgRmFpbGAke3Byb3Bvc2FsfSAtIE11c3Qgb25seSBoYXZlIHdhbnQ6LCBnaXZlOiwgZXhpdDogcHJvcGVydGllczogJHtyZXN0fWA7XG5cbiAgY29uc3QgY2xlYW5lZFdhbnQgPSBjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZChcbiAgICB3YW50LFxuICAgIGdldEFzc2V0S2luZEJ5QnJhbmQsXG4gICk7XG4gIGNvbnN0IGNsZWFuZWRHaXZlID0gY29lcmNlQW1vdW50S2V5d29yZFJlY29yZChnaXZlLCBnZXRBc3NldEtpbmRCeUJyYW5kKTtcblxuICBjb25zdCBjbGVhbmVkUHJvcG9zYWwgPSBoYXJkZW4oe1xuICAgIHdhbnQ6IGNsZWFuZWRXYW50LFxuICAgIGdpdmU6IGNsZWFuZWRHaXZlLFxuICAgIGV4aXQsXG4gIH0pO1xuICBtdXN0TWF0Y2goY2xlYW5lZFByb3Bvc2FsLCBGdWxsUHJvcG9zYWxTaGFwZSwgJ3Byb3Bvc2FsJyk7XG4gIGFzc2VydEV4aXQoZXhpdCk7XG4gIGFzc2VydEtleXdvcmROb3RJbkJvdGgoY2xlYW5lZFdhbnQsIGNsZWFuZWRHaXZlKTtcbiAgcmV0dXJuIGNsZWFuZWRQcm9wb3NhbDtcbn07JGjNj19vbmNlLmNsZWFuUHJvcG9zYWwoY2xlYW5Qcm9wb3NhbCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJNQVhfS0VZV09SRF9MRU5HVEgiOlsiTUFYX0tFWVdPUkRfTEVOR1RIIl0sImFzc2VydEtleXdvcmROYW1lIjpbImFzc2VydEtleXdvcmROYW1lIl0sImNsZWFuS2V5d29yZHMiOlsiY2xlYW5LZXl3b3JkcyJdLCJjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCI6WyJjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCJdLCJjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkIjpbImNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQiXSwiY2xlYW5Qcm9wb3NhbCI6WyJjbGVhblByb3Bvc2FsIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKGWQ5mJEQAAiREAADQAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCJdLCJleHBvcnRzIjpbImlzT2ZmZXJTYWZlIiwic2F0aXNmaWVzV2FudCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEFtb3VudE1hdGg7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNPZmZlclNhZmUsJ25hbWUnLHt2YWx1ZTpcImlzT2ZmZXJTYWZlXCJ9KTskaM2PX29uY2UuaXNPZmZlclNhZmUoaXNPZmZlclNhZmUpO1xuXG4vKipcbiAqIEBpbXBvcnQge0Ftb3VudEtleXdvcmRSZWNvcmQsIFByb3Bvc2FsUmVjb3JkfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKi9cblxuLyoqXG4gKiBIZWxwZXIgdG8gcGVyZm9ybSBzYXRpc2ZpZXNXYW50IGFuZCBzYXRpc2ZpZXNHaXZlLiBJc1xuICogYWxsb2NhdGlvbkFtb3VudCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcmVxdWlyZWRBbW91bnQgZm9yIGV2ZXJ5XG4gKiBrZXl3b3JkIG9mIGdpdmVPcldhbnQ/XG4gKlxuICogVG8gcHJlcGFyZSBmb3IgbXVsdGlwbGVzLCBzYXRpc2ZpZXNXYW50IGFuZCBzYXRpc2ZpZXNHaXZlIHJldHVybiAwIG9yIDEuXG4gKiBpc09mZmVyU2FmZSB3aWxsIHN0aWxsIGJlIGJvb2xlYW4uIFdoZW4gd2UgaGF2ZSBNdWx0aXBsZXMsIHNhdGlzZmllc1dhbnQgYW5kXG4gKiBzYXRpc2ZpZXNHaXZlIHdpbGwgdGVsbCBob3cgbWFueSB0aW1lcyB0aGUgb2ZmZXIgd2FzIG1hdGNoZWQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBnaXZlT3JXYW50XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb25cbiAqIEByZXR1cm5zIHswfDF9XG4gKi9cbmNvbnN0IHNhdGlzZmllc0ludGVybmFsID0gKGdpdmVPcldhbnQgPSB7fSwgYWxsb2NhdGlvbikgPT4ge1xuICBjb25zdCBpc0dURUJ5S2V5d29yZCA9IChba2V5d29yZCwgcmVxdWlyZWRBbW91bnRdKSA9PiB7XG4gICAgLyogSWYgdGhlcmUgaXMgbm8gYWxsb2NhdGlvbiBmb3IgYSBrZXl3b3JkLCB3ZSBrbm93IHRoZSBnaXZlT3JXYW50Ki9cbiAgICAvKiBpcyBub3Qgc2F0aXNmaWVkIHdpdGhvdXQgY2hlY2tpbmcgZnVydGhlci4qL1xuICAgIGlmIChhbGxvY2F0aW9uW2tleXdvcmRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBhbGxvY2F0aW9uQW1vdW50ID0gYWxsb2NhdGlvbltrZXl3b3JkXTtcbiAgICByZXR1cm4gQW1vdW50TWF0aC5pc0dURShhbGxvY2F0aW9uQW1vdW50LCByZXF1aXJlZEFtb3VudCkgPyAxIDogMDtcbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGdpdmVPcldhbnQpLmV2ZXJ5KGlzR1RFQnlLZXl3b3JkKSA/IDEgOiAwO1xufTtcblxuLyoqXG4gKiBGb3IgdGhpcyBhbGxvY2F0aW9uIHRvIHNhdGlzZnkgd2hhdCB0aGUgdXNlciB3YW50ZWQsIHRoZWlyXG4gKiBhbGxvY2F0ZWQgYW1vdW50cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBwcm9wb3NhbC53YW50LlxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb24gLSBhIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy4gVGhlc2UgYW1vdW50cyBhcmUgdGhlIHJlYWxsb2NhdGlvblxuICogdG8gYmUgZ2l2ZW4gdG8gYSB1c2VyLlxuICovXG5jb25zdCBzYXRpc2ZpZXNXYW50ID0gKHByb3Bvc2FsLCBhbGxvY2F0aW9uKSA9PlxuICBzYXRpc2ZpZXNJbnRlcm5hbChwcm9wb3NhbC53YW50LCBhbGxvY2F0aW9uKTtcblxuLyoqXG4gKiBGb3IgdGhpcyBhbGxvY2F0aW9uIHRvIGNvdW50IGFzIGEgZnVsbCByZWZ1bmQsIHRoZSBhbGxvY2F0ZWRcbiAqIGFtb3VudHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gd2hhdCB3YXMgb3JpZ2luYWxseVxuICogb2ZmZXJlZCAocHJvcG9zYWwuZ2l2ZSkuXG4gKlxuICogQHBhcmFtICB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0gIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uIC0gYSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICogYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuIFRoZXNlIGFtb3VudHMgYXJlIHRoZSByZWFsbG9jYXRpb25cbiAqIHRvIGJlIGdpdmVuIHRvIGEgdXNlci5cbiAqLyRozY9fb25jZS5zYXRpc2ZpZXNXYW50KHNhdGlzZmllc1dhbnQpO1xuY29uc3Qgc2F0aXNmaWVzR2l2ZSA9IChwcm9wb3NhbCwgYWxsb2NhdGlvbikgPT5cbiAgc2F0aXNmaWVzSW50ZXJuYWwocHJvcG9zYWwuZ2l2ZSwgYWxsb2NhdGlvbik7XG5cbi8qKlxuICogYGlzT2ZmZXJTYWZlYCBjaGVja3Mgb2ZmZXIgc2FmZXR5IGZvciBhIHNpbmdsZSBvZmZlci5cbiAqXG4gKiBOb3RlOiBUaGlzIGltcGxlbWVudGF0aW9uIGNoZWNrcyB3aGV0aGVyIHdlIGZ1bGx5IHNhdGlzZnlcbiAqIGBwcm9wb3NhbC5naXZlYCAoZ2l2aW5nIGEgcmVmdW5kKSBvciB3aGV0aGVyIHdlIGZ1bGx5IHNhdGlzZnlcbiAqIGBwcm9wb3NhbC53YW50YC4gQm90aCBjYW4gYmUgZnVsbHkgc2F0aXNmaWVkLlxuICpcbiAqIEBwYXJhbSAge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbCAtIHRoZSBydWxlcyB0aGF0IGFjY29tcGFuaWVkIHRoZVxuICogZXNjcm93IG9mIHBheW1lbnRzIHRoYXQgZGljdGF0ZSB3aGF0IHRoZSB1c2VyIGV4cGVjdGVkIHRvIGdldCBiYWNrXG4gKiBmcm9tIFpvZS4gQSBwcm9wb3NhbCBpcyBhIHJlY29yZCB3aXRoIGtleXMgYGdpdmVgLCBgd2FudGAsIGFuZFxuICogYGV4aXRgLiBgZ2l2ZWAgYW5kIGB3YW50YCBhcmUgcmVjb3JkcyB3aXRoIGtleXdvcmRzIGFzIGtleXMgYW5kXG4gKiBhbW91bnRzIGFzIHZhbHVlcy4gVGhlIHByb3Bvc2FsIGlzIGEgdXNlcidzIHVuZGVyc3RhbmRpbmcgb2YgdGhlXG4gKiBjb250cmFjdCB0aGF0IHRoZXkgYXJlIGVudGVyaW5nIHdoZW4gdGhleSBtYWtlIGFuIG9mZmVyLlxuICogQHBhcmFtICB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvbiAtIGEgcmVjb3JkIHdpdGgga2V5d29yZHNcbiAqIGFzIGtleXMgYW5kIGFtb3VudHMgYXMgdmFsdWVzLiBUaGVzZSBhbW91bnRzIGFyZSB0aGUgcmVhbGxvY2F0aW9uXG4gKiB0byBiZSBnaXZlbiB0byBhIHVzZXIuXG4gKi9cbmZ1bmN0aW9uIGlzT2ZmZXJTYWZlKHByb3Bvc2FsLCBhbGxvY2F0aW9uKSB7XG4gIHJldHVybiAoXG4gICAgc2F0aXNmaWVzR2l2ZShwcm9wb3NhbCwgYWxsb2NhdGlvbikgPiAwIHx8XG4gICAgc2F0aXNmaWVzV2FudChwcm9wb3NhbCwgYWxsb2NhdGlvbikgPiAwXG4gICk7XG59XG5cbmhhcmRlbihpc09mZmVyU2FmZSk7XG5oYXJkZW4oc2F0aXNmaWVzV2FudCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzYXRpc2ZpZXNXYW50IjpbInNhdGlzZmllc1dhbnQiXSwiaXNPZmZlclNhZmUiOlsiaXNPZmZlclNhZmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAazhNcmcTAABnEwAAOQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiLi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIlRyYW5zZmVyUGFydFNoYXBlIiwiYXRvbWljUmVhcnJhbmdlIiwiYXRvbWljVHJhbnNmZXIiLCJmcm9tT25seSIsInRvT25seSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFNlYXRTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiLi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlID0gJGjNj19hKV1dLFtcIlNlYXRTaGFwZVwiLFskaM2PX2EgPT4gKFNlYXRTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoqXG4gKiBAaW1wb3J0IHtBbW91bnRLZXl3b3JkUmVjb3JkLCBUcmFuc2ZlclBhcnQsIFpDRiwgWkNGU2VhdH0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICovXG5cbiAgICAgICBjb25zdCBUcmFuc2ZlclBhcnRTaGFwZSA9IE0uc3BsaXRBcnJheShcbiAgaGFyZGVuKFtNLm9wdChTZWF0U2hhcGUpLCBNLm9wdChTZWF0U2hhcGUpLCBNLm9wdChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpXSksXG4gIGhhcmRlbihbTS5vcHQoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKV0pLFxuKTtcblxuLyoqXG4gKiBBc2tzIFpvZSAodmlhIHpjZikgdG8gcmVhcnJhbmdlIHRoZSBhbGxvY2F0aW9ucyBhbW9uZyB0aGUgc2VhdHNcbiAqIG1lbnRpb25lZC4gVGhpcyBpcyBhIHNldCBvZiBjaGFuZ2VzIHRvIGFsbG9jYXRpb25zIHRoYXQgbXVzdCBzYXRpc2Z5XG4gKiBzZXZlcmFsIGNvbnN0cmFpbnRzLiBJZiB0aGVzZSBjb25zdHJhaW50cyBhcmUgYWxsIG1ldCwgdGhlbiB0aGVcbiAqIHJlYWxsb2NhdGlvbiBoYXBwZW5zIGF0b21pY2FsbHkuIE90aGVyd2lzZSBpdCBkb2VzIG5vdCBoYXBwZW5cbiAqIGF0IGFsbC5cbiAqXG4gKiBUaGUgY29uZGl0aW9uc1xuICogICAgKiBBbGwgdGhlIG1lbnRpb25lZCBzZWF0cyBhcmUgc3RpbGwgbGl2ZSAtLSBlbmZvcmNlZCBieSBaQ0YuXG4gKiAgICAqIE5vIG91dHN0YW5kaW5nIHN0YWdpbmdzIGZvciBhbnkgb2YgdGhlIG1lbnRpb25lZCBzZWF0cy5cbiAqICAgICAgU3RhZ2luZ3Mgbm93IGRlcHJlY2F0ZWQgaW4gZmF2b3Igb3IgYXRvbWljUmVhcnJhbmdlLiBUb1xuICogICAgICBwcmV2ZW50IGNvbmZ1c2lvbiwgZm9yIGVhY2ggcmVhbGxvY2F0aW9uLCBpdCBjYW4gb25seSBiZVxuICogICAgICBleHByZXNzZWQgaW4gdGhlIG9sZCB3YXkgb3IgdGhlIG5ldyB3YXksIGJ1dCBub3QgYSBtaXh0dXJlLlxuICogICAgKiBPZmZlciBzYWZldHkgLS0gZW5mb3JjZWQgYnkgWkNGLlxuICogICAgKiBPdmVyYWxsIGNvbnNlcnZhdGlvbiAtLSBlbmZvcmNlZCBieSBaQ0YuXG4gKiAgICAqIFRoZSBvdmVyYWxsIHRyYW5zZmVyIGlzIGV4cHJlc3NlZCBhcyBhbiBhcnJheSBvZiBgVHJhbnNmZXJQYXJ0YC5cbiAqICAgICAgRWFjaCBpbmRpdmlkdWFsIGBUcmFuc2ZlclBhcnRgIGlzIG9uZSBvZlxuICogICAgICAgLSBBIHRyYW5zZmVyIGZyb20gYSBgZnJvbVNlYXRgIHRvIGEgYHRvU2VhdGAuXG4gKiAgICAgICAgIFRoaXMgaXMgbm90IG5lZWRlZCBmb3IgWm9lJ3Mgc2FmZXR5LCBhcyBab2UgZG9lc1xuIGl0cyBvd24gb3ZlcmFsbCBjb25zZXJ2YXRpb24gY2hlY2suIFJhdGhlciwgaXQgaGVscHMgY2F0Y2hcbiBhbmQgZGlhZ25vc2UgY29udHJhY3QgYnVncyBlYXJsaWVyLlxuICogICAgICAgLSBBIHRha2luZyBmcm9tIGEgYGZyb21TZWF0YCdzIGFsbG9jYXRpb24uIFNlZSB0aGUgYGZyb21Pbmx5YFxuIGhlbHBlci5cbiAtIEEgZ2l2aW5nIGludG8gYSBgdG9TZWF0YCdzIGFsbG9jYXRpb24uIFNlZSB0aGUgYHRvT25seWBcbiBoZWxwZXIuXG4gKlxuICogVE9ETyg2Njc5KSBSZWZhY3RvciBgYXRvbWljUmVhcnJhbmdlYGZyb20gYmVpbmcgYSBoZWxwZXIgaW50byBiZWluZ1xuICogemNmJ3MgcmVwbGFjZW1lbnQgZm9yIHJlYWxsb2NhdGUuIEl0IHdhcyBtYWRlIGEgaGVscGVyIGR1cmluZ1xuICogdGhlIHRyYW5zaXRpb24sIHRvIGF2b2lkIGludGVyZmVyZW5jZSB3aXRoIHByb2dyZXNzIG9uIFpvZSBkdXJhYmlsaXR5LlxuICpcbiAqIFNlZSB0aGUgaGVscGVycyBiZWxvdywgYGZyb21Pbmx5YCwgYHRvT25seWAsIGFuZCBgYXRvbWljVHJhbnNmZXJgLFxuICogd2hpY2ggd2lsbCByZW1haW4gaGVscGVycy4gVGhlc2UgaGVscGVyIGFyZSBmb3IgY29udmVuaWVuY2VcbiAqIGluIGV4cHJlc3NpbmcgYXRvbWljIHJlYXJyYW5nZW1lbnRzIGNsZWFybHkuXG4gKlxuICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB6Y2YgYnVpbHRpbiBpbnN0ZWFkXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtUcmFuc2ZlclBhcnRbXX0gdHJhbnNmZXJzXG4gKi8kaM2PX29uY2UuVHJhbnNmZXJQYXJ0U2hhcGUoVHJhbnNmZXJQYXJ0U2hhcGUpO1xuICAgICAgIGNvbnN0IGF0b21pY1JlYXJyYW5nZSA9ICh6Y2YsIHRyYW5zZmVycykgPT4ge1xuICB6Y2YuYXRvbWljUmVhcnJhbmdlKHRyYW5zZmVycyk7XG59O1xuXG4vKipcbiAqIFNvbWV0aW1lcyBhIFRyYW5zZmVyUGFydCBpbiBhbiBhdG9taWNSZWFycmFuZ2Ugb25seSBleHByZXNzZXMgd2hhdCBhbW91bnRzXG4gKiBzaG91bGQgYmUgdGFrZW4gZnJvbSBhIHNlYXQsIGxlYXZpbmcgaXQgdG8gb3RoZXIgVHJhbnNmZXJQYXJ0IG9mIHRoZVxuICogc2FtZSBhdG9taWNSZWFycmFuZ2UgdG8gYmFsYW5jZSBpdCBvdXQuIEZvciB0aGlzIGNhc2UsIHRoZVxuICogYFtmcm9tU2VhdCwgdW5kZWZpbmVkLCBmcm9tQW1vdW50c11gIGZvcm0gaXMgbW9yZSBjbGVhcmx5IGV4cHJlc3NlZCBhc1xuICogYGZyb21Pbmx5KGZyb21TZWF0LCBmcm9tQW1vdW50cylgLiBVbmxpa2UgVHJhbnNmZXJQYXJ0LCBib3RoIGFyZ3VtZW50cyB0b1xuICogYGZyb21Pbmx5YCBhcmUgbm9uLW9wdGlvbmFsLCBhcyBvdGhlcndpc2UgaXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UuXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBmcm9tU2VhdFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBmcm9tQW1vdW50c1xuICogQHJldHVybnMge1RyYW5zZmVyUGFydH1cbiAqLyRozY9fb25jZS5hdG9taWNSZWFycmFuZ2UoYXRvbWljUmVhcnJhbmdlKTtcbiAgICAgICBjb25zdCBmcm9tT25seSA9IChmcm9tU2VhdCwgZnJvbUFtb3VudHMpID0+XG4gIGhhcmRlbihbZnJvbVNlYXQsIHVuZGVmaW5lZCwgZnJvbUFtb3VudHNdKTtcblxuLyoqXG4gKiBTb21ldGltZXMgYSBUcmFuc2ZlclBhcnQgaW4gYW4gYXRvbWljUmVhcnJhbmdlIG9ubHkgZXhwcmVzc2VzIHdoYXQgYW1vdW50c1xuICogc2hvdWxkIGJlIGdpdmVuIHRvIGEgc2VhdCwgbGVhdmluZyBpdCB0byBvdGhlciBUcmFuc2ZlclBhcnQgb2YgdGhlXG4gKiBzYW1lIGF0b21pY1JlYXJyYW5nZSB0byBiYWxhbmNlIGl0IG91dC4gRm9yIHRoaXMgY2FzZSwgdGhlXG4gKiBgW3VuZGVmaW5lZCwgdG9TZWF0LCB1bmRlZmluZWQsIHRvQW1vdW50c11gIGZvcm0gaXMgbW9yZSBjbGVhcmx5IGV4cHJlc3NlZCBhc1xuICogYHRvT25seSh0b1NlYXQsIHRvQW1vdW50cylgLiBVbmxpa2UgVHJhbnNmZXJQYXJ0LCBib3RoIGFyZ3VtZW50cyB0b1xuICogYHRvT25seWAgYXJlIG5vbi1vcHRpb25hbCwgYXMgb3RoZXJ3aXNlIGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gdG9TZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IHRvQW1vdW50c1xuICogQHJldHVybnMge1RyYW5zZmVyUGFydH1cbiAqLyRozY9fb25jZS5mcm9tT25seShmcm9tT25seSk7XG4gICAgICAgY29uc3QgdG9Pbmx5ID0gKHRvU2VhdCwgdG9BbW91bnRzKSA9PlxuICBoYXJkZW4oW3VuZGVmaW5lZCwgdG9TZWF0LCB1bmRlZmluZWQsIHRvQW1vdW50c10pO1xuXG4vKipcbiAqIFNwZWNpYWwgY2FzZSBvZiBhdG9taWNSZWFycmFuZ2UgZm9yIGEgc2luZ2xlIG9uZS13YXkgdHJhbnNmZXJcbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IFtmcm9tU2VhdF1cbiAqIEBwYXJhbSB7WkNGU2VhdH0gW3RvU2VhdF1cbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gW2Zyb21BbW91bnRzXVxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBbdG9BbW91bnRzXVxuICovJGjNj19vbmNlLnRvT25seSh0b09ubHkpO1xuICAgICAgIGNvbnN0IGF0b21pY1RyYW5zZmVyID0gKFxuICB6Y2YsXG4gIGZyb21TZWF0ID0gdW5kZWZpbmVkLFxuICB0b1NlYXQgPSB1bmRlZmluZWQsXG4gIGZyb21BbW91bnRzID0gdW5kZWZpbmVkLFxuICB0b0Ftb3VudHMgPSB1bmRlZmluZWQsXG4pID0+IHpjZi5hdG9taWNSZWFycmFuZ2UoaGFyZGVuKFtbZnJvbVNlYXQsIHRvU2VhdCwgZnJvbUFtb3VudHMsIHRvQW1vdW50c11dKSk7JGjNj19vbmNlLmF0b21pY1RyYW5zZmVyKGF0b21pY1RyYW5zZmVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRyYW5zZmVyUGFydFNoYXBlIjpbIlRyYW5zZmVyUGFydFNoYXBlIl0sImF0b21pY1JlYXJyYW5nZSI6WyJhdG9taWNSZWFycmFuZ2UiXSwiZnJvbU9ubHkiOlsiZnJvbU9ubHkiXSwidG9Pbmx5IjpbInRvT25seSJdLCJhdG9taWNUcmFuc2ZlciI6WyJhdG9taWNUcmFuc2ZlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABCPrHJjh0AAI4dAAA4AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwL3NyYy9zYWZlTWF0aC5qcyIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbImNhbGNMaXFWYWx1ZVRvTWludCIsImNhbGNTZWNvbmRhcnlSZXF1aXJlZCIsImNhbGNWYWx1ZVRvUmVtb3ZlIiwiZ2V0SW5wdXRQcmljZSIsImdldE91dHB1dFByaWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbmF0U2FmZU1hdGgsRmFpbCxOYXQ7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2VydHAvc3JjL3NhZmVNYXRoLmpzXCIsIFtbXCJuYXRTYWZlTWF0aFwiLFskaM2PX2EgPT4gKG5hdFNhZmVNYXRoID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge05hdFZhbHVlfSBmcm9tICdAYWdvcmljL2VydHAnO1xuICovXG5cbmNvbnN0IHsgc3VidHJhY3QsIGFkZCwgbXVsdGlwbHksIGZsb29yRGl2aWRlIH0gPSBuYXRTYWZlTWF0aDtcblxuY29uc3QgQkFTSVNfUE9JTlRTID0gMTAwMDBuOyAvKiBUT0RPIGNoYW5nZSB0byAxMF8wMDBuIG9uY2UgdG9vbGluZyBjb3Blcy4qL1xuXG4vKipcbiAqIENhbGN1bGF0aW9ucyBmb3IgY29uc3RhbnQgcHJvZHVjdCBtYXJrZXRzIGxpa2UgVW5pc3dhcC5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ydW50aW1ldmVyaWZpY2F0aW9uL3ZlcmlmaWVkLXNtYXJ0LWNvbnRyYWN0cy9ibG9iL3VuaXN3YXAvdW5pc3dhcC94LXktay5wZGZcbiAqL1xuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgY2FsY3VsYXRpbmcgaG93IG11Y2ggc2hvdWxkIGJlIGdpdmVuXG4gKiBiYWNrIHRvIHRoZSB1c2VyIGluIGV4Y2hhbmdlIGZvciB3aGF0IHRoZXkgc2VudCBpbi4gUmV1c2VkIGluXG4gKiBzZXZlcmFsIGRpZmZlcmVudCBwbGFjZXMsIGluY2x1ZGluZyB0byBjaGVjayB3aGV0aGVyIGFuIG9mZmVyXG4gKiBpcyB2YWxpZCwgZ2V0dGluZyB0aGUgY3VycmVudCBwcmljZSBmb3IgYW4gYXNzZXQgb24gdXNlclxuICogcmVxdWVzdCwgYW5kIHRvIGRvIHRoZSBhY3R1YWwgcmVhbGxvY2F0aW9uIGFmdGVyIGFuIG9mZmVyIGhhc1xuICogYmVlbiBtYWRlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBpbnB1dFZhbHVlIC0gdGhlIHZhbHVlIG9mIHRoZSBhc3NldCBzZW50XG4gKiBpbiB0byBiZSBzd2FwcGVkXG4gKiBAcGFyYW0ge2FueX0gaW5wdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGtpbmQgb2YgYXNzZXQgc2VudCBpblxuICogQHBhcmFtIHthbnl9IG91dHB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUga2luZCBvZiBhc3NldCB0byBiZSBzZW50IG91dFxuICogQHBhcmFtIHtiaWdpbnR9IFtmZWVCYXNpc1BvaW50c10gLSB0aGUgZmVlIHRha2VuIGluXG4gKiBiYXNpcyBwb2ludHMuIFRoZSBkZWZhdWx0IGlzIDAuMyUgb3IgMzAgYmFzaXMgcG9pbnRzLiBUaGUgZmVlXG4gKiBpcyB0YWtlbiBmcm9tIGlucHV0VmFsdWVcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX0gb3V0cHV0VmFsdWUgLSB0aGUgY3VycmVudCBwcmljZSwgaW4gdmFsdWUgZm9ybVxuICovXG4gICAgICAgY29uc3QgZ2V0SW5wdXRQcmljZSA9IChcbiAgaW5wdXRWYWx1ZSxcbiAgaW5wdXRSZXNlcnZlLFxuICBvdXRwdXRSZXNlcnZlLFxuICBmZWVCYXNpc1BvaW50cyA9IDMwbixcbikgPT4ge1xuICBpbnB1dFZhbHVlID0gTmF0KGlucHV0VmFsdWUpO1xuICBpbnB1dFJlc2VydmUgPSBOYXQoaW5wdXRSZXNlcnZlKTtcbiAgb3V0cHV0UmVzZXJ2ZSA9IE5hdChvdXRwdXRSZXNlcnZlKTtcbiAgaW5wdXRWYWx1ZSA+IDBuIHx8IEZhaWxgaW5wdXRWYWx1ZSAke2lucHV0VmFsdWV9IG11c3QgYmUgcG9zaXRpdmVgO1xuICBpbnB1dFJlc2VydmUgPiAwbiB8fCBGYWlsYGlucHV0UmVzZXJ2ZSAke2lucHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG4gIG91dHB1dFJlc2VydmUgPiAwbiB8fCBGYWlsYG91dHB1dFJlc2VydmUgJHtvdXRwdXRSZXNlcnZlfSBtdXN0IGJlIHBvc2l0aXZlYDtcblxuICBjb25zdCBvbmVNaW51c0ZlZVNjYWxlZCA9IHN1YnRyYWN0KEJBU0lTX1BPSU5UUywgZmVlQmFzaXNQb2ludHMpO1xuICBjb25zdCBpbnB1dFdpdGhGZWUgPSBtdWx0aXBseShpbnB1dFZhbHVlLCBvbmVNaW51c0ZlZVNjYWxlZCk7XG4gIGNvbnN0IG51bWVyYXRvciA9IG11bHRpcGx5KGlucHV0V2l0aEZlZSwgb3V0cHV0UmVzZXJ2ZSk7XG4gIGNvbnN0IGRlbm9taW5hdG9yID0gYWRkKG11bHRpcGx5KGlucHV0UmVzZXJ2ZSwgQkFTSVNfUE9JTlRTKSwgaW5wdXRXaXRoRmVlKTtcbiAgcmV0dXJuIGZsb29yRGl2aWRlKG51bWVyYXRvciwgZGVub21pbmF0b3IpO1xufTtcblxuLyoqXG4gKiBDb250YWlucyB0aGUgbG9naWMgZm9yIGNhbGN1bGF0aW5nIGhvdyBtdWNoIHNob3VsZCBiZSB0YWtlblxuICogZnJvbSB0aGUgdXNlciBpbiBleGNoYW5nZSBmb3Igd2hhdCB0aGV5IHdhbnQgdG8gb2J0YWluLiBSZXVzZWQgaW5cbiAqIHNldmVyYWwgZGlmZmVyZW50IHBsYWNlcywgaW5jbHVkaW5nIHRvIGNoZWNrIHdoZXRoZXIgYW4gb2ZmZXJcbiAqIGlzIHZhbGlkLCBnZXR0aW5nIHRoZSBjdXJyZW50IHByaWNlIGZvciBhbiBhc3NldCBvbiB1c2VyXG4gKiByZXF1ZXN0LCBhbmQgdG8gZG8gdGhlIGFjdHVhbCByZWFsbG9jYXRpb24gYWZ0ZXIgYW4gb2ZmZXIgaGFzXG4gKiBiZWVuIG1hZGUuXG4gKlxuICogQHBhcmFtIHthbnl9IG91dHB1dFZhbHVlIC0gdGhlIHZhbHVlIG9mIHRoZSBhc3NldCB0aGUgdXNlciB3YW50c1xuICogdG8gZ2V0XG4gKiBAcGFyYW0ge2FueX0gaW5wdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGFzc2V0IGJlaW5nIHNwZW50XG4gKiBAcGFyYW0ge2FueX0gb3V0cHV0UmVzZXJ2ZSAtIHRoZSB2YWx1ZSBpbiB0aGUgbGlxdWlkaXR5XG4gKiBwb29sIG9mIHRoZSBraW5kIG9mIGFzc2V0IHRvIGJlIHNlbnQgb3V0XG4gKiBAcGFyYW0ge2JpZ2ludH0gW2ZlZUJhc2lzUG9pbnRzXSAtIHRoZSBmZWUgdGFrZW4gaW5cbiAqIGJhc2lzIHBvaW50cy4gVGhlIGRlZmF1bHQgaXMgMC4zJSBvciAzMCBiYXNpcyBwb2ludHMuIFRoZSBmZWUgaXMgdGFrZW4gZnJvbVxuICogb3V0cHV0VmFsdWVcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX0gaW5wdXRWYWx1ZSAtIHRoZSB2YWx1ZSBvZiBpbnB1dCByZXF1aXJlZCB0byBwdXJjaGFzZSBvdXRwdXRcbiAqLyRozY9fb25jZS5nZXRJbnB1dFByaWNlKGdldElucHV0UHJpY2UpO1xuICAgICAgIGNvbnN0IGdldE91dHB1dFByaWNlID0gKFxuICBvdXRwdXRWYWx1ZSxcbiAgaW5wdXRSZXNlcnZlLFxuICBvdXRwdXRSZXNlcnZlLFxuICBmZWVCYXNpc1BvaW50cyA9IDMwbixcbikgPT4ge1xuICBvdXRwdXRWYWx1ZSA9IE5hdChvdXRwdXRWYWx1ZSk7XG4gIGlucHV0UmVzZXJ2ZSA9IE5hdChpbnB1dFJlc2VydmUpO1xuICBvdXRwdXRSZXNlcnZlID0gTmF0KG91dHB1dFJlc2VydmUpO1xuXG4gIGlucHV0UmVzZXJ2ZSA+IDBuIHx8IEZhaWxgaW5wdXRSZXNlcnZlICR7aW5wdXRSZXNlcnZlfSBtdXN0IGJlIHBvc2l0aXZlYDtcbiAgb3V0cHV0UmVzZXJ2ZSA+IDBuIHx8IEZhaWxgb3V0cHV0UmVzZXJ2ZSAke291dHB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgO1xuICBvdXRwdXRSZXNlcnZlID4gb3V0cHV0VmFsdWUgfHxcbiAgICBGYWlsYG91dHB1dFJlc2VydmUgJHtvdXRwdXRSZXNlcnZlfSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvdXRwdXRWYWx1ZSAke291dHB1dFZhbHVlfWA7XG5cbiAgY29uc3Qgb25lTWludXNGZWVTY2FsZWQgPSBzdWJ0cmFjdChCQVNJU19QT0lOVFMsIGZlZUJhc2lzUG9pbnRzKTtcbiAgY29uc3QgbnVtZXJhdG9yID0gbXVsdGlwbHkobXVsdGlwbHkob3V0cHV0VmFsdWUsIGlucHV0UmVzZXJ2ZSksIEJBU0lTX1BPSU5UUyk7XG4gIGNvbnN0IGRlbm9taW5hdG9yID0gbXVsdGlwbHkoXG4gICAgc3VidHJhY3Qob3V0cHV0UmVzZXJ2ZSwgb3V0cHV0VmFsdWUpLFxuICAgIG9uZU1pbnVzRmVlU2NhbGVkLFxuICApO1xuICByZXR1cm4gYWRkKGZsb29yRGl2aWRlKG51bWVyYXRvciwgZGVub21pbmF0b3IpLCAxbik7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZSBob3cgbWFueSBsaXF1aWRpdHkgdG9rZW5zIHdlIHNob3VsZCBiZSBtaW50aW5nIHRvIHNlbmQgYmFjayB0byB0aGVcbiAqIHVzZXIgd2hlbiBhZGRpbmcgbGlxdWlkaXR5LiBXZSBwcm92aWRlIG5ldyBsaXF1aWRpdHkgZXF1YWwgdG8gdGhlIGV4aXN0aW5nXG4gKiBsaXF1aWRpdHkgbXVsdGlwbGllZCBieSB0aGUgcmF0aW8gb2YgbmV3IGNlbnRyYWwgdG9rZW5zIHRvIGNlbnRyYWwgdG9rZW5zXG4gKiBhbHJlYWR5IGhlbGQuIElmIHRoZSBjdXJyZW50IHN1cHBseSBpcyB6ZXJvLCByZXR1cm4gdGhlIGlucHV0VmFsdWUgYXMgdGhlXG4gKiBpbml0aWFsIGxpcXVpZGl0eSB0byBtaW50IGlzIGFyYml0cmFyeS5cbiAqXG4gKiBAcGFyYW0ge2JpZ2ludH0gbGlxVG9rZW5TdXBwbHlcbiAqIEBwYXJhbSB7YmlnaW50fSBpbnB1dFZhbHVlXG4gKiBAcGFyYW0ge2JpZ2ludH0gaW5wdXRSZXNlcnZlXG4gKiBAcmV0dXJucyB7TmF0VmFsdWV9XG4gKi8kaM2PX29uY2UuZ2V0T3V0cHV0UHJpY2UoZ2V0T3V0cHV0UHJpY2UpO1xuICAgICAgIGNvbnN0IGNhbGNMaXFWYWx1ZVRvTWludCA9IChcbiAgbGlxVG9rZW5TdXBwbHksXG4gIGlucHV0VmFsdWUsXG4gIGlucHV0UmVzZXJ2ZSxcbikgPT4ge1xuICBsaXFUb2tlblN1cHBseSA9IE5hdChsaXFUb2tlblN1cHBseSk7XG4gIGlucHV0VmFsdWUgPSBOYXQoaW5wdXRWYWx1ZSk7XG4gIGlucHV0UmVzZXJ2ZSA9IE5hdChpbnB1dFJlc2VydmUpO1xuXG4gIGlmIChsaXFUb2tlblN1cHBseSA9PT0gMG4pIHtcbiAgICByZXR1cm4gaW5wdXRWYWx1ZTtcbiAgfVxuICByZXR1cm4gZmxvb3JEaXZpZGUobXVsdGlwbHkoaW5wdXRWYWx1ZSwgbGlxVG9rZW5TdXBwbHkpLCBpbnB1dFJlc2VydmUpO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgaG93IG11Y2ggb2YgdGhlIHNlY29uZGFyeSB0b2tlbiBpcyByZXF1aXJlZCBmcm9tIHRoZSB1c2VyIHdoZW5cbiAqIGFkZGluZyBsaXF1aWRpdHkuIFdlIHJlcXVpcmUgdGhhdCB0aGUgZGVwb3NpdGVkIHJhdGlvIG9mIGNlbnRyYWwgdG8gc2Vjb25kYXJ5XG4gKiBtYXRjaCB0aGUgY3VycmVudCByYXRpbyBvZiBob2xkaW5ncyBpbiB0aGUgcG9vbC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gY2VudHJhbEluIC0gVGhlIHZhbHVlIG9mIGNlbnRyYWwgYXNzZXRzIGJlaW5nIGRlcG9zaXRlZFxuICogQHBhcmFtIHthbnl9IGNlbnRyYWxQb29sIC0gVGhlIHZhbHVlIG9mIGNlbnRyYWwgYXNzZXRzIGluIHRoZSBwb29sXG4gKiBAcGFyYW0ge2FueX0gc2Vjb25kYXJ5UG9vbCAtIFRoZSB2YWx1ZSBvZiBzZWNvbmRhcnkgYXNzZXRzIGluIHRoZSBwb29sXG4gKiBAcGFyYW0ge2FueX0gc2Vjb25kYXJ5SW4gLSBUaGUgdmFsdWUgb2Ygc2Vjb25kYXJ5IGFzc2V0cyBwcm92aWRlZC4gSWZcbiAqIHRoZSBwb29sIGlzIGVtcHR5LCB0aGUgZW50aXJlIGFtb3VudCB3aWxsIGJlIGFjY2VwdGVkXG4gKiBAcmV0dXJucyB7TmF0VmFsdWV9IC0gdGhlIGFtb3VudCBvZiBzZWNvbmRhcnkgcmVxdWlyZWRcbiAqLyRozY9fb25jZS5jYWxjTGlxVmFsdWVUb01pbnQoY2FsY0xpcVZhbHVlVG9NaW50KTtcbiAgICAgICBjb25zdCBjYWxjU2Vjb25kYXJ5UmVxdWlyZWQgPSAoXG4gIGNlbnRyYWxJbixcbiAgY2VudHJhbFBvb2wsXG4gIHNlY29uZGFyeVBvb2wsXG4gIHNlY29uZGFyeUluLFxuKSA9PiB7XG4gIGNlbnRyYWxJbiA9IE5hdChjZW50cmFsSW4pO1xuICBjZW50cmFsUG9vbCA9IE5hdChjZW50cmFsUG9vbCk7XG4gIHNlY29uZGFyeVBvb2wgPSBOYXQoc2Vjb25kYXJ5UG9vbCk7XG4gIHNlY29uZGFyeUluID0gTmF0KHNlY29uZGFyeUluKTtcblxuICBpZiAoY2VudHJhbFBvb2wgPT09IDBuIHx8IHNlY29uZGFyeVBvb2wgPT09IDBuKSB7XG4gICAgcmV0dXJuIHNlY29uZGFyeUluO1xuICB9XG5cbiAgY29uc3Qgc2NhbGVkU2Vjb25kYXJ5ID0gZmxvb3JEaXZpZGUoXG4gICAgbXVsdGlwbHkoY2VudHJhbEluLCBzZWNvbmRhcnlQb29sKSxcbiAgICBjZW50cmFsUG9vbCxcbiAgKTtcbiAgY29uc3QgZXhhY3QgPVxuICAgIG11bHRpcGx5KGNlbnRyYWxJbiwgc2Vjb25kYXJ5UG9vbCkgPT09XG4gICAgbXVsdGlwbHkoc2NhbGVkU2Vjb25kYXJ5LCBjZW50cmFsUG9vbCk7XG5cbiAgLyogZG9lc24ndCBtYXRjaCB0aGUgeC15LWsucGRmIHBhcGVyLCBidXQgbW9yZSBjb3JyZWN0LiBXaGVuIHRoZSByYXRpb3MgYXJlKi9cbiAgLyogZXhhY3RseSBlcXVhbCwgbFByaW1lIGlzIGV4YWN0bHkgbCAqICgxICsgYWxwaGEpIGFuZCBhZGRpbmcgb25lIGlzIHdyb25nKi9cbiAgcmV0dXJuIGV4YWN0ID8gc2NhbGVkU2Vjb25kYXJ5IDogMW4gKyBzY2FsZWRTZWNvbmRhcnk7XG59O1xuXG4vKiBDYWxjdWxhdGUgaG93IG1hbnkgdW5kZXJseWluZyB0b2tlbnMgKGluIHRoZSBmb3JtIG9mIGEgdmFsdWUpIHNob3VsZCBiZSovXG4vKiByZXR1cm5lZCB3aGVuIHJlbW92aW5nIGxpcXVpZGl0eS4qLyRozY9fb25jZS5jYWxjU2Vjb25kYXJ5UmVxdWlyZWQoY2FsY1NlY29uZGFyeVJlcXVpcmVkKTtcbiAgICAgICBjb25zdCBjYWxjVmFsdWVUb1JlbW92ZSA9IChcbiAgbGlxVG9rZW5TdXBwbHksXG4gIHBvb2xWYWx1ZSxcbiAgbGlxdWlkaXR5VmFsdWVJbixcbikgPT4ge1xuICBsaXFUb2tlblN1cHBseSA9IE5hdChsaXFUb2tlblN1cHBseSk7XG4gIGxpcXVpZGl0eVZhbHVlSW4gPSBOYXQobGlxdWlkaXR5VmFsdWVJbik7XG4gIHBvb2xWYWx1ZSA9IE5hdChwb29sVmFsdWUpO1xuXG4gIHJldHVybiBmbG9vckRpdmlkZShtdWx0aXBseShsaXF1aWRpdHlWYWx1ZUluLCBwb29sVmFsdWUpLCBsaXFUb2tlblN1cHBseSk7XG59OyRozY9fb25jZS5jYWxjVmFsdWVUb1JlbW92ZShjYWxjVmFsdWVUb1JlbW92ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRJbnB1dFByaWNlIjpbImdldElucHV0UHJpY2UiXSwiZ2V0T3V0cHV0UHJpY2UiOlsiZ2V0T3V0cHV0UHJpY2UiXSwiY2FsY0xpcVZhbHVlVG9NaW50IjpbImNhbGNMaXFWYWx1ZVRvTWludCJdLCJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiOlsiY2FsY1NlY29uZGFyeVJlcXVpcmVkIl0sImNhbGNWYWx1ZVRvUmVtb3ZlIjpbImNhbGNWYWx1ZVRvUmVtb3ZlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADfO1r4xFAAAMRQAADUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJtYWtlRXBoZW1lcmFQcm92aWRlciIsInByb3ZpZGVBbGwiLCJwcm92aWRlRW1wdHlTZWF0IiwicHJvdmlkZVNpbmdsZXRvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFsbFZhbHVlcyxvYmplY3RNYXAscHJvdmlkZSxFOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYWxsVmFsdWVzXCIsWyRozY9fYSA9PiAoYWxsVmFsdWVzID0gJGjNj19hKV1dLFtcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByb3ZpZGVcIixbJGjNj19hID0+IChwcm92aWRlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtNYXBTdG9yZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7WkNGLCBaQ0ZTZWF0fSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuLyoqXG4gKiBTQ0FMRTogT25seSBmb3IgbG93IGNhcmRpbmFsaXR5IHByb3Zpc2lvbmluZy4gRXZlcnkgdmFsdWUgZnJvbSBpbml0KCkgd2lsbFxuICogcmVtYWluIGluIHRoZSBtYXAgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgaGVhcC4gSWYgYSBrZXkgb2JqZWN0IGlzIEdDZWQsIGl0c1xuICogcmVwcmVzZW50YXRpdmUgYWxzbyByZW1haW5zLlxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IEUgRXBoZW1lcmFsIHN0YXRlXG4gKiBAdGVtcGxhdGUge1dlYWtLZXl9IEsga2V5IG9uIHdoaWNoIHRvIHByb3Zpc2lvblxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBFfSBpbml0XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRXBoZW1lcmFQcm92aWRlciA9IGluaXQgPT4ge1xuICAvKiogQHR5cGUge1dlYWtNYXA8SywgRT59ICovXG4gIGNvbnN0IGV4dGFudCA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLyoqXG4gKiBQcm92aWRlIGFuIG9iamVjdCB0byBob2xkIHN0YXRlIHRoYXQgbmVlZCBub3QgKG9yIGNhbm5vdCkgYmUgZHVyYWJsZS5cbiAqXG4gKiBAdHlwZSB7KGtleTogSykgPT4gRX1cbiAqL1xuICByZXR1cm4ga2V5ID0+IHtcbiAgICBpZiAoZXh0YW50LmhhcyhrZXkpKSB7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgICAgcmV0dXJuIGV4dGFudC5nZXQoa2V5KTtcbiAgICB9XG4gICAgY29uc3QgbmV3RXBoID0gaW5pdChrZXkpO1xuICAgIGV4dGFudC5zZXQoa2V5LCBuZXdFcGgpO1xuICAgIHJldHVybiBuZXdFcGg7XG4gIH07XG59OyRozY9fb25jZS5tYWtlRXBoZW1lcmFQcm92aWRlcihtYWtlRXBoZW1lcmFQcm92aWRlcik7XG5oYXJkZW4obWFrZUVwaGVtZXJhUHJvdmlkZXIpO1xuXG4vKipcbiAqIFByb3ZpZGUgYW4gZW1wdHkgWkNGIHNlYXQuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge1pDRlNlYXR9XG4gKi9cbiAgICAgICBjb25zdCBwcm92aWRlRW1wdHlTZWF0ID0gKHpjZiwgYmFnZ2FnZSwgbmFtZSkgPT4ge1xuICByZXR1cm4gcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PiB6Y2YubWFrZUVtcHR5U2VhdEtpdCgpLnpjZlNlYXQpO1xufTskaM2PX29uY2UucHJvdmlkZUVtcHR5U2VhdChwcm92aWRlRW1wdHlTZWF0KTtcbmhhcmRlbihwcm92aWRlRW1wdHlTZWF0KTtcblxuLyoqXG4gKiBGb3IgdXNlIGluIGNvbnRyYWN0IHVwZ3JhZGVzIHRvIHByb3ZpZGUgdmFsdWVzIHRoYXQgY29tZSBmcm9tIG90aGVyIHZhdHMuXG4gKiBBbGwgdmF0cyBtdXN0IGJlIGFibGUgdG8gZmluaXNoIHRoZWlyIHVwZ3JhZGUgd2l0aG91dCBjb250YWN0aW5nIG90aGVyIHZhdHMsXG4gKiBzbyB3aGF0ZXZlciB2YWx1ZXMgYW4gaW5zdGFuY2UgbmVlZHMgZnJvbSBvdGhlciB2YXRzIG11c3QgYmUgc2F2ZWQgaW4gdGhlIGZpcnN0XG4gKiBpbmNhcm5hdGlvbiBhbmQgcmVhZCBmcm9tIGJhZ2dhZ2UgaW4gZWFjaCBzdWJzZXF1ZW50LlxuICpcbiAqIFRoaXMgYWJzdHJhY3RzIHRoYXQgY29uZGl0aW9uIHNvIHRoYXQgdGhlIGNvbnRyYWN0IGNhbiBjb252ZXJ0IGEgZGljdGlvbmFyeVxuICogb2YgdGh1bmtzIGludG8gYSBkaWN0aW9uYXJ5IG9mIHZhbHVlcyBkdXJpbmcgaXRzIGZpcnN0IGBwcmVwYXJlYCAoc3RhcnQpLlxuICogRWFjaCBzdWJzZXF1ZW50IGBwcmVwYXJlYCBjYWxsIHdpbGwgYXV0b21hdGljYWxseSByZWFkIGZyb20gdGhlIGJhZ2dhZ2UgYW5kXG4gKiBlc2NoZXcgcmVtb3RlIGNhbGxzLlxuICpcbiAqIFRoZSB2YWx1ZXMgYXJlIHRodW5rcyBpbnN0ZWFkIG9mIHByb21pc2VzIHNvIHRoYXQgdGhleSBkb24ndCBzdGFydCBleGVjdXRpbmdcbiAqIHVubmVjZXNzYXJpbHkgb3IgaW5kdWNlIGZhaWx1cmVzLlxuICpcbiAqIEZvciBleGFtcGxlLFxuICpcbiAqICAgICBjb25zdCBpbnZpdGF0aW9uSXNzdWVyUCA9IEUoem9lKS5nZXRJbnZpdGF0aW9uSXNzdWVyKCk7XG4gKiAgICAgY29uc3Qge1xuICogICAgICAgaW52aXRhdGlvbklzc3VlcixcbiAqICAgICAgIGludml0YXRpb25CcmFuZCxcbiAqICAgICB9ID0gYXdhaXQgcHJvdmlkZUFsbChiYWdnYWdlLCB7XG4gKiAgICAgICBpbnZpdGF0aW9uSXNzdWVyOiAoKSA9PiBpbnZpdGF0aW9uSXNzdWVyUCxcbiAqICAgICAgIGludml0YXRpb25CcmFuZDogKCkgPT4gRShpbnZpdGF0aW9uSXNzdWVyUCkuZ2V0QnJhbmQoKSxcbiAqICAgICB9KTtcbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsICgpID0+IEVSZWY8YW55Pj59IFQgZGljdCBvZiB0aHVua3MgKHByb21pc2UgbWFrZXJzKVxuICogQHBhcmFtIHtNYXBTdG9yZTxzdHJpbmcsIGFueT59IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7VH0gdGh1bmtzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7IFtLIGluIGtleW9mIFRdOiBBd2FpdGVkPFJldHVyblR5cGU8VFtLXT4+IH0+fVxuICovXG4gICAgICAgY29uc3QgcHJvdmlkZUFsbCA9IChiYWdnYWdlLCB0aHVua3MpID0+IHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRodW5rcyk7XG4gIC8qIGFzc3VtZSBpZiBhbnkga2V5cyBhcmUgZGVmaW5lZCB0aGV5IGFsbCBhcmUqL1xuICBjb25zdCBpbkJhZ2dhZ2UgPSBiYWdnYWdlLmhhcyhrZXlzWzBdKTtcbiAgaWYgKGluQmFnZ2FnZSkge1xuICAgIGNvbnN0IG9iaiA9IG9iamVjdE1hcChcbiAgICAgIHRodW5rcyxcbiAgICAgIC8qKiBAdHlwZSB7KHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSA9PiBhbnl9ICovXG4gICAgICAoXywgaykgPT4gYmFnZ2FnZS5nZXQoayksXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGhhcmRlbihvYmopKTtcbiAgfVxuXG4gIGNvbnN0IGtleWVkUHJvbWlzZXMgPSBvYmplY3RNYXAodGh1bmtzLCBmbiA9PiBmbigpKTtcblxuICByZXR1cm4gYWxsVmFsdWVzKGtleWVkUHJvbWlzZXMpLnRoZW4oa2V5ZWRWYWxzID0+IHtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhrZXllZFZhbHMpKSB7XG4gICAgICBiYWdnYWdlLmluaXQoaywgdik7XG4gICAgfVxuICAgIHJldHVybiBrZXllZFZhbHM7XG4gIH0pO1xufTskaM2PX29uY2UucHJvdmlkZUFsbChwcm92aWRlQWxsKTtcbmhhcmRlbihwcm92aWRlQWxsKTtcblxuLyoqXG4gKiBMaWtlIHByb3ZpZGVBc3luYyBpbiBBdG9taWNQcm92aWRlciBidXQgYXNzdW1lcyBvbmx5IG9uZSBjYWxsIHNvIHRoZXJlIGFyZSBubyByYWNlIGNvbmRpdGlvbnMuXG4gKiBBZGRpdGlvbmFsbHkgb2ZmZXJzIGEgYHdpdGhWYWx1ZWAgaGVscGVyIHVzZWZ1bCBmb3IgdHJpZ2dlcmluZyBwcm9jZXNlc3Mgb24gYSBwcm92aWRlZCBvYmplY3QuXG4gKlxuICogQHNlZSB7bWFrZUF0b21pY1Byb3ZpZGVyfVxuICogQHNlZSB7QXRvbWljUHJvdmlkZXJ9XG4gKiBAdGVtcGxhdGUgeygpID0+IEVSZWY8YW55Pn0gVFxuICogQHBhcmFtIHtCYWdnYWdlfSBtYXBTdG9yZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHBhcmFtIHtUfSBtYWtlVmFsdWVcbiAqIEBwYXJhbSB7KHZhbHVlOiBBd2FpdGVkPFJldHVyblR5cGU8VD4+KSA9PiB2b2lkfSBbd2l0aFZhbHVlXVxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj59XG4gKi9cbiAgICAgICBjb25zdCBwcm92aWRlU2luZ2xldG9uID0gKG1hcFN0b3JlLCBrZXksIG1ha2VWYWx1ZSwgd2l0aFZhbHVlKSA9PiB7XG4gIGNvbnN0IHN0b3JlZCA9IG1hcFN0b3JlLmhhcyhrZXkpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IEUud2hlbihtYWtlVmFsdWUoKSwgdiA9PiBtYXBTdG9yZS5pbml0KGtleSwgaGFyZGVuKHYpKSk7XG5cbiAgcmV0dXJuIEUud2hlbihzdG9yZWQsICgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IG1hcFN0b3JlLmdldChrZXkpO1xuICAgIGlmICh3aXRoVmFsdWUpIHtcbiAgICAgIHdpdGhWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSk7XG59OyRozY9fb25jZS5wcm92aWRlU2luZ2xldG9uKHByb3ZpZGVTaW5nbGV0b24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVwaGVtZXJhUHJvdmlkZXIiOlsibWFrZUVwaGVtZXJhUHJvdmlkZXIiXSwicHJvdmlkZUVtcHR5U2VhdCI6WyJwcm92aWRlRW1wdHlTZWF0Il0sInByb3ZpZGVBbGwiOlsicHJvdmlkZUFsbCJdLCJwcm92aWRlU2luZ2xldG9uIjpbInByb3ZpZGVTaW5nbGV0b24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtZivOKYIAACmCAAAMAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2JvbmRpbmdDdXJ2ZXMuanMiLCJAYWdvcmljL2VydHAvc3JjL3NhZmVNYXRoLmpzIiwiLi9zdGF0ZU1hY2hpbmUuanMiLCIuL2F0b21pY1RyYW5zZmVyLmpzIiwiLi96b2VIZWxwZXJzLmpzIiwiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qcyIsIi4vZHVyYWJpbGl0eS5qcyIsIi4vcHJlcGFyZS1vd25hYmxlLmpzIiwiLi9wcmljZUF1dGhvcml0eS5qcyIsIi4vcHJpY2VRdW90ZS5qcyIsIi4vcmVjb3JkZXIuanMiLCIuL3N0YXRpc3RpY3MuanMiLCIuL3RvcGljcy5qcyJdLCJleHBvcnRzIjpbImFzc2VydE5hdEFzc2V0S2luZCIsImFzc2VydE5hdEFzc2V0S2luZCIsImF0b21pY1RyYW5zZmVyIiwiYXRvbWljVHJhbnNmZXIiLCJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiLCJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL2R1cmFiaWxpdHkuanMiLCIuL3ByZXBhcmUtb3duYWJsZS5qcyIsIi4vcHJpY2VBdXRob3JpdHkuanMiLCIuL3ByaWNlUXVvdGUuanMiLCIuL3JlY29yZGVyLmpzIiwiLi9zdGF0aXN0aWNzLmpzIiwiLi90b3BpY3MuanMiLCJAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vYm9uZGluZ0N1cnZlcy5qc1wiLCBbXV0sW1wiQGFnb3JpYy9lcnRwL3NyYy9zYWZlTWF0aC5qc1wiLCBbXV0sW1wiLi9zdGF0ZU1hY2hpbmUuanNcIiwgW11dLFtcIi4vYXRvbWljVHJhbnNmZXIuanNcIiwgW11dLFtcIi4vem9lSGVscGVycy5qc1wiLCBbXV0sW1wiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qc1wiLCBbXV0sW1wiLi9kdXJhYmlsaXR5LmpzXCIsIFtdXSxbXCIuL3ByZXBhcmUtb3duYWJsZS5qc1wiLCBbXV0sW1wiLi9wcmljZUF1dGhvcml0eS5qc1wiLCBbXV0sW1wiLi9wcmljZVF1b3RlLmpzXCIsIFtdXSxbXCIuL3JlY29yZGVyLmpzXCIsIFtdXSxbXCIuL3N0YXRpc3RpY3MuanNcIiwgW11dLFtcIi4vdG9waWNzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9ib25kaW5nQ3VydmVzLmpzIjpbWyJjYWxjTGlxVmFsdWVUb01pbnQiLCJjYWxjTGlxVmFsdWVUb01pbnQiXSxbImNhbGNTZWNvbmRhcnlSZXF1aXJlZCIsImNhbGNTZWNvbmRhcnlSZXF1aXJlZCJdLFsiY2FsY1ZhbHVlVG9SZW1vdmUiLCJjYWxjVmFsdWVUb1JlbW92ZSJdLFsiZ2V0SW5wdXRQcmljZSIsImdldElucHV0UHJpY2UiXSxbImdldE91dHB1dFByaWNlIiwiZ2V0T3V0cHV0UHJpY2UiXV0sIkBhZ29yaWMvZXJ0cC9zcmMvc2FmZU1hdGguanMiOltbIm5hdFNhZmVNYXRoIiwibmF0U2FmZU1hdGgiXV0sIi4vc3RhdGVNYWNoaW5lLmpzIjpbWyJtYWtlU3RhdGVNYWNoaW5lIiwibWFrZVN0YXRlTWFjaGluZSJdXSwiLi9hdG9taWNUcmFuc2Zlci5qcyI6W1siYXRvbWljUmVhcnJhbmdlIiwiYXRvbWljUmVhcnJhbmdlIl0sWyJhdG9taWNUcmFuc2ZlciIsImF0b21pY1RyYW5zZmVyIl0sWyJmcm9tT25seSIsImZyb21Pbmx5Il0sWyJ0b09ubHkiLCJ0b09ubHkiXV0sIi4vem9lSGVscGVycy5qcyI6W1siYXNzZXJ0SXNzdWVyS2V5d29yZHMiLCJhc3NlcnRJc3N1ZXJLZXl3b3JkcyJdLFsiYXNzZXJ0TmF0QXNzZXRLaW5kIiwiYXNzZXJ0TmF0QXNzZXRLaW5kIl0sWyJhc3NlcnRQcm9wb3NhbFNoYXBlIiwiYXNzZXJ0UHJvcG9zYWxTaGFwZSJdLFsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciLCJkZWZhdWx0QWNjZXB0YW5jZU1zZyJdLFsiZGVwb3NpdFRvU2VhdCIsImRlcG9zaXRUb1NlYXQiXSxbImZpdFByb3Bvc2FsU2hhcGUiLCJmaXRQcm9wb3NhbFNoYXBlIl0sWyJvZmZlclRvIiwib2ZmZXJUbyJdLFsic2F0aXNmaWVzIiwic2F0aXNmaWVzIl0sWyJzYXZlQWxsSXNzdWVycyIsInNhdmVBbGxJc3N1ZXJzIl0sWyJzd2FwIiwic3dhcCJdLFsic3dhcEV4YWN0Iiwic3dhcEV4YWN0Il0sWyJ3aXRoZHJhd0Zyb21TZWF0Iiwid2l0aGRyYXdGcm9tU2VhdCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfM7hAasPAACrDwAAOgAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmVwYXJlLW93bmFibGUuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9iYXNlLXpvbmUvem9uZS1oZWxwZXJzLmpzIiwiQGVuZG8vcGF0dGVybnMiLCIuLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZU93bmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQsTSxPZmZlckhhbmRsZXJJOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9iYXNlLXpvbmUvem9uZS1oZWxwZXJzLmpzXCIsIFtbXCJwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXRcIixbJGjNj19hID0+IChwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCIuLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJPZmZlckhhbmRsZXJJXCIsWyRozY9fYSA9PiAoT2ZmZXJIYW5kbGVySSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqIEBpbXBvcnQge1pDRn0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7SW52aXRhdGlvbn0gZnJvbSAnLi4vdHlwZXMtaW5kZXguanMnO1xuICovXG5cbmNvbnN0IFRyYW5zZmVyUHJvcG9zYWxTaGFwZSA9IE0uc3BsaXRSZWNvcmQoe1xuICBnaXZlOiB7fSxcbiAgd2FudDoge30sXG4gIGV4aXQ6IHtcbiAgICBvbkRlbWFuZDogbnVsbCxcbiAgfSxcbn0pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE93bmFibGVPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3VJbnRlcmZhY2VOYW1lXVxuICogICBUaGUgYGludGVyZmFjZU5hbWVgIG9mIHRoZSB1bmRlcmx5aW5nIGludGVyZmFjZSBndWFyZC5cbiAqICAgRGVmYXVsdHMgdG8gdGhlIGB1S2luZE5hbWVgLlxuICovXG5cbi8qKlxuICogUHJlcGFyZSBhIGtpbmQgdGhhdCB3cmFwcyBhbiAnb3duYWJsZScgb2JqZWN0IHdpdGggYSBgbWFrZVRyYW5zZmVySW52aXRhdGlvbmBcbiAqIGFiaWxpdHkgYW5kIGRlbGVnYXRlcyB0byB0aGUgdW5kZXJseWluZyBvYmplY3QgbWV0aG9kcyBzcGVjaWZpZWQgaW4gYW5cbiAqIGFsbG93bGlzdCBvZiBtZXRob2QgbmFtZXMuXG4gKlxuICogQHRlbXBsYXRlIHsoc3RyaW5nIHwgc3ltYm9sKVtdfSBNTiBNZXRob2QgbmFtZXNcbiAqIEBwYXJhbSB7Wm9uZX0gem9uZVxuICogQHBhcmFtIHtaQ0ZbJ21ha2VJbnZpdGF0aW9uJ119IG1ha2VJbnZpdGF0aW9uXG4gKiAgIEEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBiZWhhdmlvciBhcyBgemNmLm1ha2VJbnZpdGF0aW9uYC5cbiAqICAgQSBjb250cmFjdCB3aWxsIG5vcm1hbGx5IGp1c3QgZXh0cmFjdCBpdCBmcm9tIGl0cyBvd24gemNmIHVzaW5nIHRoZVxuICogICBhcmd1bWVudCBleHByZXNzaW9uXG4gKiAgIGBgYGpzXG4gKiAgICguLi5hcmdzKSA9PiB6Y2YubWFrZUludml0YXRpb24oLi4uYXJncylcbiAqICAgYGBgXG4gKiAgIFNlZSBvd25hYmxlLWNvdW50ZXIuanMgZm9yIHRoZSBjYW5vbmljYWwgZXhhbXBsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB1S2luZE5hbWVcbiAqICAgVGhlIGBraW5kTmFtZWAgb2YgdGhlIHVuZGVybHlpbmcgZXhvIGNsYXNzXG4gKiBAcGFyYW0ge01OfSB1TWV0aG9kTmFtZXNcbiAqICAgVGhlIG1ldGhvZCBuYW1lcyBvZiB0aGUgdW5kZXJseWluZyBleG8gY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVwcmVzZW50ZWRcbiAqICAgYnkgdHJhbnNwYXJlbnRseS1mb3J3YXJkaW5nIG1ldGhvZHMgb2YgdGhlIHdyYXBwaW5nIG93bmFibGUgb2JqZWN0LlxuICogQHBhcmFtIHtPd25hYmxlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7PFU+KHVuZGVybHlpbmc6IFUpID0+IFBhcnRpYWw8VT4gJiB7bWFrZVRyYW5zZmVySW52aXRhdGlvbjogKCkgPT4gSW52aXRhdGlvbjxVPn19XG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlT3duYWJsZSA9IChcbiAgem9uZSxcbiAgbWFrZUludml0YXRpb24sXG4gIHVLaW5kTmFtZSxcbiAgdU1ldGhvZE5hbWVzLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgY29uc3QgeyB1SW50ZXJmYWNlTmFtZSA9IHVLaW5kTmFtZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgeyByZXZva2UsIG1ha2VSZXZvY2FibGUgfSA9IHByZXBhcmVSZXZvY2FibGVNYWtlcktpdChcbiAgICB6b25lLFxuICAgIHVLaW5kTmFtZSxcbiAgICB1TWV0aG9kTmFtZXMsXG4gICAge1xuICAgICAgdUludGVyZmFjZU5hbWUsXG4gICAgICBleHRyYU1ldGhvZEd1YXJkczoge1xuICAgICAgICBtYWtlVHJhbnNmZXJJbnZpdGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICAgIH0sXG4gICAgICBleHRyYU1ldGhvZHM6IHtcbiAgICAgICAgbWFrZVRyYW5zZmVySW52aXRhdGlvbigpIHtcbiAgICAgICAgICBjb25zdCB7IHVuZGVybHlpbmcgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3QgeyByZXZvY2FibGUgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IGN1c3RvbURldGFpbHMgPSB1bmRlcmx5aW5nLmdldEludml0YXRpb25DdXN0b21EZXRhaWxzKCk7XG4gICAgICAgICAgY29uc3QgdHJhbnNmZXJIYW5kbGVyID0gbWFrZVRyYW5zZmVySGFuZGxlcih1bmRlcmx5aW5nKTtcblxuICAgICAgICAgIGNvbnN0IGludml0YXRpb24gPSBtYWtlSW52aXRhdGlvbihcbiAgICAgICAgICAgIHRyYW5zZmVySGFuZGxlcixcbiAgICAgICAgICAgICd0cmFuc2ZlcicsXG4gICAgICAgICAgICBjdXN0b21EZXRhaWxzLFxuICAgICAgICAgICAgVHJhbnNmZXJQcm9wb3NhbFNoYXBlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV2b2tlKHJldm9jYWJsZSk7XG4gICAgICAgICAgcmV0dXJuIGludml0YXRpb247XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgY29uc3QgbWFrZVRyYW5zZmVySGFuZGxlciA9IHpvbmUuZXhvQ2xhc3MoXG4gICAgJ1RyYW5zZmVySGFuZGxlcicsXG4gICAgT2ZmZXJIYW5kbGVySSxcbiAgICB1bmRlcmx5aW5nID0+ICh7XG4gICAgICB1bmRlcmx5aW5nLFxuICAgIH0pLFxuICAgIHtcbiAgICAgIGhhbmRsZShzZWF0KSB7XG4gICAgICAgIGNvbnN0IHsgdW5kZXJseWluZyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3QgcmV2b2NhYmxlID0gbWFrZVJldm9jYWJsZSh1bmRlcmx5aW5nKTtcbiAgICAgICAgc2VhdC5leGl0KCk7XG4gICAgICAgIHJldHVybiByZXZvY2FibGU7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgY29uc3QgbWFrZU93bmFibGUgPSB1bmRlcmx5aW5nID0+IG1ha2VSZXZvY2FibGUodW5kZXJseWluZyk7XG4gIC8qIFVzaW5nIGF0LXRzLWlnbm9yZSByYXRoZXIgdGhhbiBhdC10cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGUgdnNjb2RlKi9cbiAgLyogdHMgc2VydmVyIHNheXMgaXQgaXMgYW4gZXJyb3IgYnV0IGB5YXJuIGxpbnRgIHNheXMgaXQgaXMgbm90LiovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQqL1xuICAvKiBAdHMtaWdub3JlIFJldHVybiB0eXBlIGlzIG1vcmUgcHJlY2lzZSB0aGFuIHJldm9jYWJsZSBzdXBwb3J0cyovXG4gIHJldHVybiBoYXJkZW4obWFrZU93bmFibGUpO1xufTskaM2PX29uY2UucHJlcGFyZU93bmFibGUocHJlcGFyZU93bmFibGUpO1xuaGFyZGVuKHByZXBhcmVPd25hYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVPd25hYmxlIjpbInByZXBhcmVPd25hYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANnKq1GJNQAAiTUAADkAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdGltZSJdLCJleHBvcnRzIjpbIlByaWNlQXV0aG9yaXR5SSIsIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxFLEZhcixtYWtlUHJvbWlzZUtpdCxBbW91bnRNYXRoLEFtb3VudFNoYXBlLEJyYW5kU2hhcGUsbWFrZVRyYWNlcixtYWtlTm90aWZpZXIsTSxUaW1lc3RhbXBTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXSxbXCJBbW91bnRTaGFwZVwiLFskaM2PX2EgPT4gKEFtb3VudFNoYXBlID0gJGjNj19hKV1dLFtcIkJyYW5kU2hhcGVcIixbJGjNj19hID0+IChCcmFuZFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlTm90aWZpZXJcIixbJGjNj19hID0+IChtYWtlTm90aWZpZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIixbJGjNj19hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UHJpY2VBdXRob3JpdHksIFByaWNlRGVzY3JpcHRpb24sIFByaWNlUXVvdGUsIFByaWNlUXVvdGVWYWx1ZSwgUHJpY2VRdWVyeSwgUHJpY2VRdW90ZUNyZWF0ZSwgUHJpY2VBdXRob3JpdHlLaXQsIFByaWNlUXVvdGVUcmlnZ2VyLCBNdXRhYmxlUXVvdGUsfSBmcm9tICdAYWdvcmljL3pvZS90b29scy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtOb3RpZmllcn0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gJ0BhZ29yaWMvdGltZSc7XG4gKiBAaW1wb3J0IHtBbW91bnR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtJc3N1ZXJ9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtCcmFuZH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge1Byb21pc2VSZWNvcmR9IGZyb20gJ0BlbmRvL3Byb21pc2Uta2l0JztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG5jb25zdCB0cmFjZSA9IG1ha2VUcmFjZXIoJ1BBJywgZmFsc2UpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBDb21wYXJlQW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50TGltaXRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5cbi8qKiBAdHlwZSB7Q29tcGFyZUFtb3VudH0gKi9cbmNvbnN0IGlzTFQgPSAoYW1vdW50LCBhbW91bnRMaW1pdCkgPT4gIUFtb3VudE1hdGguaXNHVEUoYW1vdW50LCBhbW91bnRMaW1pdCk7XG5cbi8qKiBAdHlwZSB7Q29tcGFyZUFtb3VudH0gKi9cbmNvbnN0IGlzTFRFID0gKGFtb3VudCwgYW1vdW50TGltaXQpID0+IEFtb3VudE1hdGguaXNHVEUoYW1vdW50TGltaXQsIGFtb3VudCk7XG5cbi8qKiBAdHlwZSB7Q29tcGFyZUFtb3VudH0gKi9cbmNvbnN0IGlzR1RFID0gKGFtb3VudCwgYW1vdW50TGltaXQpID0+IEFtb3VudE1hdGguaXNHVEUoYW1vdW50LCBhbW91bnRMaW1pdCk7XG5cbi8qKiBAdHlwZSB7Q29tcGFyZUFtb3VudH0gKi9cbmNvbnN0IGlzR1QgPSAoYW1vdW50LCBhbW91bnRMaW1pdCkgPT4gIUFtb3VudE1hdGguaXNHVEUoYW1vdW50TGltaXQsIGFtb3VudCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIFRyaWdnZXJcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZUNyZWF0ZX0gY3JlYXRlSW5zdGFudFF1b3RlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuXG5jb25zdCBHdWFyZENhbGxBbW91bnRUdXBsZSA9IE0uY2FsbChBbW91bnRTaGFwZSwgQW1vdW50U2hhcGUpLnJldHVybnMoXG4gIE0ucHJvbWlzZSgpLFxuKTtcbiAgICAgICBjb25zdCBQcmljZUF1dGhvcml0eUkgPSBNLmludGVyZmFjZSgnUHJpY2VBdXRob3JpdHknLCB7XG4gIGdldFF1b3RlSXNzdWVyOiBNLmNhbGwoQnJhbmRTaGFwZSwgQnJhbmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldFRpbWVyU2VydmljZTogTS5jYWxsKEJyYW5kU2hhcGUsIEJyYW5kU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBxdW90ZUdpdmVuOiBNLmNhbGwoQW1vdW50U2hhcGUsIEJyYW5kU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBxdW90ZVdhbnRlZDogTS5jYWxsKEJyYW5kU2hhcGUsIEFtb3VudFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgbWFrZVF1b3RlTm90aWZpZXI6IE0uY2FsbChBbW91bnRTaGFwZSwgQnJhbmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHF1b3RlQXRUaW1lOiBNLmNhbGwoVGltZXN0YW1wU2hhcGUsIEFtb3VudFNoYXBlLCBCcmFuZFNoYXBlKS5yZXR1cm5zKFxuICAgIE0ucHJvbWlzZSgpLFxuICApLFxuICBxdW90ZVdoZW5MVDogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG4gIHF1b3RlV2hlbkxURTogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG4gIHF1b3RlV2hlbkdURTogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG4gIHF1b3RlV2hlbkdUOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbiAgbXV0YWJsZVF1b3RlV2hlbkxUOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbiAgbXV0YWJsZVF1b3RlV2hlbkxURTogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG4gIG11dGFibGVRdW90ZVdoZW5HVEU6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxuICBtdXRhYmxlUXVvdGVXaGVuR1Q6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxufSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7SXNzdWVyPCdzZXQnLCBQcmljZURlc2NyaXB0aW9uPn0gb3B0cy5xdW90ZUlzc3VlclxuICogQHBhcmFtIHtFUmVmPE5vdGlmaWVyPHVua25vd24+Pn0gb3B0cy5ub3RpZmllclxuICogQHBhcmFtIHtFUmVmPFRpbWVyU2VydmljZT59IG9wdHMudGltZXJcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZUNyZWF0ZX0gb3B0cy5jcmVhdGVRdW90ZVxuICogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IG9wdHMuYWN0dWFsQnJhbmRJblxuICogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IG9wdHMuYWN0dWFsQnJhbmRPdXRcbiAqIEByZXR1cm5zIHtQcmljZUF1dGhvcml0eUtpdH1cbiAqLyRozY9fb25jZS5QcmljZUF1dGhvcml0eUkoUHJpY2VBdXRob3JpdHlJKTtcbiAgICAgICBjb25zdCBtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQgPSBvcHRzID0+IHtcbiAgY29uc3Qge1xuICAgIHRpbWVyLFxuICAgIGNyZWF0ZVF1b3RlLFxuICAgIGFjdHVhbEJyYW5kSW4sXG4gICAgYWN0dWFsQnJhbmRPdXQsXG4gICAgcXVvdGVJc3N1ZXIsXG4gICAgbm90aWZpZXIsXG4gIH0gPSBvcHRzO1xuXG4gIGxldCBoYXZlRmlyc3RRdW90ZSA9IGZhbHNlO1xuXG4gIHZvaWQgRShub3RpZmllcilcbiAgICAuZ2V0VXBkYXRlU2luY2UoKVxuICAgIC50aGVuKF8gPT4gKGhhdmVGaXJzdFF1b3RlID0gdHJ1ZSkpO1xuXG4gIC8qKiBAdHlwZSB7U2V0PFRyaWdnZXI+fSAqL1xuICBjb25zdCB0cmlnZ2VycyA9IG5ldyBTZXQoKTtcbiAgY29uc3QgbXV0YWJsZVRyaWdnZXJzID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICogQHBhcmFtIHtQcmljZVF1b3RlQ3JlYXRlfSB0cmlnZ2VyQ3JlYXRlUXVvdGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG4gIGNvbnN0IGZpcmVUcmlnZ2VycyA9IGFzeW5jIHRyaWdnZXJDcmVhdGVRdW90ZSA9PiB7XG4gICAgaWYgKCFoYXZlRmlyc3RRdW90ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFsuLi50cmlnZ2VycywgLi4uQXJyYXkuZnJvbShtdXRhYmxlVHJpZ2dlcnMudmFsdWVzKCkpXS5tYXAodHJpZ2dlciA9PlxuICAgICAgICB0cmlnZ2VyKHRyaWdnZXJDcmVhdGVRdW90ZSksXG4gICAgICApLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gKiBDcmVhdGUgYSBxdW90ZVdoZW4qIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29tcGFyZUFtb3VudH0gY29tcGFyZUFtb3VudHNGblxuICovXG4gIGNvbnN0IG1ha2VRdW90ZVdoZW5PdXQgPVxuICAgIGNvbXBhcmVBbW91bnRzRm4gPT5cbiAgICAvKipcbiAqIFJldHVybiBhIHF1b3RlIHdoZW4gdHJpZ2dlcldoZW4gaXMgdHJ1ZSBvZiB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50SW4gdGhlIGlucHV0IHZhbHVlIHRvIHRoZSBjYWxjQW1vdW50VHJpZ2dlclxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudE91dExpbWl0IHRoZSB2YWx1ZSB0byBjb21wYXJlIHdpdGggdGhlIG91dHB1dFxuICogb2YgY2FsY0Ftb3VudFRyaWdnZXJcbiAqL1xuICAgIGFzeW5jIChhbW91bnRJbiwgYW1vdW50T3V0TGltaXQpID0+IHtcbiAgICAgIGFtb3VudEluID0gQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbiwgYW1vdW50SW4pO1xuICAgICAgYW1vdW50T3V0TGltaXQgPSBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCwgYW1vdW50T3V0TGltaXQpO1xuXG4gICAgICAvKiogQHR5cGUge1Byb21pc2VSZWNvcmQ8UHJpY2VRdW90ZT59ICovXG4gICAgICBjb25zdCB0cmlnZ2VyUEsgPSBtYWtlUHJvbWlzZUtpdCgpO1xuXG4gICAgICAvKiogQHR5cGUge1ByaWNlUXVvdGVUcmlnZ2VyfSAqL1xuICAgICAgY29uc3QgdHJpZ2dlciA9IGFzeW5jIGNyZWF0ZUluc3RhbnRRdW90ZSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcXVvdGVQID0gY3JlYXRlSW5zdGFudFF1b3RlKGNhbGNBbW91bnRPdXQgPT4ge1xuICAgICAgICAgICAgaWYgKCF0cmlnZ2Vycy5oYXModHJpZ2dlcikpIHtcbiAgICAgICAgICAgICAgLyogQWxyZWFkeSBmaXJlZC4qL1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYW1vdW50T3V0ID0gY2FsY0Ftb3VudE91dChhbW91bnRJbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcGFyZUFtb3VudHNGbihhbW91bnRPdXQsIGFtb3VudE91dExpbWl0KSkge1xuICAgICAgICAgICAgICAvKiBEb24ndCBmaXJlIHRoZSB0cmlnZ2VyIHlldC4qL1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBHZW5lcmF0ZSB0aGUgcXVvdGUuKi9cbiAgICAgICAgICAgIHJldHVybiB7IGFtb3VudEluLCBhbW91bnRPdXQgfTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghcXVvdGVQKSB7XG4gICAgICAgICAgICAvKiBXZSBzaG91bGRuJ3QgcmVzb2x2ZSB5ZXQuKi9cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cmlnZ2Vycy5kZWxldGUodHJpZ2dlcik7XG4gICAgICAgICAgdHJpZ2dlclBLLnJlc29sdmUocXVvdGVQKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8qIFRyaWdnZXIgZmFpbGVkLCBzbyByZWplY3QgYW5kIGRyb3AuKi9cbiAgICAgICAgICB0cmlnZ2VyUEsucmVqZWN0KGUpO1xuICAgICAgICAgIHRyaWdnZXJzLmRlbGV0ZSh0cmlnZ2VyKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJpZ2dlcnMuYWRkKHRyaWdnZXIpO1xuXG4gICAgICAvKiBGaXJlIG5vdywganVzdCBpbiBjYXNlLiovXG4gICAgICBhd2FpdCB0cmlnZ2VyKGNyZWF0ZVF1b3RlKTtcblxuICAgICAgcmV0dXJuIHRyaWdnZXJQSy5wcm9taXNlO1xuICAgIH07XG5cbiAgLyoqXG4gKiBDcmVhdGUgYSBtdXRhYmxlUXVvdGVXaGVuKiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbXBhcmVBbW91bnR9IGNvbXBhcmVBbW91bnRzRm5cbiAqL1xuICBjb25zdCBtYWtlTXV0YWJsZVF1b3RlID1cbiAgICBjb21wYXJlQW1vdW50c0ZuID0+XG4gICAgLyoqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudEluXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudE91dExpbWl0XG4gKi9cbiAgICBhc3luYyAoYW1vdW50SW4sIGFtb3VudE91dExpbWl0KSA9PiB7XG4gICAgICBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLCBhbW91bnRJbik7XG4gICAgICBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCwgYW1vdW50T3V0TGltaXQpO1xuXG4gICAgICAvKiogQHR5cGUge1Byb21pc2VSZWNvcmQ8UHJpY2VRdW90ZT59ICovXG4gICAgICBjb25zdCB0cmlnZ2VyUEsgPSBtYWtlUHJvbWlzZUtpdCgpO1xuXG4gICAgICAvKiogQHR5cGUge011dGFibGVRdW90ZX0gKi9cbiAgICAgIGNvbnN0IG11dGFibGVRdW90ZSA9IEZhcignTXV0YWJsZVF1b3RlJywge1xuICAgICAgICBjYW5jZWw6IGUgPT4gdHJpZ2dlclBLLnJlamVjdChlKSxcbiAgICAgICAgdXBkYXRlTGV2ZWw6IChuZXdBbW91bnRJbiwgbmV3QW1vdW50T3V0TGltaXQpID0+IHtcbiAgICAgICAgICBjb25zdCBjb2VyY2VkQW1vdW50SW4gPSBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLCBuZXdBbW91bnRJbik7XG4gICAgICAgICAgY29uc3QgY29lcmNlZEFtb3VudE91dExpbWl0ID0gQW1vdW50TWF0aC5jb2VyY2UoXG4gICAgICAgICAgICBhY3R1YWxCcmFuZE91dCxcbiAgICAgICAgICAgIG5ld0Ftb3VudE91dExpbWl0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgYW1vdW50SW4gPSBjb2VyY2VkQW1vdW50SW47XG4gICAgICAgICAgYW1vdW50T3V0TGltaXQgPSBjb2VyY2VkQW1vdW50T3V0TGltaXQ7XG4gICAgICAgICAgdm9pZCBmaXJlVHJpZ2dlcnMoY3JlYXRlUXVvdGUpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRQcm9taXNlOiAoKSA9PiB0cmlnZ2VyUEsucHJvbWlzZSxcbiAgICAgIH0pO1xuXG4gICAgICAvKiogQHR5cGUge1ByaWNlUXVvdGVUcmlnZ2VyfSAqL1xuICAgICAgY29uc3QgbXV0YWJsZVRyaWdnZXIgPSBhc3luYyBjcmVhdGVJbnN0YW50UXVvdGUgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHF1b3RlUCA9IGNyZWF0ZUluc3RhbnRRdW90ZShjYWxjQW1vdW50T3V0ID0+IHtcbiAgICAgICAgICAgIGlmICghbXV0YWJsZVRyaWdnZXJzLmhhcyhtdXRhYmxlUXVvdGUpKSB7XG4gICAgICAgICAgICAgIC8qIEFscmVhZHkgZmlyZWQuKi9cbiAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFtb3VudE91dCA9IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pO1xuXG4gICAgICAgICAgICBpZiAoIWNvbXBhcmVBbW91bnRzRm4oYW1vdW50T3V0LCBhbW91bnRPdXRMaW1pdCkpIHtcbiAgICAgICAgICAgICAgLyogRG9uJ3QgZmlyZSB0aGUgbXV0YWJsZVRyaWdnZXIgeWV0LiovXG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIEdlbmVyYXRlIHRoZSBxdW90ZS4qL1xuICAgICAgICAgICAgcmV0dXJuIHsgYW1vdW50SW4sIGFtb3VudE91dCB9O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFxdW90ZVApIHtcbiAgICAgICAgICAgIC8qIFdlIHNob3VsZG4ndCByZXNvbHZlIHlldC4qL1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG11dGFibGVUcmlnZ2Vycy5kZWxldGUobXV0YWJsZVF1b3RlKTtcbiAgICAgICAgICB0cmlnZ2VyUEsucmVzb2x2ZShxdW90ZVApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLyogVHJpZ2dlciBmYWlsZWQsIHNvIHJlamVjdCBhbmQgZHJvcC4qL1xuICAgICAgICAgIHRyaWdnZXJQSy5yZWplY3QoZSk7XG4gICAgICAgICAgbXV0YWJsZVRyaWdnZXJzLmRlbGV0ZShtdXRhYmxlUXVvdGUpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBtdXRhYmxlVHJpZ2dlcnMuc2V0KG11dGFibGVRdW90ZSwgbXV0YWJsZVRyaWdnZXIpO1xuXG4gICAgICAvKiBGaXJlIG5vdywganVzdCBpbiBjYXNlLiovXG4gICAgICBhd2FpdCBtdXRhYmxlVHJpZ2dlcihjcmVhdGVRdW90ZSk7XG5cbiAgICAgIHJldHVybiBtdXRhYmxlUXVvdGU7XG4gICAgfTtcblxuICAvKipcbiAqIEVuc3VyZSB0aGF0IHRoZSBicmFuZEluL2JyYW5kT3V0IHBhaXIgaXMgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kSW5cbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kT3V0XG4gKi9cbiAgY29uc3QgYXNzZXJ0QnJhbmRzID0gKGJyYW5kSW4sIGJyYW5kT3V0KSA9PiB7XG4gICAgYnJhbmRJbiA9PT0gYWN0dWFsQnJhbmRJbiB8fFxuICAgICAgRmFpbGBEZXNpcmVkIGJyYW5kSW4gJHtxKGJyYW5kSW4pfSBtdXN0IG1hdGNoICR7cShhY3R1YWxCcmFuZEluKX1gO1xuICAgIGJyYW5kT3V0ID09PSBhY3R1YWxCcmFuZE91dCB8fFxuICAgICAgRmFpbGBEZXNpcmVkIGJyYW5kT3V0ICR7cShicmFuZE91dCl9IG11c3QgbWF0Y2ggJHtxKGFjdHVhbEJyYW5kT3V0KX1gO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7UHJpY2VBdXRob3JpdHl9ICovXG4gIGNvbnN0IHByaWNlQXV0aG9yaXR5ID0gRmFyKCdQcmljZUF1dGhvcml0eScsIHtcbiAgICBnZXRRdW90ZUlzc3VlcihicmFuZEluLCBicmFuZE91dCkge1xuICAgICAgYXNzZXJ0QnJhbmRzKGJyYW5kSW4sIGJyYW5kT3V0KTtcbiAgICAgIHJldHVybiBxdW90ZUlzc3VlcjtcbiAgICB9LFxuICAgIGdldFRpbWVyU2VydmljZShicmFuZEluLCBicmFuZE91dCkge1xuICAgICAgYXNzZXJ0QnJhbmRzKGJyYW5kSW4sIGJyYW5kT3V0KTtcbiAgICAgIHJldHVybiB0aW1lcjtcbiAgICB9LFxuICAgIG1ha2VRdW90ZU5vdGlmaWVyKGFtb3VudEluLCBicmFuZE91dCkge1xuICAgICAgQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbiwgYW1vdW50SW4pO1xuICAgICAgYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLCBicmFuZE91dCk7XG5cbiAgICAgIC8qIFdyYXAgb3VyIHVuZGVybHlpbmcgbm90aWZpZXIgd2l0aCBzcGVjaWZpYyBxdW90ZXMuKi9cbiAgICAgIGNvbnN0IHNwZWNpZmljQmFzZU5vdGlmaWVyID0gaGFyZGVuKHtcbiAgICAgICAgYXN5bmMgZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvKiBXZSB1c2UgdGhlIHNhbWUgdXBkYXRlQ291bnQgYXMgb3VyIHVuZGVybHlpbmcgbm90aWZpZXIuKi9cbiAgICAgICAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG5cbiAgICAgICAgICAvKiBXZSBjcmVhdGUgYSBxdW90ZSBpbmxpbmUuKi9cbiAgICAgICAgICBsZXQgcXVvdGU7XG4gICAgICAgICAgLyogY3JlYXRlUXVvdGUgY2FuIHRocm93IGlmIHByaWNlQXV0aG9yaXR5IGlzIHJlcGxhY2VkLiovXG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcXVvdGUgPSBjcmVhdGVRdW90ZShjYWxjQW1vdW50T3V0ID0+ICh7XG4gICAgICAgICAgICAgIGFtb3VudEluLFxuICAgICAgICAgICAgICBhbW91bnRPdXQ6IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCovXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFxdW90ZSkge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBjcmVhdGVRdW90ZSByZXR1cm5lZCBub3RoaW5nYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHF1b3RlO1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB1cGRhdGVDb3VudDogcmVjb3JkLnVwZGF0ZUNvdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8qKiBAdHlwZSB7Tm90aWZpZXI8UHJpY2VRdW90ZT59ICovXG4gICAgICBjb25zdCBzcGVjaWZpY05vdGlmaWVyID0gRmFyKCdRdW90ZU5vdGlmaWVyJywge1xuICAgICAgICAuLi5tYWtlTm90aWZpZXIoc3BlY2lmaWNCYXNlTm90aWZpZXIpLFxuICAgICAgICAvKiBUT0RPIHN0b3AgZXhwb3NpbmcgYmFzZU5vdGlmaWVyIG1ldGhvZHMgZGlyZWN0bHkuKi9cbiAgICAgICAgLi4uc3BlY2lmaWNCYXNlTm90aWZpZXIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzcGVjaWZpY05vdGlmaWVyO1xuICAgIH0sXG4gICAgYXN5bmMgcXVvdGVHaXZlbihhbW91bnRJbiwgYnJhbmRPdXQpIHtcbiAgICAgIHRyYWNlKCdxdW90ZUdpdmVuJywgYW1vdW50SW4sIGJyYW5kT3V0KTtcbiAgICAgIEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sIGFtb3VudEluKTtcbiAgICAgIGFzc2VydEJyYW5kcyhhbW91bnRJbi5icmFuZCwgYnJhbmRPdXQpO1xuXG4gICAgICBhd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSgpO1xuICAgICAgY29uc3QgcXVvdGUgPSBjcmVhdGVRdW90ZShjYWxjQW1vdW50T3V0ID0+ICh7XG4gICAgICAgIGFtb3VudEluLFxuICAgICAgICBhbW91bnRPdXQ6IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pLFxuICAgICAgfSkpO1xuICAgICAgYXNzZXJ0KHF1b3RlKTtcbiAgICAgIHJldHVybiBxdW90ZTtcbiAgICB9LFxuICAgIGFzeW5jIHF1b3RlV2FudGVkKGJyYW5kSW4sIGFtb3VudE91dCkge1xuICAgICAgQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRPdXQsIGFtb3VudE91dCk7XG4gICAgICBhc3NlcnRCcmFuZHMoYnJhbmRJbiwgYW1vdW50T3V0LmJyYW5kKTtcblxuICAgICAgYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UoKTtcbiAgICAgIGNvbnN0IHF1b3RlID0gY3JlYXRlUXVvdGUoKGNhbGNBbW91bnRPdXQsIGNhbGNBbW91bnRJbikgPT4ge1xuICAgICAgICAvKiBXZSBuZWVkIHRvIGRldGVybWluZSBhbiBhbW91bnRJbiB0aGF0IGd1YXJhbnRlZXMgYXQgbGVhc3QgdGhlIGFtb3VudE91dC4qL1xuICAgICAgICBjb25zdCBhbW91bnRJbiA9IGNhbGNBbW91bnRJbihhbW91bnRPdXQpO1xuICAgICAgICBjb25zdCBhY3R1YWxBbW91bnRPdXQgPSBjYWxjQW1vdW50T3V0KGFtb3VudEluKTtcbiAgICAgICAgQW1vdW50TWF0aC5pc0dURShhY3R1YWxBbW91bnRPdXQsIGFtb3VudE91dCkgfHxcbiAgICAgICAgICBGYWlsYENhbGN1bGF0aW9uIG9mICR7YWN0dWFsQW1vdW50T3V0fSBkaWRuJ3QgY292ZXIgZXhwZWN0ZWQgJHthbW91bnRPdXR9YDtcbiAgICAgICAgcmV0dXJuIHsgYW1vdW50SW4sIGFtb3VudE91dCB9O1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQocXVvdGUpO1xuICAgICAgcmV0dXJuIHF1b3RlO1xuICAgIH0sXG4gICAgYXN5bmMgcXVvdGVBdFRpbWUoZGVhZGxpbmUsIGFtb3VudEluLCBicmFuZE91dCkge1xuICAgICAgQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbiwgYW1vdW50SW4pO1xuICAgICAgYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLCBicmFuZE91dCk7XG5cbiAgICAgIGF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKCk7XG4gICAgICBjb25zdCBxdW90ZVBLID0gbWFrZVByb21pc2VLaXQoKTtcbiAgICAgIGF3YWl0IEUodGltZXIpLnNldFdha2V1cChcbiAgICAgICAgZGVhZGxpbmUsXG4gICAgICAgIEZhcignd2FrZU9iaicsIHtcbiAgICAgICAgICBhc3luYyB3YWtlKHRpbWVzdGFtcCkge1xuICAgICAgICAgICAgYXdhaXQgbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHF1b3RlUCA9IGNyZWF0ZVF1b3RlKGNhbGNBbW91bnRPdXQgPT4gKHtcbiAgICAgICAgICAgICAgICBhbW91bnRJbixcbiAgICAgICAgICAgICAgICBhbW91bnRPdXQ6IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIC8qIFdlIGRvbid0IHdhaXQgZm9yIHRoZSBxdW90ZSB0byBiZSBhdXRoZW50aWNhdGVkOyByZXNvbHZlKi9cbiAgICAgICAgICAgICAgLyogaW1tZWRpYXRlbHkuKi9cbiAgICAgICAgICAgICAgcXVvdGVQSy5yZXNvbHZlKHF1b3RlUCk7XG4gICAgICAgICAgICAgIGF3YWl0IHF1b3RlUEsucHJvbWlzZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgcXVvdGVQSy5yZWplY3QoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICAvKiBXYWl0IHVudGlsIHRoZSB3YWtldXAgcGFzc2VzLiovXG4gICAgICByZXR1cm4gcXVvdGVQSy5wcm9taXNlO1xuICAgIH0sXG4gICAgcXVvdGVXaGVuTFQ6IG1ha2VRdW90ZVdoZW5PdXQoaXNMVCksXG4gICAgcXVvdGVXaGVuTFRFOiBtYWtlUXVvdGVXaGVuT3V0KGlzTFRFKSxcbiAgICBxdW90ZVdoZW5HVEU6IG1ha2VRdW90ZVdoZW5PdXQoaXNHVEUpLFxuICAgIHF1b3RlV2hlbkdUOiBtYWtlUXVvdGVXaGVuT3V0KGlzR1QpLFxuICAgIG11dGFibGVRdW90ZVdoZW5MVDogbWFrZU11dGFibGVRdW90ZShpc0xUKSxcbiAgICBtdXRhYmxlUXVvdGVXaGVuTFRFOiBtYWtlTXV0YWJsZVF1b3RlKGlzTFRFKSxcbiAgICBtdXRhYmxlUXVvdGVXaGVuR1Q6IG1ha2VNdXRhYmxlUXVvdGUoaXNHVCksXG4gICAgbXV0YWJsZVF1b3RlV2hlbkdURTogbWFrZU11dGFibGVRdW90ZShpc0dURSksXG4gIH0pO1xuXG4gIHJldHVybiB7IHByaWNlQXV0aG9yaXR5LCBhZG1pbkZhY2V0OiB7IGZpcmVUcmlnZ2VycyB9IH07XG59OyRozY9fb25jZS5tYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQobWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlByaWNlQXV0aG9yaXR5SSI6WyJQcmljZUF1dGhvcml0eUkiXSwibWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0IjpbIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABoH8qu5gsAAOYLAAA1AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbImdldEFtb3VudEluIiwiZ2V0QW1vdW50T3V0IiwiZ2V0UHJpY2VEZXNjcmlwdGlvbiIsImdldFRpbWVzdGFtcCIsIm1ha2VQcmljZVF1b3RlSXNzdWVyIiwidW5pdEFtb3VudCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEFtb3VudE1hdGgsQXNzZXRLaW5kLG1ha2VJc3N1ZXJLaXQsRmFpbCxFLE5hdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV0sW1wiQXNzZXRLaW5kXCIsWyRozY9fYSA9PiAoQXNzZXRLaW5kID0gJGjNj19hKV1dLFtcIm1ha2VJc3N1ZXJLaXRcIixbJGjNj19hID0+IChtYWtlSXNzdWVyS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQcmljZUF1dGhvcml0eSwgUHJpY2VEZXNjcmlwdGlvbiwgUHJpY2VRdW90ZSwgUHJpY2VRdW90ZVZhbHVlLCBQcmljZVF1ZXJ5LH0gZnJvbSAnQGFnb3JpYy96b2UvdG9vbHMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7VGltZXN0YW1wfSBmcm9tICdAYWdvcmljL3RpbWUnO1xuICogQGltcG9ydCB7QnJhbmR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtJc3N1ZXJLaXR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKi9cblxuLyogUHJpY2VBdXRob3JpdGllcyByZXR1cm4gcXVvdGVzIGFzIGEgcGFpciBvZiBhbiBhbW91bnQgYW5kIGEgcGF5bWVudCwgYm90aCovXG4vKiB3aXRoIHRoZSBzYW1lIHZhbHVlLiBUaGUgdW5kZXJseWluZyBhbW91bnQgd3JhcHMgYW1vdW50SW4sIGFtb3VudE91dCwgdGltZXIqL1xuLyogYW5kIHRpbWVzdGFtcC4gVGhlIHBheW1lbnQgaXMgaXNzdWVkIGJ5IHRoZSBxdW90ZUlzc3VlciB0byBzdXBwb3J0IHZlcmFjaXR5Ki9cbi8qIGNoZWNraW5nLiBUaGVzZSBoZWxwZXJzIG1ha2UgaXQgZWFzaWVyIHRvIGV4dHJhY3QgdGhlIGNvbXBvbmVudHMgb2YgdGhlIFF1b3RlKi9cblxuLyoqXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGV9IHF1b3RlXG4gKiBAcmV0dXJucyB7UHJpY2VEZXNjcmlwdGlvbn1cbiAqL1xuICAgICAgIGNvbnN0IGdldFByaWNlRGVzY3JpcHRpb24gPSBxdW90ZSA9PiB7XG4gIHF1b3RlLnF1b3RlQW1vdW50LnZhbHVlLmxlbmd0aCA9PT0gMSB8fFxuICAgIEZhaWxgcXVvdGVBbW91bnQgc2V0IG11c3QgaGF2ZSBvbmUgbWVtYmVyYDtcbiAgcmV0dXJuIHF1b3RlLnF1b3RlQW1vdW50LnZhbHVlWzBdO1xufTtcblxuLyoqIEBwYXJhbSB7UHJpY2VRdW90ZX0gcXVvdGUgKi8kaM2PX29uY2UuZ2V0UHJpY2VEZXNjcmlwdGlvbihnZXRQcmljZURlc2NyaXB0aW9uKTtcbiAgICAgICBjb25zdCBnZXRBbW91bnRJbiA9IHF1b3RlID0+IGdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLmFtb3VudEluO1xuLyoqIEBwYXJhbSB7UHJpY2VRdW90ZX0gcXVvdGUgKi8kaM2PX29uY2UuZ2V0QW1vdW50SW4oZ2V0QW1vdW50SW4pO1xuICAgICAgIGNvbnN0IGdldEFtb3VudE91dCA9IHF1b3RlID0+IGdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLmFtb3VudE91dDtcbi8qKiBAdHlwZSB7KHF1b3RlOiBQcmljZVF1b3RlKSA9PiBUaW1lc3RhbXB9ICovJGjNj19vbmNlLmdldEFtb3VudE91dChnZXRBbW91bnRPdXQpO1xuICAgICAgIGNvbnN0IGdldFRpbWVzdGFtcCA9IHF1b3RlID0+IGdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLnRpbWVzdGFtcDtcblxuLyoqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBicmFuZCAqLyRozY9fb25jZS5nZXRUaW1lc3RhbXAoZ2V0VGltZXN0YW1wKTtcbiAgICAgICBjb25zdCB1bml0QW1vdW50ID0gYXN5bmMgYnJhbmQgPT4ge1xuICAvKiBCcmFuZCBtZXRob2RzIGFyZSByZW1vdGUqL1xuICBjb25zdCBkaXNwbGF5SW5mbyA9IGF3YWl0IEUoYnJhbmQpLmdldERpc3BsYXlJbmZvKCk7XG4gIGNvbnN0IGRlY2ltYWxQbGFjZXMgPSBkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzID8/IDA7XG4gIHJldHVybiBBbW91bnRNYXRoLm1ha2UoYnJhbmQsIDEwbiAqKiBOYXQoZGVjaW1hbFBsYWNlcykpO1xufTskaM2PX29uY2UudW5pdEFtb3VudCh1bml0QW1vdW50KTtcbmhhcmRlbih1bml0QW1vdW50KTtcblxuICAgICAgIGNvbnN0IG1ha2VQcmljZVF1b3RlSXNzdWVyID0gKCkgPT5cbiAgLyoqIEB0eXBlIHtJc3N1ZXJLaXQ8J3NldCcsIFByaWNlRGVzY3JpcHRpb24+fSAqLyAoXG4gICAgbWFrZUlzc3VlcktpdCgncXVvdGUnLCBBc3NldEtpbmQuU0VUKVxuICApOyRozY9fb25jZS5tYWtlUHJpY2VRdW90ZUlzc3VlcihtYWtlUHJpY2VRdW90ZUlzc3Vlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRQcmljZURlc2NyaXB0aW9uIjpbImdldFByaWNlRGVzY3JpcHRpb24iXSwiZ2V0QW1vdW50SW4iOlsiZ2V0QW1vdW50SW4iXSwiZ2V0QW1vdW50T3V0IjpbImdldEFtb3VudE91dCJdLCJnZXRUaW1lc3RhbXAiOlsiZ2V0VGltZXN0YW1wIl0sInVuaXRBbW91bnQiOlsidW5pdEFtb3VudCJdLCJtYWtlUHJpY2VRdW90ZUlzc3VlciI6WyJtYWtlUHJpY2VRdW90ZUlzc3VlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABb0apFYykAAGMpAAAzAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJSZWNvcmRlcktpdFNoYXBlIiwiZGVmaW5lRVJlY29yZGVyS2l0IiwiZGVmaW5lUmVjb3JkZXJLaXQiLCJwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzIiwicHJlcGFyZVJlY29yZGVyIiwicHJlcGFyZVJlY29yZGVyS2l0IiwicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgU3RvcmFnZU5vZGVTaGFwZSxwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQsbWFrZUZha2VNYXJzaGFsbGVyLG1ha2VGYWtlU3RvcmFnZSxtdXN0TWF0Y2gsTSxtYWtlU2NhbGFyQmlnTWFwU3RvcmUscHJlcGFyZUV4b0NsYXNzLEZhaWwsRTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIlN0b3JhZ2VOb2RlU2hhcGVcIixbJGjNj19hID0+IChTdG9yYWdlTm9kZVNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanNcIiwgW1tcIm1ha2VGYWtlTWFyc2hhbGxlclwiLFskaM2PX2EgPT4gKG1ha2VGYWtlTWFyc2hhbGxlciA9ICRozY9fYSldXSxbXCJtYWtlRmFrZVN0b3JhZ2VcIixbJGjNj19hID0+IChtYWtlRmFrZVN0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm4sIEVSZW1vdGUsIFJlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtFTWFyc2hhbGxlcn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMnO1xuICogQGltcG9ydCB7UHVibGlzaEtpdH0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3ZhdC1kYXRhJztcbiAqIEBpbXBvcnQge1N0b3JhZ2VOb2RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG4vKipcbiAqIFJlY29yZGVycyBzdXBwb3J0IHB1Ymxpc2hpbmcgZGF0YSB0byB2c3RvcmFnZS5cbiAqXG4gKiBgUmVjb3JkZXJgIGlzIHNpbWlsYXIgdG8gYFB1Ymxpc2hlcmAgKGluIHRoYXQgdGhleSBzZW5kIG91dCBkYXRhKSBidXQgaGFzIGRpZmZlcmVudCBzaWduYXR1cmVzOlxuICogLSBtZXRob2RzIGFyZSBhc3luYyBiZWNhdXNlIHRoZXkgYXdhaXQgcmVtb3RlIGNhbGxzIHRvIE1hcnNoYWxsZXIgYW5kIFN0b3JhZ2VOb2RlXG4gKiAtIG1ldGhvZCBuYW1lcyBjb252ZXkgdGhlIGR1cmFiaWxpdHlcbiAqIC0gb21pdHMgZmFpbCgpXG4gKiAtIGFkZHMgZ2V0U3RvcmFnZU5vZGUoKSBmcm9tIGl0cyBkdXJhYmxlIHN0YXRlXG4gKlxuICogT3RoZXIgbmFtZXMgc3VjaCBhcyBTdG9yZWRQdWJsaXNoZXIgb3IgQ2hhaW5TdG9yYWdlUHVibGlzaGVyIHdlcmUgY29uc2lkZXJlZCwgYnV0IGZvdW5kIHRvIGJlIHNvbWV0aW1lcyBjb25mdXNlZCB3aXRoICpkdXJhYmlsaXR5KiwgYW5vdGhlciB0cmFpdCBvZiB0aGlzIGNsYXNzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7IGdldFN0b3JhZ2VOb2RlKCk6IFJlbW90ZTxTdG9yYWdlTm9kZT4sIGdldFN0b3JhZ2VQYXRoKCk6IFByb21pc2U8c3RyaW5nPiwgd3JpdGUodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+LCB3cml0ZUZpbmFsKHZhbHVlOiBUKTogUHJvbWlzZTx2b2lkPiB9fSBSZWNvcmRlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQaWNrPFB1Ymxpc2hLaXQ8VD4sICdzdWJzY3JpYmVyJz4gJiB7IHJlY29yZGVyOiBSZWNvcmRlcjxUPiB9fSBSZWNvcmRlcktpdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQaWNrPFB1Ymxpc2hLaXQ8VD4sICdzdWJzY3JpYmVyJz4gJiB7IHJlY29yZGVyUDogRVJlZjxSZWNvcmRlcjxUPj4gfX0gRXZlbnR1YWxSZWNvcmRlcktpdFxuICovXG5cbi8qKlxuICogV3JhcCBhIFB1Ymxpc2hlciB0byByZWNvcmQgYWxsIHRoZSB2YWx1ZXMgdG8gY2hhaW4gc3RvcmFnZS5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVSZWNvcmRlciA9IChiYWdnYWdlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGNvbnN0IG1ha2VSZWNvcmRlciA9IHByZXBhcmVFeG9DbGFzcyhcbiAgICBiYWdnYWdlLFxuICAgICdSZWNvcmRlcicsXG4gICAgTS5pbnRlcmZhY2UoJ1JlY29yZGVyJywge1xuICAgICAgZ2V0U3RvcmFnZU5vZGU6IE0uY2FsbCgpLnJldHVybnMoU3RvcmFnZU5vZGVTaGFwZSksXG4gICAgICBnZXRTdG9yYWdlUGF0aDogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoLyogc3RyaW5nICovKSksXG4gICAgICB3cml0ZTogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgICAgd3JpdGVGaW5hbDogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIH0pLFxuICAgIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDxUPlsncHVibGlzaGVyJ119IHB1Ymxpc2hlclxuICogQHBhcmFtIHtSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtUeXBlZFBhdHRlcm48YW55Pn0gW3ZhbHVlU2hhcGVdXG4gKi9cbiAgICAoXG4gICAgICBwdWJsaXNoZXIsXG4gICAgICBzdG9yYWdlTm9kZSxcbiAgICAgIHZhbHVlU2hhcGUgPSAvKiogQHR5cGUge1R5cGVkUGF0dGVybjxhbnk+fSAqLyAoTS5hbnkoKSksXG4gICAgKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbG9zZWQ6IGZhbHNlLFxuICAgICAgICBwdWJsaXNoZXIsXG4gICAgICAgIHN0b3JhZ2VOb2RlLFxuICAgICAgICBzdG9yYWdlUGF0aDogLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovICh1bmRlZmluZWQpLFxuICAgICAgICB2YWx1ZVNoYXBlLFxuICAgICAgfTtcbiAgICB9LFxuICAgIHtcbiAgICAgIGdldFN0b3JhZ2VOb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5zdG9yYWdlTm9kZTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAqIE1lbW9pemVzIHRoZSByZW1vdGUgY2FsbCB0byB0aGUgc3RvcmFnZSBub2RlXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAqL1xuICAgICAgYXN5bmMgZ2V0U3RvcmFnZVBhdGgoKSB7XG4gICAgICAgIGNvbnN0IHsgc3RvcmFnZVBhdGg6IGhlbGRQYXRoIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAvKiBlbmQgc3luY2hyb25vdXMgcHJlbHVkZSovXG4gICAgICAgIGF3YWl0IG51bGw7XG4gICAgICAgIGlmIChoZWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGhlbGRQYXRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCBFKHRoaXMuc3RhdGUuc3RvcmFnZU5vZGUpLmdldFBhdGgoKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5zdG9yYWdlUGF0aCA9IHBhdGg7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICogTWFyc2hhbGxzIGJlZm9yZSB3cml0aW5nIHRvIHN0b3JhZ2Ugb3IgcHVibGlzaGVyIHRvIGhlbHAgZW5zdXJlIHRoZSB0d28gc3RyZWFtcyBtYXRjaC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICBhc3luYyB3cml0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCB7IGNsb3NlZCwgcHVibGlzaGVyLCBzdG9yYWdlTm9kZSwgdmFsdWVTaGFwZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgIWNsb3NlZCB8fCBGYWlsYGNhbm5vdCB3cml0ZSB0byBjbG9zZWQgcmVjb3JkZXJgO1xuICAgICAgICBtdXN0TWF0Y2godmFsdWUsIHZhbHVlU2hhcGUpO1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gYXdhaXQgRShtYXJzaGFsbGVyKS50b0NhcERhdGEodmFsdWUpO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICAgIGF3YWl0IEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKHNlcmlhbGl6ZWQpO1xuXG4gICAgICAgIC8qIGJlbG93IGhlcmUgZGlmZmVycyBmcm9tIHdyaXRlRmluYWwoKSovXG4gICAgICAgIHJldHVybiBwdWJsaXNoZXIucHVibGlzaCh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgLyoqXG4gKiBMaWtlIGB3cml0ZWAgYnV0IHByZXZlbnRzIGZ1dHVyZSB3cml0ZXMgYW5kIHRlcm1pbmF0ZXMgdGhlIHB1Ymxpc2hlci5cbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICBhc3luYyB3cml0ZUZpbmFsKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgY2xvc2VkLCBwdWJsaXNoZXIsIHN0b3JhZ2VOb2RlLCB2YWx1ZVNoYXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAhY2xvc2VkIHx8IEZhaWxgY2Fubm90IHdyaXRlIHRvIGNsb3NlZCByZWNvcmRlcmA7XG4gICAgICAgIG11c3RNYXRjaCh2YWx1ZSwgdmFsdWVTaGFwZSk7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgICAgYXdhaXQgRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG5cbiAgICAgICAgLyogYmVsb3cgaGVyZSBkaWZmZXJzIGZyb20gd3JpdGUoKSovXG4gICAgICAgIHRoaXMuc3RhdGUuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHB1Ymxpc2hlci5maW5pc2godmFsdWUpO1xuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiBtYWtlUmVjb3JkZXI7XG59OyRozY9fb25jZS5wcmVwYXJlUmVjb3JkZXIocHJlcGFyZVJlY29yZGVyKTtcbmhhcmRlbihwcmVwYXJlUmVjb3JkZXIpO1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlUmVjb3JkZXI+fSBNYWtlUmVjb3JkZXIgKi9cblxuLyoqXG4gKiBgbWFrZVJlY29yZGVyS2l0YCBpcyBzdWl0YWJsZSBmb3IgbWFraW5nIGEgZHVyYWJsZSBgUmVjb3JkZXJLaXRgIHdoaWNoIGNhbiBiZSBoZWxkIGluIEV4byBzdGF0ZS5cbiAqXG4gKiBAc2VlIHtkZWZpbmVFUmVjb3JkZXJLaXR9XG4gKlxuICogQHBhcmFtIHt7bWFrZVJlY29yZGVyOiBNYWtlUmVjb3JkZXIsIG1ha2VEdXJhYmxlUHVibGlzaEtpdDogUmV0dXJuVHlwZTx0eXBlb2YgcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Pn19IG1ha2Vyc1xuICovXG4gICAgICAgY29uc3QgZGVmaW5lUmVjb3JkZXJLaXQgPSAoeyBtYWtlUmVjb3JkZXIsIG1ha2VEdXJhYmxlUHVibGlzaEtpdCB9KSA9PiB7XG4gIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7VHlwZWRQYXR0ZXJuPFQ+fSBbdmFsdWVTaGFwZV1cbiAqIEByZXR1cm5zIHtSZWNvcmRlcktpdDxUPn1cbiAqL1xuICBjb25zdCBtYWtlUmVjb3JkZXJLaXQgPSAoc3RvcmFnZU5vZGUsIHZhbHVlU2hhcGUpID0+IHtcbiAgICBjb25zdCB7IHN1YnNjcmliZXIsIHB1Ymxpc2hlciB9ID0gbWFrZUR1cmFibGVQdWJsaXNoS2l0KCk7XG4gICAgY29uc3QgcmVjb3JkZXIgPSBtYWtlUmVjb3JkZXIocHVibGlzaGVyLCBzdG9yYWdlTm9kZSwgdmFsdWVTaGFwZSk7XG4gICAgcmV0dXJuIGhhcmRlbih7IHN1YnNjcmliZXIsIHJlY29yZGVyIH0pO1xuICB9O1xuICByZXR1cm4gbWFrZVJlY29yZGVyS2l0O1xufTtcbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgZGVmaW5lUmVjb3JkZXJLaXQ+fSBNYWtlUmVjb3JkZXJLaXQgKi9cblxuLyoqXG4gKiBgbWFrZUVSZWNvcmRlcktpdGAgaXMgZm9yIGNsb3N1cmVzIHRoYXQgbXVzdCByZXR1cm4gYSBgc3Vic2NyaWJlcmAgc3luY2hyb25vdXNseSBidXQgY2FuIGRlZmVyIHRoZSBgcmVjb3JkZXJgLlxuICpcbiAqIEBzZWUge2RlZmluZVJlY29yZGVyS2l0fVxuICpcbiAqIEBwYXJhbSB7e21ha2VSZWNvcmRlcjogTWFrZVJlY29yZGVyLCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQ6IFJldHVyblR5cGU8dHlwZW9mIHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdD59fSBtYWtlcnNcbiAqLyRozY9fb25jZS5kZWZpbmVSZWNvcmRlcktpdChkZWZpbmVSZWNvcmRlcktpdCk7XG4gICAgICAgY29uc3QgZGVmaW5lRVJlY29yZGVyS2l0ID0gKHsgbWFrZVJlY29yZGVyLCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQgfSkgPT4ge1xuICAvKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVBcbiAqIEBwYXJhbSB7VHlwZWRQYXR0ZXJuPFQ+fSBbdmFsdWVTaGFwZV1cbiAqIEByZXR1cm5zIHtFdmVudHVhbFJlY29yZGVyS2l0PFQ+fVxuICovXG4gIGNvbnN0IG1ha2VFUmVjb3JkZXJLaXQgPSAoc3RvcmFnZU5vZGVQLCB2YWx1ZVNoYXBlKSA9PiB7XG4gICAgY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VEdXJhYmxlUHVibGlzaEtpdCgpO1xuICAgIGNvbnN0IHJlY29yZGVyUCA9IEUud2hlbihzdG9yYWdlTm9kZVAsIHN0b3JhZ2VOb2RlID0+XG4gICAgICBtYWtlUmVjb3JkZXIocHVibGlzaGVyLCBzdG9yYWdlTm9kZSwgdmFsdWVTaGFwZSksXG4gICAgKTtcbiAgICByZXR1cm4geyBzdWJzY3JpYmVyLCByZWNvcmRlclAgfTtcbiAgfTtcbiAgcmV0dXJuIG1ha2VFUmVjb3JkZXJLaXQ7XG59OyRozY9fb25jZS5kZWZpbmVFUmVjb3JkZXJLaXQoZGVmaW5lRVJlY29yZGVyS2l0KTtcbmhhcmRlbihkZWZpbmVFUmVjb3JkZXJLaXQpO1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBkZWZpbmVFUmVjb3JkZXJLaXQ+fSBNYWtlRVJlY29yZGVyS2l0ICovXG5cbi8qKlxuICogQ29udmVuaWVuY2Ugd3JhcHBlciB0byBwcmVwYXJlIHRoZSBEdXJhYmxlUHVibGlzaEtpdCBhbmQgUmVjb3JkZXIga2luZHMuXG4gKiBOb3RlIHRoYXQgYmVjYXVzZSBwcmVwYXJlUmVjb3JkZXIoKSBjYW4gb25seSBiZSBjYWxsZWQgb25jZSBwZXIgYmFnZ2FnZSxcbiAqIHRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFuIEV2ZW50dWFsUmVjb3JkZXJLaXQuXG4gKiBXaGVuIHRoZXJlIGlzLCBwcmVwYXJlIHRoZSBraW5kcyBzZXBhcmF0ZWx5IGFuZCBwYXNzIHRvIHRoZSBraXQgZGVmaW5lcnMuXG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUmVjb3JkZXJLaXQgPSAoYmFnZ2FnZSwgbWFyc2hhbGxlcikgPT4ge1xuICBjb25zdCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQgPSBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICAnRHVyYWJsZSBQdWJsaXNoIEtpdCcsXG4gICk7XG4gIGNvbnN0IG1ha2VSZWNvcmRlciA9IHByZXBhcmVSZWNvcmRlcihiYWdnYWdlLCBtYXJzaGFsbGVyKTtcbiAgcmV0dXJuIGRlZmluZVJlY29yZGVyS2l0KHsgbWFrZUR1cmFibGVQdWJsaXNoS2l0LCBtYWtlUmVjb3JkZXIgfSk7XG59O1xuXG4vKipcbiAqIENvbnZlbmllbmNlIHdyYXBwZXIgZm9yIER1cmFibGVQdWJsaXNoS2l0IGFuZCBSZWNvcmRlciBraW5kcy5cbiAqXG4gKiBOQjogdGhpcyBkZWZpbmVzIHR3byBkdXJhYmxlIGtpbmRzLiBNdXN0IGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgcGVyIGJhZ2dhZ2UuXG4gKlxuICogYG1ha2VSZWNvcmRlcktpdGAgaXMgc3VpdGFibGUgZm9yIG1ha2luZyBhIGR1cmFibGUgYFJlY29yZGVyS2l0YCB3aGljaCBjYW4gYmUgaGVsZCBpbiBFeG8gc3RhdGUuXG4gKiBgbWFrZUVSZWNvcmRlcktpdGAgaXMgZm9yIGNsb3N1cmVzIHRoYXQgbXVzdCByZXR1cm4gYSBgc3Vic2NyaWJlcmAgc3luY2hyb25vdXNseSBidXQgY2FuIGRlZmVyIHRoZSBgcmVjb3JkZXJgLlxuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICovJGjNj19vbmNlLnByZXBhcmVSZWNvcmRlcktpdChwcmVwYXJlUmVjb3JkZXJLaXQpO1xuICAgICAgIGNvbnN0IHByZXBhcmVSZWNvcmRlcktpdE1ha2VycyA9IChiYWdnYWdlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGNvbnN0IG1ha2VEdXJhYmxlUHVibGlzaEtpdCA9IHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChcbiAgICBiYWdnYWdlLFxuICAgICdEdXJhYmxlIFB1Ymxpc2ggS2l0JyxcbiAgKTtcbiAgY29uc3QgbWFrZVJlY29yZGVyID0gcHJlcGFyZVJlY29yZGVyKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpO1xuXG4gIGNvbnN0IG1ha2VSZWNvcmRlcktpdCA9IGRlZmluZVJlY29yZGVyS2l0KHtcbiAgICBtYWtlUmVjb3JkZXIsXG4gICAgbWFrZUR1cmFibGVQdWJsaXNoS2l0LFxuICB9KTtcbiAgY29uc3QgbWFrZUVSZWNvcmRlcktpdCA9IGRlZmluZUVSZWNvcmRlcktpdCh7XG4gICAgbWFrZVJlY29yZGVyLFxuICAgIG1ha2VEdXJhYmxlUHVibGlzaEtpdCxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQsXG4gICAgbWFrZVJlY29yZGVyLFxuICAgIG1ha2VSZWNvcmRlcktpdCxcbiAgICBtYWtlRVJlY29yZGVyS2l0LFxuICB9O1xufTtcblxuLyoqXG4gKiBGb3IgdXNlIGluIHRlc3RzXG4gKi8kaM2PX29uY2UucHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKHByZXBhcmVSZWNvcmRlcktpdE1ha2Vycyk7XG4gICAgICAgY29uc3QgcHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyA9ICgpID0+IHtcbiAgY29uc3QgYmFnZ2FnZSA9IG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnbW9jayByZWNvcmRlciBiYWdnYWdlJyk7XG4gIGNvbnN0IG1hcnNoYWxsZXIgPSBtYWtlRmFrZU1hcnNoYWxsZXIoKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5wcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMoYmFnZ2FnZSwgbWFyc2hhbGxlciksXG4gICAgc3RvcmFnZU5vZGU6IG1ha2VGYWtlU3RvcmFnZSgnbW9jayByZWNvcmRlciBzdG9yYWdlJyksXG4gIH07XG59OyRozY9fb25jZS5wcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzKHByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMpO1xuXG4gICAgICAgY29uc3QgUmVjb3JkZXJLaXRTaGFwZSA9IHtcbiAgcmVjb3JkZXI6IE0ucmVtb3RhYmxlKCksXG4gIHN1YnNjcmliZXI6IE0ucmVtb3RhYmxlKCksXG59OyRozY9fb25jZS5SZWNvcmRlcktpdFNoYXBlKFJlY29yZGVyS2l0U2hhcGUpO1xuaGFyZGVuKFJlY29yZGVyS2l0U2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVJlY29yZGVyIjpbInByZXBhcmVSZWNvcmRlciJdLCJkZWZpbmVSZWNvcmRlcktpdCI6WyJkZWZpbmVSZWNvcmRlcktpdCJdLCJkZWZpbmVFUmVjb3JkZXJLaXQiOlsiZGVmaW5lRVJlY29yZGVyS2l0Il0sInByZXBhcmVSZWNvcmRlcktpdCI6WyJwcmVwYXJlUmVjb3JkZXJLaXQiXSwicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIjpbInByZXBhcmVSZWNvcmRlcktpdE1ha2VycyJdLCJwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzIjpbInByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMiXSwiUmVjb3JkZXJLaXRTaGFwZSI6WyJSZWNvcmRlcktpdFNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACivpPrsBAAA7AQAADcAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VTdGF0ZU1hY2hpbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXV1dXSk7XG5cbi8qIGFsbG93ZWRUcmFuc2l0aW9ucyBpcyBhbiBhcnJheSBvZiBhcnJheXMgd2hpY2ggZ2V0cyB0dXJuZWQgaW50byBhXG4gKiBtYXAuIFRoZSBtYXAgbWFwcyBzdHJpbmcgc3RhdGVzIHRvIGFuIGFycmF5IG9mIHBvdGVudGlhbCBuZXh0XG4gKiBzdGF0ZXMuIEZvciBleGFtcGxlLFxuICogY29uc3QgYWxsb3dlZFRyYW5zaXRpb25zID0gW1xuIFsnb3BlbicsIFsnY2xvc2VkJ11dLFxuIFsnY2xvc2VkJywgW11dLFxuICogXTtcbiovXG5jb25zdCBtYWtlU3RhdGVNYWNoaW5lID0gKGluaXRpYWxTdGF0ZSwgYWxsb3dlZFRyYW5zaXRpb25zQXJyYXkpID0+IHtcbiAgbGV0IHN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICBjb25zdCBhbGxvd2VkVHJhbnNpdGlvbnMgPSBuZXcgTWFwKGFsbG93ZWRUcmFuc2l0aW9uc0FycmF5KTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgY2FuVHJhbnNpdGlvblRvOiBuZXh0U3RhdGUgPT5cbiAgICAgIGFsbG93ZWRUcmFuc2l0aW9ucy5nZXQoc3RhdGUpLmluY2x1ZGVzKG5leHRTdGF0ZSksXG4gICAgdHJhbnNpdGlvblRvOiBuZXh0U3RhdGUgPT4ge1xuICAgICAgYXNzZXJ0KGFsbG93ZWRUcmFuc2l0aW9ucy5nZXQoc3RhdGUpLmluY2x1ZGVzKG5leHRTdGF0ZSkpO1xuICAgICAgc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgfSxcbiAgICBnZXRTdGF0dXM6IF8gPT4gc3RhdGUsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVN0YXRlTWFjaGluZShtYWtlU3RhdGVNYWNoaW5lKTtcbmhhcmRlbihtYWtlU3RhdGVNYWNoaW5lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdGF0ZU1hY2hpbmUiOlsibWFrZVN0YXRlTWFjaGluZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACNGVQXBgYAAAYGAAA1AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImNhbGN1bGF0ZU1lZGlhbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUeXBlZE1hdGhcbiAqIEBwcm9wZXJ0eSB7KGE6IFQsIGI6IFQpID0+IFR9IGFkZFxuICogQHByb3BlcnR5IHsoYTogVCwgYjogYmlnaW50KSA9PiBUfSBkaXZpZGVcbiAqIEBwcm9wZXJ0eSB7KGE6IFQsIGI6IFQpID0+IGJvb2xlYW59IGlzR1RFXG4gKi9cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG1lZGlhbiBvZiBhIHNldCBvZiBzYW1wbGVzXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7QXJyYXk8VD59IHNhbXBsZXMgdGhlIGlucHV0IG1lYXN1cmVtZW50c1xuICogQHBhcmFtIHtUeXBlZE1hdGg8VD59IG1hdGhcbiAqIEByZXR1cm5zIHtUIHwgdW5kZWZpbmVkfSB0aGUgbWVkaWFuICh1bmRlZmluZWQgaWYgbm8gc2FtcGxlcylcbiAqL1xuICAgICAgIGNvbnN0IGNhbGN1bGF0ZU1lZGlhbiA9IChzYW1wbGVzLCBtYXRoKSA9PiB7XG4gIGNvbnN0IHNvcnRlZCA9IHNhbXBsZXMuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmICghbWF0aC5pc0dURShhLCBiKSkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gZWxzZSBpZiAoIW1hdGguaXNHVEUoYiwgYSkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSk7XG5cbiAgaWYgKHNvcnRlZC5sZW5ndGggPT09IDApIHtcbiAgICAvKiBObyB2YWxpZCBzYW1wbGVzLCBkb24ndCByZXBvcnQgYW55dGhpbmcuKi9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHNvcnRlZC5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgLyogT2RkIGxlbmd0aCwganVzdCBwaWNrIHRoZSBtaWRkbGUgZWxlbWVudC4qL1xuICAgIHJldHVybiBzb3J0ZWRbKHNvcnRlZC5sZW5ndGggLSAxKSAvIDJdO1xuICB9XG5cbiAgLyogRXZlbiBsZW5ndGgsIHRha2UgdGhlIG1lYW4gb2YgdGhlIHR3byBtaWRkbGUgdmFsdWVzLiovXG4gIGNvbnN0IHNlY29uZEluZGV4ID0gc29ydGVkLmxlbmd0aCAvIDI7XG4gIGNvbnN0IHN1bSA9IG1hdGguYWRkKHNvcnRlZFtzZWNvbmRJbmRleCAtIDFdLCBzb3J0ZWRbc2Vjb25kSW5kZXhdKTtcbiAgcmV0dXJuIG1hdGguZGl2aWRlKHN1bSwgMm4pO1xufTskaM2PX29uY2UuY2FsY3VsYXRlTWVkaWFuKGNhbGN1bGF0ZU1lZGlhbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjYWxjdWxhdGVNZWRpYW4iOlsiY2FsY3VsYXRlTWVkaWFuIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGMIy9S/CQAAvwkAADEAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsiUHVibGljVG9waWNTaGFwZSIsIlN1YnNjcmliZXJTaGFwZSIsIlRvcGljc1JlY29yZFNoYXBlIiwibWFrZVJlY29yZGVyVG9waWMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBTdWJzY3JpYmVyU2hhcGUsTSxFOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsWyRozY9fYSA9PiAoU3Vic2NyaWJlclNoYXBlID0gJGjNj19hKSwkaM2PX2xpdmVbXCJTdWJzY3JpYmVyU2hhcGVcIl1dXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICBjb25zdCBQdWJsaWNUb3BpY1NoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIHN1YnNjcmliZXI6IFN1YnNjcmliZXJTaGFwZSxcbiAgICBzdG9yYWdlUGF0aDogTS5vcihNLnByb21pc2UoLyogc3RyaW5nICovKSwgTS5zdHJpbmcoKSksXG4gIH0sXG4gIHsgZGVzY3JpcHRpb246IE0uc3RyaW5nKCkgfSxcbik7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFQgdG9waWMgdmFsdWVcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICogICBzdWJzY3JpYmVyOiBTdWJzY3JpYmVyPFQ+LFxuICogICBzdG9yYWdlUGF0aDogRVJlZjxzdHJpbmc+LFxuICogfX0gUHVibGljVG9waWNcbiAqL1xuXG4vKipcbiAqIEEge1B1YmxpY1RvcGljfSBpbiB3aGljaCB0aGUgYHN0b3JhZ2VQYXRoYCBpcyBhbHdheXMgYSByZXNvbHZlZCBzdHJpbmcgYW5kIHRoZSBgc3Vic2NyaWJlciBpcyByZW1vdGUuXG4gKlxuICogVXNlZnVsIHdoZW4gd29ya2luZyB3aXRoIFZvd3MgYW5kIGFzeW5jLWZsb3cuXG4gKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFQgdG9waWMgdmFsdWVcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICogICBzdWJzY3JpYmVyOiBSZW1vdGU8U3Vic2NyaWJlcjxUPj4sXG4gKiAgIHN0b3JhZ2VQYXRoOiBzdHJpbmcsXG4gKiB9fSBSZXNvbHZlZFB1YmxpY1RvcGljXG4gKi8kaM2PX29uY2UuUHVibGljVG9waWNTaGFwZShQdWJsaWNUb3BpY1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFRvcGljc1JlY29yZFNoYXBlID0gTS5yZWNvcmRPZihNLnN0cmluZygpLCBQdWJsaWNUb3BpY1NoYXBlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBbdG9waWNOYW1lOiBzdHJpbmddOiBQdWJsaWNUb3BpYzx1bmtub3duPixcbiAqIH19IFRvcGljc1JlY29yZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqICAgW3RvcGljTmFtZTogc3RyaW5nXTogUmVzb2x2ZWRQdWJsaWNUb3BpYzx1bmtub3duPixcbiAqIH19IFJlc29sdmVkVG9waWNzUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXG4gKiBAcGFyYW0ge1JlY29yZGVyS2l0PFQ+IHwgRXZlbnR1YWxSZWNvcmRlcktpdDxUPn0gcmVjb3JkZXJLaXRcbiAqIEByZXR1cm5zIHtQdWJsaWNUb3BpYzxUPn1cbiAqLyRozY9fb25jZS5Ub3BpY3NSZWNvcmRTaGFwZShUb3BpY3NSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgbWFrZVJlY29yZGVyVG9waWMgPSAoZGVzY3JpcHRpb24sIHJlY29yZGVyS2l0KSA9PiB7XG4gIGNvbnN0IHJlY1AgPVxuICAgICdyZWNvcmRlcicgaW4gcmVjb3JkZXJLaXQgPyByZWNvcmRlcktpdC5yZWNvcmRlciA6IHJlY29yZGVyS2l0LnJlY29yZGVyUDtcbiAgcmV0dXJuIHtcbiAgICBkZXNjcmlwdGlvbixcbiAgICBzdWJzY3JpYmVyOiByZWNvcmRlcktpdC5zdWJzY3JpYmVyLFxuICAgIHN0b3JhZ2VQYXRoOiBFKHJlY1ApLmdldFN0b3JhZ2VQYXRoKCksXG4gIH07XG59OyRozY9fb25jZS5tYWtlUmVjb3JkZXJUb3BpYyhtYWtlUmVjb3JkZXJUb3BpYyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIixmYWxzZV19LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHVibGljVG9waWNTaGFwZSI6WyJQdWJsaWNUb3BpY1NoYXBlIl0sIlRvcGljc1JlY29yZFNoYXBlIjpbIlRvcGljc1JlY29yZFNoYXBlIl0sIm1ha2VSZWNvcmRlclRvcGljIjpbIm1ha2VSZWNvcmRlclRvcGljIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMGuU3CTPQAAkz0AADUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvem9lSGVscGVycy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIi4uL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanMiLCIuL2F0b21pY1RyYW5zZmVyLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0SXNzdWVyS2V5d29yZHMiLCJhc3NlcnROYXRBc3NldEtpbmQiLCJhc3NlcnRQcm9wb3NhbFNoYXBlIiwiZGVmYXVsdEFjY2VwdGFuY2VNc2ciLCJkZXBvc2l0VG9TZWF0IiwiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciLCJmaXRQcm9wb3NhbFNoYXBlIiwibWFwS2V5d29yZHMiLCJvZmZlclRvIiwic2F0aXNmaWVzIiwic2F2ZUFsbElzc3VlcnMiLCJzd2FwIiwic3dhcEV4YWN0Iiwid2l0aGRyYXdGcm9tU2VhdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEFzc2V0S2luZCxmcm9tVW5pcXVlRW50cmllcyxrZXlFUSxtdXN0TWF0Y2gsRmFpbCxFLG1ha2VQcm9taXNlS2l0LHNhdGlzZmllc1dhbnQsYXRvbWljVHJhbnNmZXIsZnJvbU9ubHksdG9Pbmx5OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBc3NldEtpbmRcIixbJGjNj19hID0+IChBc3NldEtpbmQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJmcm9tVW5pcXVlRW50cmllc1wiLFskaM2PX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIi4uL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanNcIiwgW1tcInNhdGlzZmllc1dhbnRcIixbJGjNj19hID0+IChzYXRpc2ZpZXNXYW50ID0gJGjNj19hKV1dXV0sW1wiLi9hdG9taWNUcmFuc2Zlci5qc1wiLCBbW1wiYXRvbWljVHJhbnNmZXJcIixbJGjNj19hID0+IChhdG9taWNUcmFuc2ZlciA9ICRozY9fYSldXSxbXCJmcm9tT25seVwiLFskaM2PX2EgPT4gKGZyb21Pbmx5ID0gJGjNj19hKV1dLFtcInRvT25seVwiLFskaM2PX2EgPT4gKHRvT25seSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXR0ZXJufSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtBbW91bnRLZXl3b3JkUmVjb3JkLCBDb250cmFjdE1ldGEsIEludml0YXRpb24sIElzc3VlcktleXdvcmRSZWNvcmQsIEtleXdvcmQsIFBheW1lbnRQS2V5d29yZFJlY29yZCwgUHJvcG9zYWwsIFByb3Bvc2FsUmVjb3JkLCBVc2VyU2VhdCwgWkNGLCBaQ0ZTZWF0fSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtLZXl3b3JkS2V5d29yZFJlY29yZCwgTWFwS2V5d29yZHMsIFJldmVyc2UsIFN3YXAsIFN3YXBFeGFjdH0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtBbGxvY2F0aW9ufSBmcm9tICcuLi9jb250cmFjdEZhY2V0L3R5cGVzLnRzJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG4gICAgICAgY29uc3QgZGVmYXVsdEFjY2VwdGFuY2VNc2cgPSBgVGhlIG9mZmVyIGhhcyBiZWVuIGFjY2VwdGVkLiBPbmNlIHRoZSBjb250cmFjdCBoYXMgYmVlbiBjb21wbGV0ZWQsIHBsZWFzZSBjaGVjayB5b3VyIHBheW91dGA7JGjNj19vbmNlLmRlZmF1bHRBY2NlcHRhbmNlTXNnKGRlZmF1bHRBY2NlcHRhbmNlTXNnKTtcblxuY29uc3QgZ2V0S2V5c1NvcnRlZCA9IG9iaiA9PiBoYXJkZW4oUmVmbGVjdC5vd25LZXlzKG9iaiB8fCB7fSkuc29ydCgpKTtcblxuICAgICAgIGNvbnN0IGFzc2VydElzc3VlcktleXdvcmRzID0gKHpjZiwgZXhwZWN0ZWQpID0+IHtcbiAgY29uc3QgeyBpc3N1ZXJzIH0gPSB6Y2YuZ2V0VGVybXMoKTtcbiAgY29uc3QgYWN0dWFsID0gZ2V0S2V5c1NvcnRlZChpc3N1ZXJzKTtcbiAgZXhwZWN0ZWQgPSBbLi4uZXhwZWN0ZWRdOyAvKiBpbiBjYXNlIGhhcmRlbmVkKi9cbiAgZXhwZWN0ZWQuc29ydCgpO1xuICBrZXlFUShhY3R1YWwsIGhhcmRlbihleHBlY3RlZCkpIHx8XG4gICAgRmFpbGBrZXl3b3JkczogJHthY3R1YWx9IHdlcmUgbm90IGFzIGV4cGVjdGVkOiAke2V4cGVjdGVkfWA7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpjZlNlYXRQYXJ0aWFsXG4gKiBAcHJvcGVydHkgeygpID0+IFByb3Bvc2FsUmVjb3JkfSBnZXRQcm9wb3NhbFxuICogQHByb3BlcnR5IHsoKSA9PiBBbGxvY2F0aW9ufSBnZXRDdXJyZW50QWxsb2NhdGlvblxuICovXG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhbiB1cGRhdGUgdG8gY3VycmVudEFsbG9jYXRpb24gc2F0aXNmaWVzXG4gKiBwcm9wb3NhbC53YW50LiBOb3RlIHRoYXQgdGhpcyBpcyBoYWxmIG9mIHRoZSBvZmZlciBzYWZldHlcbiAqIGNoZWNrOyB3aGV0aGVyIHRoZSBhbGxvY2F0aW9uIGNvbnN0aXR1dGVzIGEgcmVmdW5kIGlzIG5vdFxuICogY2hlY2tlZC4gVGhlIHVwZGF0ZSBpcyBtZXJnZWQgd2l0aCBjdXJyZW50QWxsb2NhdGlvblxuICogKHVwZGF0ZSdzIHZhbHVlcyBwcmV2YWlsaW5nIGlmIHRoZSBrZXl3b3JkcyBhcmUgdGhlIHNhbWUpXG4gKiB0byBwcm9kdWNlIHRoZSBuZXdBbGxvY2F0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIDAgZm9yXG4gKiBmYWxzZSBhbmQgMSBmb3IgdHJ1ZS4gV2hlbiBtdWx0aXBsZXMgYXJlIGludHJvZHVjZWQsIGFueVxuICogcG9zaXRpdmUgcmV0dXJuIHZhbHVlIHdpbGwgbWVhbiB0cnVlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBfaWdub3JlZCBubyBsb25nZXIgdXNlZC5cbiAqIEBwYXJhbSB7WmNmU2VhdFBhcnRpYWx9IHNlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gdXBkYXRlXG4gKiBAcmV0dXJucyB7MHwxfVxuICovJGjNj19vbmNlLmFzc2VydElzc3VlcktleXdvcmRzKGFzc2VydElzc3VlcktleXdvcmRzKTtcbiAgICAgICBjb25zdCBzYXRpc2ZpZXMgPSAoX2lnbm9yZWQsIHNlYXQsIHVwZGF0ZSkgPT4ge1xuICBjb25zdCBjdXJyZW50QWxsb2NhdGlvbiA9IHNlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKTtcbiAgY29uc3QgbmV3QWxsb2NhdGlvbiA9IHsgLi4uY3VycmVudEFsbG9jYXRpb24sIC4uLnVwZGF0ZSB9O1xuICBjb25zdCBwcm9wb3NhbCA9IHNlYXQuZ2V0UHJvcG9zYWwoKTtcbiAgcmV0dXJuIHNhdGlzZmllc1dhbnQocHJvcG9zYWwsIG5ld0FsbG9jYXRpb24pO1xufTtcblxuLyoqIEB0eXBlIHtTd2FwfSAqLyRozY9fb25jZS5zYXRpc2ZpZXMoc2F0aXNmaWVzKTtcbiAgICAgICBjb25zdCBzd2FwID0gKHpjZiwgbGVmdFNlYXQsIHJpZ2h0U2VhdCkgPT4ge1xuICB0cnkge1xuICAgIHpjZi5hdG9taWNSZWFycmFuZ2UoXG4gICAgICBoYXJkZW4oW1xuICAgICAgICBbcmlnaHRTZWF0LCBsZWZ0U2VhdCwgbGVmdFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50XSxcbiAgICAgICAgW2xlZnRTZWF0LCByaWdodFNlYXQsIHJpZ2h0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnRdLFxuICAgICAgXSksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbGVmdFNlYXQuZmFpbChlcnIpO1xuICAgIHJpZ2h0U2VhdC5mYWlsKGVycik7XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgbGVmdFNlYXQuZXhpdCgpO1xuICByaWdodFNlYXQuZXhpdCgpO1xuICByZXR1cm4gZGVmYXVsdEFjY2VwdGFuY2VNc2c7XG59O1xuXG4vKiogQHR5cGUge1N3YXBFeGFjdH0gKi8kaM2PX29uY2Uuc3dhcChzd2FwKTtcbiAgICAgICBjb25zdCBzd2FwRXhhY3QgPSAoemNmLCBsZWZ0U2VhdCwgcmlnaHRTZWF0KSA9PiB7XG4gIHRyeSB7XG4gICAgemNmLmF0b21pY1JlYXJyYW5nZShcbiAgICAgIGhhcmRlbihbXG4gICAgICAgIGZyb21Pbmx5KHJpZ2h0U2VhdCwgcmlnaHRTZWF0LmdldFByb3Bvc2FsKCkuZ2l2ZSksXG4gICAgICAgIGZyb21Pbmx5KGxlZnRTZWF0LCBsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLmdpdmUpLFxuXG4gICAgICAgIHRvT25seShsZWZ0U2VhdCwgbGVmdFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KSxcbiAgICAgICAgdG9Pbmx5KHJpZ2h0U2VhdCwgcmlnaHRTZWF0LmdldFByb3Bvc2FsKCkud2FudCksXG4gICAgICBdKSxcbiAgICApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsZWZ0U2VhdC5mYWlsKGVycik7XG4gICAgcmlnaHRTZWF0LmZhaWwoZXJyKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBsZWZ0U2VhdC5leGl0KCk7XG4gIHJpZ2h0U2VhdC5leGl0KCk7XG4gIHJldHVybiBkZWZhdWx0QWNjZXB0YW5jZU1zZztcbn07XG5cbi8qKlxuICogQHR5cGVkZWYgRXhwZWN0ZWRSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPEtleXdvcmQsIG51bGw+fSBbd2FudF1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPEtleXdvcmQsIG51bGw+fSBbZ2l2ZV1cbiAqIEBwcm9wZXJ0eSB7UGFydGlhbDxSZWNvcmQ8a2V5b2YgUHJvcG9zYWxSZWNvcmRbJ2V4aXQnXSwgbnVsbD4+fSBbZXhpdF1cbiAqL1xuXG4vKipcbiAqIENoZWNrIHRoZSBzZWF0J3MgcHJvcG9zYWwgYWdhaW5zdCBgcHJvcG9zYWxTaGFwZWAuXG4gKiBJZiB0aGUgY2xpZW50IHN1Ym1pdHMgYW4gb2ZmZXIgd2hpY2ggZG9lcyBub3QgbWF0Y2hcbiAqIHRoZXNlIGV4cGVjdGF0aW9ucywgdGhlIHNlYXQgd2lsbCBiZSBleGl0ZWQgKGFuZCBwYXltZW50cyByZWZ1bmRlZCkuXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcGFyYW0ge1BhdHRlcm59IHByb3Bvc2FsU2hhcGVcbiAqLyRozY9fb25jZS5zd2FwRXhhY3Qoc3dhcEV4YWN0KTtcbiAgICAgICBjb25zdCBmaXRQcm9wb3NhbFNoYXBlID0gKHNlYXQsIHByb3Bvc2FsU2hhcGUpID0+XG4gIC8qIFRPRE8gcmVtb3ZlIHRoaXMgaGFyZGVuLCBvYmxpZ2F0aW5nIG91ciBjYWxsZXIgdG8gaGFyZGVuLiovXG4gIG11c3RNYXRjaChzZWF0LmdldFByb3Bvc2FsKCksIGhhcmRlbihwcm9wb3NhbFNoYXBlKSwgJ3Byb3Bvc2FsJyk7XG5cbi8qKlxuICogQ2hlY2sgdGhlIHNlYXQncyBwcm9wb3NhbCBhZ2FpbnN0IGFuIGBleHBlY3RlZGAgcmVjb3JkIHRoYXQgc2F5c1xuICogd2hhdCBcInNoYXBlXCIgb2YgcHJvcG9zYWwgaXMgYWNjZXB0YWJsZS5cbiAqXG4gKiBOb3RlIHRoYXQgYnkgb3VyIGN1cnJlbnQgdGVybWlub2xvZ3ksIHRoaXMgZnVuY3Rpb24gaXMgbWlzbmFtZWQgYmVjYXVzZVxuICogd2UgdXNlXG4gKiBbXCJTaGFwZVwiIHRvIHJlZmVyIHRvIHBhdHRlcm5zXShodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvYmxvYi9tYXN0ZXIvcGFja2FnZXMvc3RvcmUvc3JjL3R5cGVzLmpzI0w1Ni1MNzQpLFxuICogYW5kIHRoZSBgZXhwZWN0ZWRgIGFyZ3VtZW50IGlzIG5vdCBzdWNoIGEgcGF0dGVybi4gUmF0aGVyIGl0IGlzIGFuIGFkLWhvY1xuICogcGF0dGVybi1saWtlIHNwZWNpYWwgY2FzZSByZWNvcmQgdGhhdCBpcyBkaWZmZXJlbnQgYW5kIG11Y2ggbGVzcyBleHByZXNzaXZlLlxuICpcbiAqIFRoaXMgRXhwZWN0ZWRSZWNvcmQgaXMgbGlrZSBhIFByb3Bvc2FsLCBidXQgdGhlIGFtb3VudHMgaW4gJ3dhbnQnXG4gKiBhbmQgJ2dpdmUnIHNob3VsZCBiZSBudWxsOyB0aGUgZXhpdCBjbGF1c2Ugc2hvdWxkIHNwZWNpZnkgYSBydWxlIHdpdGhcbiAqIG51bGwgY29udGVudHMuIElmIHRoZSBjbGllbnQgc3VibWl0cyBhbiBvZmZlciB3aGljaCBkb2VzIG5vdCBtYXRjaFxuICogdGhlc2UgZXhwZWN0YXRpb25zLCB0aGUgc2VhdCB3aWxsIGJlIGV4aXRlZCAoYW5kIHBheW1lbnRzIHJlZnVuZGVkKS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Ugb3B0aW9uYWwgYHByb3Bvc2FsU2hhcGVgIGFyZ3VtZW50IHRvIGBtYWtlSW52aXRhdGlvbmAgd2l0aFxuICogYSBnZW51aW5lIHBhdHRlcm4uXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7RXhwZWN0ZWRSZWNvcmR9IGV4cGVjdGVkXG4gKi8kaM2PX29uY2UuZml0UHJvcG9zYWxTaGFwZShmaXRQcm9wb3NhbFNoYXBlKTtcbiAgICAgICBjb25zdCBhc3NlcnRQcm9wb3NhbFNoYXBlID0gKHNlYXQsIGV4cGVjdGVkKSA9PiB7XG4gIGFzc2VydC50eXBlb2YoZXhwZWN0ZWQsICdvYmplY3QnKTtcbiAgIUFycmF5LmlzQXJyYXkoZXhwZWN0ZWQpIHx8IEZhaWxgRXhwZWN0ZWQgbXVzdCBiZSBhbiBub24tYXJyYXkgb2JqZWN0YDtcbiAgY29uc3QgYXNzZXJ0VmFsdWVzTnVsbCA9IGUgPT4ge1xuICAgIGlmIChlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgT2JqZWN0LnZhbHVlcyhlKSkge1xuICAgICAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgICAgIEZhaWxgVGhlIHZhbHVlIG9mIHRoZSBleHBlY3RlZCByZWNvcmQgbXVzdCBiZSBudWxsIGJ1dCB3YXMgJHt2YWx1ZX1gO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKiBBc3NlcnQgdmFsdWVzIG9mIHRoZSBleHBlY3RlZCByZWNvcmQgYXJlIGFsbCBudWxsLiBXZSBkbyBub3QqL1xuICAvKiBjaGVjayB0aGUgdmFsdWVzIG9mIHRoZSBhY3R1YWwgcHJvcG9zYWwuKi9cbiAgYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC5naXZlKTtcbiAgYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC53YW50KTtcbiAgYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC5leGl0KTtcblxuICBjb25zdCBhY3R1YWwgPSBzZWF0LmdldFByb3Bvc2FsKCk7XG4gIGNvbnN0IGFzc2VydEtleXMgPSAoYSwgZSkgPT4ge1xuICAgIGlmIChlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGtleUVRKGdldEtleXNTb3J0ZWQoYSksIGdldEtleXNTb3J0ZWQoZSkpIHx8XG4gICAgICAgIEZhaWxgYWN0dWFsICR7YX0gZGlkIG5vdCBtYXRjaCBleHBlY3RlZCAke2V9YDtcbiAgICB9XG4gIH07XG4gIGFzc2VydEtleXMoYWN0dWFsLmdpdmUsIGV4cGVjdGVkLmdpdmUpO1xuICBhc3NlcnRLZXlzKGFjdHVhbC53YW50LCBleHBlY3RlZC53YW50KTtcbiAgYXNzZXJ0S2V5cyhhY3R1YWwuZXhpdCwgZXhwZWN0ZWQuZXhpdCk7XG59O1xuXG4vKiBHaXZlbiBhIGJyYW5kLCBhc3NlcnQgdGhhdCBicmFuZCBpcyBBc3NldEtpbmQuTkFULiAqLyRozY9fb25jZS5hc3NlcnRQcm9wb3NhbFNoYXBlKGFzc2VydFByb3Bvc2FsU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydE5hdEFzc2V0S2luZCA9ICh6Y2YsIGJyYW5kKSA9PiB7XG4gIHpjZi5nZXRBc3NldEtpbmQoYnJhbmQpID09PSBBc3NldEtpbmQuTkFUIHx8XG4gICAgRmFpbGBicmFuZCBtdXN0IGJlIEFzc2V0S2luZC5OQVRgO1xufTskaM2PX29uY2UuYXNzZXJ0TmF0QXNzZXRLaW5kKGFzc2VydE5hdEFzc2V0S2luZCk7XG5cbiAgICAgICBjb25zdCBkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyA9IGBEZXBvc2l0IGFuZCByZWFsbG9jYXRpb24gc3VjY2Vzc2Z1bC5gO1xuXG4vKipcbiAqIERlcG9zaXQgcGF5bWVudHMgc3VjaCB0aGF0IHRoZWlyIGFtb3VudHMgYXJlIHJlYWxsb2NhdGVkIHRvIGEgc2VhdC5cbiAqIFRoZSBgYW1vdW50c2AgYW5kIGBwYXltZW50c2AgcmVjb3JkcyBtdXN0IGhhdmUgY29ycmVzcG9uZGluZ1xuICoga2V5d29yZHMuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSByZWNpcGllbnRTZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFtb3VudHNcbiAqIEBwYXJhbSB7UGF5bWVudFBLZXl3b3JkUmVjb3JkfSBwYXltZW50c1xuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gYERlcG9zaXQgYW5kIHJlYWxsb2NhdGlvbiBzdWNjZXNzZnVsLmBcbiAqLyRozY9fb25jZS5kZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyhkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyk7XG4gICAgICAgY29uc3QgZGVwb3NpdFRvU2VhdCA9IGFzeW5jICh6Y2YsIHJlY2lwaWVudFNlYXQsIGFtb3VudHMsIHBheW1lbnRzKSA9PiB7XG4gICFyZWNpcGllbnRTZWF0Lmhhc0V4aXRlZCgpIHx8IEZhaWxgVGhlIHJlY2lwaWVudFNlYXQgY2Fubm90IGhhdmUgZXhpdGVkLmA7XG5cbiAgLyogV2Ugd2lsbCBjcmVhdGUgYSB0ZW1wb3Jhcnkgb2ZmZXIgdG8gYmUgYWJsZSB0byBlc2Nyb3cgb3VyIHBheW1lbnRzKi9cbiAgLyogd2l0aCBab2UuKi9cbiAgY29uc3QgcmVhbGxvY2F0ZUFmdGVyRGVwb3NpdCA9IHRlbXBTZWF0ID0+IHtcbiAgICAvKiBBZnRlciB0aGUgYXNzZXRzIGFyZSBkZXBvc2l0ZWQsIHJlYWxsb2NhdGUgdGhlbSBvbnRvIHRoZSByZWNpcGllbnQgc2VhdCBhbmQqL1xuICAgIC8qIGV4aXQgdGhlIHRlbXBvcmFyeSBzZWF0LiBOb3RlIHRoYXQgdGhlIG9mZmVyUmVzdWx0IGlzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyovXG4gICAgLyogZnVuY3Rpb24sIHNvIHRoaXMgc3luY2hyb25vdXMgdHJhZGUgbXVzdCBoYXBwZW4gYmVmb3JlIHRoZSovXG4gICAgLyogb2ZmZXJSZXN1bHQgcmVzb2x2ZXMuKi9cbiAgICBhdG9taWNUcmFuc2Zlcih6Y2YsIHRlbXBTZWF0LCByZWNpcGllbnRTZWF0LCBhbW91bnRzKTtcbiAgICB0ZW1wU2VhdC5leGl0KCk7XG4gICAgcmV0dXJuIGRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnO1xuICB9O1xuICBjb25zdCBpbnZpdGF0aW9uID0gemNmLm1ha2VJbnZpdGF0aW9uKFxuICAgIHJlYWxsb2NhdGVBZnRlckRlcG9zaXQsXG4gICAgJ3RlbXBvcmFyeSBzZWF0IGZvciBkZXBvc2l0JyxcbiAgKTtcbiAgY29uc3QgcHJvcG9zYWwgPSBoYXJkZW4oeyBnaXZlOiBhbW91bnRzIH0pO1xuICBoYXJkZW4ocGF5bWVudHMpO1xuICAvKiBUbyBlc2Nyb3cgdGhlIHBheW1lbnQsIHdlIG11c3QgZ2V0IHRoZSBab2UgU2VydmljZSBmYWNldCBhbmQqL1xuICAvKiBtYWtlIGFuIG9mZmVyKi9cbiAgY29uc3Qgem9lID0gemNmLmdldFpvZVNlcnZpY2UoKTtcbiAgY29uc3QgdGVtcFVzZXJTZWF0ID0gRSh6b2UpLm9mZmVyKGludml0YXRpb24sIHByb3Bvc2FsLCBwYXltZW50cyk7XG4gIC8qIFRoaXMgd2lsbCBiZSBhIHByb21pc2UgZm9yIHRoZSBzdHJpbmc6IGBEZXBvc2l0IGFuZCByZWFsbG9jYXRpb24qL1xuICAvKiBzdWNjZXNzZnVsLmAgSXQgd2lsbCBvbmx5IGZ1bGZpbGwgYWZ0ZXIgdGhlIGFzc2V0cyBoYXZlIGJlZW4qL1xuICAvKiBzdWNjZXNzZnVsbHkgcmVhbGxvY2F0ZWQgdG8gdGhlIHJlY2lwaWVudCBzZWF0LiovXG4gIHJldHVybiBFKHRlbXBVc2VyU2VhdCkuZ2V0T2ZmZXJSZXN1bHQoKTtcbn07XG5cbi8qKlxuICogV2l0aGRyYXcgcGF5bWVudHMgZnJvbSBhIHNlYXQuIE5vdGUgdGhhdCB3aXRoZHJhd2luZyB0aGUgYW1vdW50cyBvZlxuICogdGhlIHBheW1lbnRzIG11c3Qgbm90IGFuZCBjYW5ub3QgdmlvbGF0ZSBvZmZlciBzYWZldHkgZm9yIHRoZSBzZWF0LiBUaGVcbiAqIGBhbW91bnRzYCBhbmQgYHBheW1lbnRzYCByZWNvcmRzIG11c3QgaGF2ZSBjb3JyZXNwb25kaW5nIGtleXdvcmRzLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbW91bnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50UEtleXdvcmRSZWNvcmQ+fVxuICovJGjNj19vbmNlLmRlcG9zaXRUb1NlYXQoZGVwb3NpdFRvU2VhdCk7XG4gICAgICAgY29uc3Qgd2l0aGRyYXdGcm9tU2VhdCA9IGFzeW5jICh6Y2YsIHNlYXQsIGFtb3VudHMpID0+IHtcbiAgIXNlYXQuaGFzRXhpdGVkKCkgfHwgRmFpbGBUaGUgc2VhdCBjYW5ub3QgaGF2ZSBleGl0ZWQuYDtcbiAgY29uc3QgeyB6Y2ZTZWF0OiB0ZW1wU2VhdCwgdXNlclNlYXQ6IHRlbXBVc2VyU2VhdFAgfSA9IHpjZi5tYWtlRW1wdHlTZWF0S2l0KCk7XG4gIGF0b21pY1RyYW5zZmVyKHpjZiwgc2VhdCwgdGVtcFNlYXQsIGFtb3VudHMpO1xuICB0ZW1wU2VhdC5leGl0KCk7XG4gIHJldHVybiBFKHRlbXBVc2VyU2VhdFApLmdldFBheW91dHMoKTtcbn07XG5cbi8qKlxuICogU2F2ZSBhbGwgb2YgdGhlIGlzc3VlcnMgaW4gYW4gaXNzdWVyc0tleXdvcmRSZWNvcmQgdG8gWkNGLCB1c2luZ1xuICogdGhlIG1ldGhvZCBgemNmLnNhdmVJc3N1ZXJgLiBUaGlzIGRvZXMgbm90IGVycm9yIGlmIGFueSBvZiB0aGUga2V5d29yZHNcbiAqIGFscmVhZHkgZXhpc3QuIElmIHRoZSBrZXl3b3JkIGlzIGFscmVhZHkgcHJlc2VudCwgaXQgaXMgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0lzc3VlcktleXdvcmRSZWNvcmR9IGlzc3VlcktleXdvcmRSZWNvcmQgSXNzdWVycyB0byBzYXZlIHRvXG4gKiBaQ0ZcbiAqLyRozY9fb25jZS53aXRoZHJhd0Zyb21TZWF0KHdpdGhkcmF3RnJvbVNlYXQpO1xuICAgICAgIGNvbnN0IHNhdmVBbGxJc3N1ZXJzID0gYXN5bmMgKHpjZiwgaXNzdWVyS2V5d29yZFJlY29yZCA9IGhhcmRlbih7fSkpID0+IHtcbiAgY29uc3QgeyBpc3N1ZXJzIH0gPSB6Y2YuZ2V0VGVybXMoKTtcbiAgY29uc3QgaXNzdWVyc1BTYXZlZCA9IE9iamVjdC5lbnRyaWVzKGlzc3VlcktleXdvcmRSZWNvcmQpLm1hcChcbiAgICAoW2tleXdvcmQsIGlzc3Vlcl0pID0+IHtcbiAgICAgIC8qIElmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHlldCBleGlzdCwgYWRkIGl0IGFuZCB0aGUqL1xuICAgICAgLyogYXNzb2NpYXRlZCBpc3N1ZXIuKi9cbiAgICAgIGlmIChpc3N1ZXJzW2tleXdvcmRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHpjZi5zYXZlSXNzdWVyKGlzc3Vlciwga2V5d29yZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG4gICk7XG4gIHJldHVybiBQcm9taXNlLmFsbChpc3N1ZXJzUFNhdmVkKTtcbn07XG5cbi8qKiBAdHlwZSB7TWFwS2V5d29yZHN9ICovJGjNj19vbmNlLnNhdmVBbGxJc3N1ZXJzKHNhdmVBbGxJc3N1ZXJzKTtcbiAgICAgICBjb25zdCBtYXBLZXl3b3JkcyA9IChrZXl3b3JkUmVjb3JkID0ge30sIGtleXdvcmRNYXBwaW5nKSA9PiB7XG4gIHJldHVybiBoYXJkZW4oXG4gICAgZnJvbVVuaXF1ZUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhrZXl3b3JkUmVjb3JkKS5tYXAoKFtrZXl3b3JkLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGtleXdvcmRNYXBwaW5nW2tleXdvcmRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gW2tleXdvcmQsIHZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2tleXdvcmRNYXBwaW5nW2tleXdvcmRdLCB2YWx1ZV07XG4gICAgICB9KSxcbiAgICApLFxuICApO1xufTtcbi8qKiBAdHlwZSB7UmV2ZXJzZX0gKi8kaM2PX29uY2UubWFwS2V5d29yZHMobWFwS2V5d29yZHMpO1xuY29uc3QgcmV2ZXJzZSA9IChrZXl3b3JkUmVjb3JkID0ge30pID0+IHtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBmcm9tVW5pcXVlRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGtleXdvcmRSZWNvcmQpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbdmFsdWUsIGtleV0pLFxuICAgICksXG4gICk7XG59O1xuXG4vKipcbiAqIE1ha2UgYW4gb2ZmZXIgdG8gYW5vdGhlciBjb250cmFjdCBpbnN0YW5jZSAobGFiZWxlZCBjb250cmFjdEIgYmVsb3cpLFxuICogd2l0aGRyYXdpbmcgdGhlIHBheW1lbnRzIGZvciB0aGUgb2ZmZXIgZnJvbSBhIHNlYXQgaW4gdGhlIGN1cnJlbnRcbiAqIGNvbnRyYWN0IGluc3RhbmNlIChjb250cmFjdEEpIGFuZCBkZXBvc2l0aW5nIHRoZSBwYXlvdXRzIGluIGFub3RoZXJcbiAqIHNlYXQgaW4gdGhlIGN1cnJlbnQgY29udHJhY3QgaW5zdGFuY2UgKGNvbnRyYWN0QSkuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogICBab2UgQ29udHJhY3QgRmFjZXQgZm9yIGNvbnRyYWN0QVxuICpcbiAqIEBwYXJhbSB7RVJlZjxJbnZpdGF0aW9uPFJlc3VsdCwgQXJncz4+fSBpbnZpdGF0aW9uXG4gKiAgIEludml0YXRpb24gdG8gY29udHJhY3RCXG4gKlxuICogQHBhcmFtIHtLZXl3b3JkS2V5d29yZFJlY29yZCB8IHVuZGVmaW5lZH0ga2V5d29yZE1hcHBpbmdcbiAqICAgTWFwcGluZyBvZiBrZXl3b3JkcyB1c2VkIGluIGNvbnRyYWN0QSB0byBrZXl3b3JkcyB0byBiZSB1c2VkIGluXG4gKiAgIGNvbnRyYWN0Qi4gTm90ZSB0aGF0IHRoZSBwYXRod2F5IHRvIGRlcG9zaXQgdGhlIHBheW91dCBiYWNrIHRvXG4gKiAgIGNvbnRyYWN0QSByZXZlcnNlcyB0aGlzIG1hcHBpbmcuXG4gKlxuICogQHBhcmFtIHtQcm9wb3NhbH0gcHJvcG9zYWxcbiAqICAgVGhlIHByb3Bvc2FsIGZvciB0aGUgb2ZmZXIgdG8gYmUgbWFkZSB0byBjb250cmFjdEJcbiAqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGZyb21TZWF0XG4gKiAgIFRoZSBzZWF0IGluIGNvbnRyYWN0QSB0byB0YWtlIHRoZSBvZmZlciBwYXltZW50cyBmcm9tLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gW3RvU2VhdF1cbiAqICAgVGhlIHNlYXQgaW4gY29udHJhY3RBIHRvIGRlcG9zaXQgdGhlIHBheW91dCBvZiB0aGUgb2ZmZXIgdG8uXG4gKiAgIElmIGB0b1NlYXRgIGlzIG5vdCBwcm92aWRlZCwgdGhpcyBkZWZhdWx0cyB0byB0aGUgYGZyb21TZWF0YC5cbiAqXG4gKiBAcGFyYW0ge0FyZ3N9IFtvZmZlckFyZ3NdXG4gKiAgIEFkZGl0aW9uYWwgY29udHJhY3Qtc3BlY2lmaWMgb3B0aW9uYWwgYXJndW1lbnRzIGluIGEgcmVjb3JkLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHt1c2VyU2VhdFByb21pc2U6IFByb21pc2U8VXNlclNlYXQ8UmVzdWx0Pj4sIGRlcG9zaXRlZDogUHJvbWlzZTxBbW91bnRLZXl3b3JkUmVjb3JkPn0+fVxuICogICBBIHByb21pc2UgZm9yIHRoZSB1c2VyU2VhdCBmb3IgdGhlIG9mZmVyIHRvIHRoZSBvdGhlciBjb250cmFjdCwgYW5kIGFcbiAqICAgcHJvbWlzZSAoYGRlcG9zaXRlZGApIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIHBheW91dCBmb3IgdGhlIG9mZmVyIGhhcyBiZWVuXG4gKiAgIGRlcG9zaXRlZCB0byB0aGUgYHRvU2VhdGAuXG4gKiAgIEFueSBmYWlsdXJlcyBvZiB0aGUgaW52aXRhdGlvbiB3aWxsIGJlIHJldHVybmVkIGJ5IGB1c2VyU2VhdFByb21pc2UuZ2V0T2ZmZXJSZXN1bHQoKWAuXG4gKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IEFyZ3MgT2ZmZXIgYXJnc1xuICogQHRlbXBsYXRlIHtvYmplY3R9IFJlc3VsdCBPZmZlciByZXN1bHRcbiAqL1xuICAgICAgIGNvbnN0IG9mZmVyVG8gPSBhc3luYyAoXG4gIHpjZixcbiAgaW52aXRhdGlvbixcbiAga2V5d29yZE1hcHBpbmcsXG4gIHByb3Bvc2FsLFxuICBmcm9tU2VhdCxcbiAgdG9TZWF0LFxuICBvZmZlckFyZ3MsXG4pID0+IHtcbiAgaWYgKGtleXdvcmRNYXBwaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICBrZXl3b3JkTWFwcGluZyA9IGhhcmRlbih7fSk7XG4gIH1cblxuICBjb25zdCBkZWZpbmVkVG9TZWF0ID0gdG9TZWF0ICE9PSB1bmRlZmluZWQgPyB0b1NlYXQgOiBmcm9tU2VhdDtcblxuICBjb25zdCB6b2UgPSB6Y2YuZ2V0Wm9lU2VydmljZSgpO1xuICBjb25zdCBtYXBwaW5nUmV2ZXJzZWQgPSByZXZlcnNlKGtleXdvcmRNYXBwaW5nKTtcblxuICBjb25zdCBuZXdLZXl3b3JkcyA9XG4gICAgcHJvcG9zYWwgIT09IHVuZGVmaW5lZFxuICAgICAgPyBtYXBLZXl3b3Jkcyhwcm9wb3NhbC5naXZlLCBtYXBwaW5nUmV2ZXJzZWQpXG4gICAgICA6IGhhcmRlbih7fSk7XG5cbiAgLyogdGhlIHByb3Bvc2FsIGlzIGluIHRoZSBvdGhlciBjb250cmFjdCdzIGtleXdvcmRzLCBidXQgd2Ugd2FudCB0byovXG4gIC8qIHVzZSBgcHJvcG9zYWwuZ2l2ZWAgdG8gd2l0aGRyYXcqL1xuICBjb25zdCBwYXltZW50cyA9IGF3YWl0IHdpdGhkcmF3RnJvbVNlYXQoemNmLCBmcm9tU2VhdCwgbmV3S2V5d29yZHMpO1xuXG4gIC8qIE1hcCB0byB0aGUgb3RoZXIgY29udHJhY3QncyBrZXl3b3JkcyovXG4gIGNvbnN0IHBheW1lbnRzRm9yT3RoZXJDb250cmFjdCA9IG1hcEtleXdvcmRzKHBheW1lbnRzLCBrZXl3b3JkTWFwcGluZyk7XG5cbiAgY29uc3QgdXNlclNlYXRQcm9taXNlID0gRSh6b2UpLm9mZmVyKFxuICAgIGludml0YXRpb24sXG4gICAgcHJvcG9zYWwsXG4gICAgcGF5bWVudHNGb3JPdGhlckNvbnRyYWN0LFxuICAgIG9mZmVyQXJncyxcbiAgKTtcblxuICBjb25zdCBkZXBvc2l0ZWRQcm9taXNlS2l0ID0gbWFrZVByb21pc2VLaXQoKTtcblxuICBjb25zdCBkb0RlcG9zaXQgPSBhc3luYyBwYXlvdXRQYXltZW50cyA9PiB7XG4gICAgLyogYWZ0ZXIgZ2V0UGF5b3V0cygpLCBnZXRGaW5hbEFsbG9jYXRpb24oKSByZXNvbHZlcyBwcm9tcHRseS4qL1xuICAgIGNvbnN0IGFtb3VudHMgPSBhd2FpdCBFKHVzZXJTZWF0UHJvbWlzZSkuZ2V0RmluYWxBbGxvY2F0aW9uKCk7XG5cbiAgICAvKiBNYXAgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udHJhY3QncyBrZXl3b3JkcyovXG4gICAgY29uc3QgbWFwcGVkQW1vdW50cyA9IG1hcEtleXdvcmRzKGFtb3VudHMsIG1hcHBpbmdSZXZlcnNlZCk7XG4gICAgY29uc3QgbWFwcGVkUGF5bWVudHMgPSBtYXBLZXl3b3JkcyhwYXlvdXRQYXltZW50cywgbWFwcGluZ1JldmVyc2VkKTtcbiAgICBhd2FpdCBkZXBvc2l0VG9TZWF0KHpjZiwgZGVmaW5lZFRvU2VhdCwgbWFwcGVkQW1vdW50cywgbWFwcGVkUGF5bWVudHMpO1xuICAgIGRlcG9zaXRlZFByb21pc2VLaXQucmVzb2x2ZShtYXBwZWRBbW91bnRzKTtcbiAgfTtcblxuICB2b2lkIEUodXNlclNlYXRQcm9taXNlKS5nZXRQYXlvdXRzKCkudGhlbihkb0RlcG9zaXQpO1xuXG4gIC8qIFRPRE8gcmVuYW1lIHJldHVybiBrZXk7IHVzZXJTZWF0UHJvbWlzZSBpcyBhIHJlbW90ZSBVc2VyU2VhdCovXG4gIHJldHVybiBoYXJkZW4oeyB1c2VyU2VhdFByb21pc2UsIGRlcG9zaXRlZDogZGVwb3NpdGVkUHJvbWlzZUtpdC5wcm9taXNlIH0pO1xufTskaM2PX29uY2Uub2ZmZXJUbyhvZmZlclRvKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRBY2NlcHRhbmNlTXNnIjpbImRlZmF1bHRBY2NlcHRhbmNlTXNnIl0sImFzc2VydElzc3VlcktleXdvcmRzIjpbImFzc2VydElzc3VlcktleXdvcmRzIl0sInNhdGlzZmllcyI6WyJzYXRpc2ZpZXMiXSwic3dhcCI6WyJzd2FwIl0sInN3YXBFeGFjdCI6WyJzd2FwRXhhY3QiXSwiZml0UHJvcG9zYWxTaGFwZSI6WyJmaXRQcm9wb3NhbFNoYXBlIl0sImFzc2VydFByb3Bvc2FsU2hhcGUiOlsiYXNzZXJ0UHJvcG9zYWxTaGFwZSJdLCJhc3NlcnROYXRBc3NldEtpbmQiOlsiYXNzZXJ0TmF0QXNzZXRLaW5kIl0sImRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnIjpbImRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnIl0sImRlcG9zaXRUb1NlYXQiOlsiZGVwb3NpdFRvU2VhdCJdLCJ3aXRoZHJhd0Zyb21TZWF0IjpbIndpdGhkcmF3RnJvbVNlYXQiXSwic2F2ZUFsbElzc3VlcnMiOlsic2F2ZUFsbElzc3VlcnMiXSwibWFwS2V5d29yZHMiOlsibWFwS2V5d29yZHMiXSwib2ZmZXJUbyI6WyJvZmZlclRvIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEV7+BmsCAAArAgAACUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9tYWtlSGFuZGxlLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXJyb3JzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUhhbmRsZSIsIm1ha2VIYW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpbml0RW1wdHksbWFrZUV4byxwcmVwYXJlRXhvQ2xhc3MsRmFpbCxIYW5kbGVJOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsWyRozY9fYSA9PiAoaW5pdEVtcHR5ID0gJGjNj19hKV1dLFtcIm1ha2VFeG9cIixbJGjNj19hID0+IChtYWtlRXhvID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJlcGFyZUV4b0NsYXNzXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiSGFuZGxlSVwiLFskaM2PX2EgPT4gKEhhbmRsZUkgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvdmF0LWRhdGEnO1xuICogQGltcG9ydCB7SGFuZGxlLCBJbnN0YW5jZX0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IEhcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtIfSBoYW5kbGVUeXBlXG4gKiBAcmV0dXJucyB7SCBleHRlbmRzICdJbnN0YW5jZScgPyAoKSA9PiBJbnN0YW5jZSA6ICgpID0+IEhhbmRsZTxIPn1cbiAqL1xuICAgICAgIGNvbnN0IGRlZmluZUR1cmFibGVIYW5kbGUgPSAoYmFnZ2FnZSwgaGFuZGxlVHlwZSkgPT4ge1xuICB0eXBlb2YgaGFuZGxlVHlwZSA9PT0gJ3N0cmluZycgfHwgRmFpbGBoYW5kbGVUeXBlIG11c3QgYmUgYSBzdHJpbmdgO1xuICBjb25zdCBtYWtlSGFuZGxlID0gcHJlcGFyZUV4b0NsYXNzKFxuICAgIGJhZ2dhZ2UsXG4gICAgYCR7aGFuZGxlVHlwZX1IYW5kbGVgLFxuICAgIEhhbmRsZUksXG4gICAgaW5pdEVtcHR5LFxuICAgIHt9LFxuICApO1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIEJpdCBieSBvdXIgb3duIG9wYXF1ZSB0eXBlcy4qL1xuICByZXR1cm4gLyoqIEB0eXBlIHsoKSA9PiBIYW5kbGU8SD59ICovIChtYWtlSGFuZGxlKTtcbn07JGjNj19vbmNlLmRlZmluZUR1cmFibGVIYW5kbGUoZGVmaW5lRHVyYWJsZUhhbmRsZSk7XG5oYXJkZW4oZGVmaW5lRHVyYWJsZUhhbmRsZSk7XG5cbi8qKlxuICogQ3JlYXRlIGFuIG9wYXF1ZSBoYW5kbGUgb2JqZWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBIXG4gKiBAcGFyYW0ge0h9IGhhbmRsZVR5cGUgdGhlIHN0cmluZyBsaXRlcmFsIHR5cGUgb2YgdGhlIGhhbmRsZVxuICogQHJldHVybnMge0ggZXh0ZW5kcyAnSW5zdGFuY2UnID8gSW5zdGFuY2UgOiBIYW5kbGU8SD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlSGFuZGxlID0gaGFuZGxlVHlwZSA9PiB7XG4gIHR5cGVvZiBoYW5kbGVUeXBlID09PSAnc3RyaW5nJyB8fCBGYWlsYGhhbmRsZVR5cGUgbXVzdCBiZSBhIHN0cmluZ2A7XG4gIC8qIFJldHVybiB0aGUgaW50ZXJzZWN0aW9uIHR5cGUgKHJlYWxseSBqdXN0IGFuIGVtcHR5IG9iamVjdCkuKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBCaXQgYnkgb3VyIG93biBvcGFxdWUgdHlwZXMuKi9cbiAgcmV0dXJuIC8qKiBAdHlwZSB7SGFuZGxlPEg+fSAqLyAobWFrZUV4byhgJHtoYW5kbGVUeXBlfUhhbmRsZWAsIEhhbmRsZUksIHt9KSk7XG59OyRozY9fb25jZS5tYWtlSGFuZGxlKG1ha2VIYW5kbGUpO1xuaGFyZGVuKG1ha2VIYW5kbGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmaW5lRHVyYWJsZUhhbmRsZSI6WyJkZWZpbmVEdXJhYmxlSGFuZGxlIl0sIm1ha2VIYW5kbGUiOlsibWFrZUhhbmRsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAB0/RLSEsAAEhLAAAlAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdGltZSJdLCJleHBvcnRzIjpbIkFkbWluRmFjZXRJIiwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIiwiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSIsIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIiwiQnVuZGxlQ2FwU2hhcGUiLCJCdW5kbGVTaGFwZSIsIkVtcHR5UHJvcG9zYWxTaGFwZSIsIkV4aXRPYmplY3RJIiwiRXhpdE9iamVjdFNoYXBlIiwiRmVlTWludEFjY2Vzc1NoYXBlIiwiRnVsbFByb3Bvc2FsU2hhcGUiLCJIYW5kbGVJIiwiSGFuZGxlT2ZmZXJJIiwiSW5zdGFsbGF0aW9uU2hhcGUiLCJJbnN0YW5jZUFkbWluSSIsIkluc3RhbmNlQWRtaW5TaGFwZSIsIkluc3RhbmNlSGFuZGxlU2hhcGUiLCJJbnN0YW5jZVJlY29yZFNoYXBlIiwiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIiwiSW52aXRhdGlvbkhhbmRsZVNoYXBlIiwiSW52aXRhdGlvblNoYXBlIiwiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSIsIklzc3VlclJlY29yZFNoYXBlIiwiS2V5d29yZFNoYXBlIiwiT2ZmZXJIYW5kbGVySSIsIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIiwiUHJpY2VRdW90ZVNoYXBlIiwiUHJvcG9zYWxTaGFwZSIsIlNlYXREYXRhU2hhcGUiLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSIsIlNlYXRTaGFwZSIsIlRlcm1zU2hhcGUiLCJUaW1lclNoYXBlIiwiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiLCJab2VNaW50SSIsIlpvZU1pbnRTaGFwZSIsIlpvZVNlcnZpY2VJIiwiWm9lU3RvcmFnZU1hbmFnZXJJS2l0IiwiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiLCJpc09uRGVtYW5kRXhpdFJ1bGUiLCJpc1dhaXZlZEV4aXRSdWxlIiwibWFrZUhhbmRsZVNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQW1vdW50U2hhcGUsQXNzZXRLaW5kU2hhcGUsQnJhbmRTaGFwZSxEaXNwbGF5SW5mb1NoYXBlLElzc3VlcktpdFNoYXBlLElzc3VlclNoYXBlLFBheW1lbnRTaGFwZSxTdWJzY3JpYmVyU2hhcGUsTSxUaW1lc3RhbXBTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50U2hhcGVcIixbJGjNj19hID0+IChBbW91bnRTaGFwZSA9ICRozY9fYSldXSxbXCJBc3NldEtpbmRTaGFwZVwiLFskaM2PX2EgPT4gKEFzc2V0S2luZFNoYXBlID0gJGjNj19hKV1dLFtcIkJyYW5kU2hhcGVcIixbJGjNj19hID0+IChCcmFuZFNoYXBlID0gJGjNj19hKV1dLFtcIkRpc3BsYXlJbmZvU2hhcGVcIixbJGjNj19hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjNj19hKV1dLFtcIklzc3VlcktpdFNoYXBlXCIsWyRozY9fYSA9PiAoSXNzdWVyS2l0U2hhcGUgPSAkaM2PX2EpXV0sW1wiSXNzdWVyU2hhcGVcIixbJGjNj19hID0+IChJc3N1ZXJTaGFwZSA9ICRozY9fYSldXSxbXCJQYXltZW50U2hhcGVcIixbJGjNj19hID0+IChQYXltZW50U2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIixbJGjNj19hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIixbJGjNj19hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm59IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7QWZ0ZXJEZWFkbGluZUV4aXRSdWxlLCBJbnN0YWxsYXRpb24sIFpvZUlzc3VlclJlY29yZH0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7RXhpdFJ1bGUsIEludml0YXRpb24sIEludml0YXRpb25IYW5kbGUsIFdhaXZlZEV4aXRSdWxlfSBmcm9tICcuL3R5cGVzLWluZGV4LmpzJztcbiAqIEBpbXBvcnQge0ludml0YXRpb25EZXRhaWxzfSBmcm9tICcuL3R5cGVzLWluZGV4LmpzJztcbiAqL1xuXG4vKiBrZXl3b3JkcyBoYXZlIGFuIGluaXRpYWwgY2FwKi9cbiAgICAgICBjb25zdCBLZXl3b3JkU2hhcGUgPSBNLnN0cmluZygpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxJbnZpdGF0aW9uSGFuZGxlPn0gKi8kaM2PX29uY2UuS2V5d29yZFNoYXBlKEtleXdvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgSW52aXRhdGlvbkhhbmRsZVNoYXBlID0gTS5yZW1vdGFibGUoJ0ludml0YXRpb25IYW5kbGUnKTtcbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPEludml0YXRpb24+fSAqLyRozY9fb25jZS5JbnZpdGF0aW9uSGFuZGxlU2hhcGUoSW52aXRhdGlvbkhhbmRsZVNoYXBlKTtcbiAgICAgICBjb25zdCBJbnZpdGF0aW9uU2hhcGUgPSBNLnJlbW90YWJsZSgnSW52aXRhdGlvbicpOyRozY9fb25jZS5JbnZpdGF0aW9uU2hhcGUoSW52aXRhdGlvblNoYXBlKTtcbiAgICAgICBjb25zdCBJbnN0YW5jZUhhbmRsZVNoYXBlID0gTS5yZW1vdGFibGUoJ0luc3RhbmNlSGFuZGxlJyk7XG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxJbnN0YWxsYXRpb24+fSAqLyRozY9fb25jZS5JbnN0YW5jZUhhbmRsZVNoYXBlKEluc3RhbmNlSGFuZGxlU2hhcGUpO1xuICAgICAgIGNvbnN0IEluc3RhbGxhdGlvblNoYXBlID0gTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpOyRozY9fb25jZS5JbnN0YWxsYXRpb25TaGFwZShJbnN0YWxsYXRpb25TaGFwZSk7XG4gICAgICAgY29uc3QgU2VhdFNoYXBlID0gTS5yZW1vdGFibGUoJ1NlYXQnKTskaM2PX29uY2UuU2VhdFNoYXBlKFNlYXRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKEtleXdvcmRTaGFwZSwgQW1vdW50U2hhcGUpOyRozY9fb25jZS5BbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihcbiAgS2V5d29yZFNoYXBlLFxuICBNLnBhdHRlcm4oKSxcbik7JGjNj19vbmNlLkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUoQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKFxuICBLZXl3b3JkU2hhcGUsXG4gIE0uZXJlZihQYXltZW50U2hhcGUpLFxuKTskaM2PX29uY2UuUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUoUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLCBJc3N1ZXJTaGFwZSk7JGjNj19vbmNlLklzc3VlcktleXdvcmRSZWNvcmRTaGFwZShJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKFxuICBLZXl3b3JkU2hhcGUsXG4gIE0uZXJlZihJc3N1ZXJTaGFwZSksXG4pOyRozY9fb25jZS5Jc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlKElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IEJyYW5kS2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsIEJyYW5kU2hhcGUpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxab2VJc3N1ZXJSZWNvcmQ+fSAqLyRozY9fb25jZS5CcmFuZEtleXdvcmRSZWNvcmRTaGFwZShCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgSXNzdWVyUmVjb3JkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAgYnJhbmQ6IEJyYW5kU2hhcGUsXG4gICAgaXNzdWVyOiBJc3N1ZXJTaGFwZSxcbiAgICBhc3NldEtpbmQ6IEFzc2V0S2luZFNoYXBlLFxuICB9LFxuICB7IGRpc3BsYXlJbmZvOiBEaXNwbGF5SW5mb1NoYXBlIH0sXG4pOyRozY9fb25jZS5Jc3N1ZXJSZWNvcmRTaGFwZShJc3N1ZXJSZWNvcmRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBUZXJtc1NoYXBlID0ge1xuICBpc3N1ZXJzOiBJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUsXG4gIGJyYW5kczogQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUsXG59OyRozY9fb25jZS5UZXJtc1NoYXBlKFRlcm1zU2hhcGUpO1xuaGFyZGVuKFRlcm1zU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSW5zdGFuY2VSZWNvcmRTaGFwZSA9IHtcbiAgaW5zdGFsbGF0aW9uOiBJbnN0YWxsYXRpb25TaGFwZSxcbiAgaW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG4gIHRlcm1zOiBNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpLFxufTskaM2PX29uY2UuSW5zdGFuY2VSZWNvcmRTaGFwZShJbnN0YW5jZVJlY29yZFNoYXBlKTtcbmhhcmRlbihJbnN0YW5jZVJlY29yZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IEhhbmRsZUkgPSBNLmludGVyZmFjZSgnSGFuZGxlJywge30pOyRozY9fb25jZS5IYW5kbGVJKEhhbmRsZUkpO1xuXG4gICAgICAgY29uc3QgbWFrZUhhbmRsZVNoYXBlID0gbmFtZSA9PiBNLnJlbW90YWJsZShgJHtuYW1lfUhhbmRsZWApOyRozY9fb25jZS5tYWtlSGFuZGxlU2hhcGUobWFrZUhhbmRsZVNoYXBlKTtcbiAgICAgICBjb25zdCBUaW1lclNoYXBlID0gbWFrZUhhbmRsZVNoYXBlKCd0aW1lcicpO1xuXG4vKipcbiAqIEFmdGVyIGRlZmF1bHRzIGFyZSBmaWxsZWQgaW5cbiAqXG4gKiBAc2VlIHtQcm9wb3NhbFJlY29yZH0gdHlwZVxuICovJGjNj19vbmNlLlRpbWVyU2hhcGUoVGltZXJTaGFwZSk7XG4gICAgICAgY29uc3QgRnVsbFByb3Bvc2FsU2hhcGUgPSB7XG4gIHdhbnQ6IEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUsXG4gIGdpdmU6IEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgLyogVG8gYWNjZXB0IG9ubHkgb25lLCB3ZSBjb3VsZCB1c2UgTS5vciByYXRoZXIgdGhhbiBNLnNwbGl0UmVjb3JkLCovXG4gIC8qIGJ1dCB0aGUgZXJyb3IgbWVzc2FnZXMgd291bGQgaGF2ZSBiZWVuIHdvcnNlLiBSYXRoZXIsKi9cbiAgLyogY2xlYW5Qcm9wb3NhbCdzIGFzc2VydEV4aXQgY2hlY2tzIHRoYXQgdGhlcmUncyBleGFjdGx5IG9uZS4qL1xuICBleGl0OiBNLnNwbGl0UmVjb3JkKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIG9uRGVtYW5kOiBudWxsLFxuICAgICAgd2FpdmVkOiBudWxsLFxuICAgICAgYWZ0ZXJEZWFkbGluZToge1xuICAgICAgICB0aW1lcjogTS5lcmVmKFRpbWVyU2hhcGUpLFxuICAgICAgICBkZWFkbGluZTogVGltZXN0YW1wU2hhcGUsXG4gICAgICB9LFxuICAgIH0sXG4gICAge30sXG4gICksXG59OyRozY9fb25jZS5GdWxsUHJvcG9zYWxTaGFwZShGdWxsUHJvcG9zYWxTaGFwZSk7XG5oYXJkZW4oRnVsbFByb3Bvc2FsU2hhcGUpO1xuXG4vKiogQHNlZSB7UHJvcG9zYWx9IHR5cGUgKi9cbiAgICAgICBjb25zdCBQcm9wb3NhbFNoYXBlID0gTS5zcGxpdFJlY29yZCh7fSwgRnVsbFByb3Bvc2FsU2hhcGUsIHt9KTskaM2PX29uY2UuUHJvcG9zYWxTaGFwZShQcm9wb3NhbFNoYXBlKTtcblxuICAgICAgIGNvbnN0IEVtcHR5UHJvcG9zYWxTaGFwZSA9IE0uc3BsaXRSZWNvcmQoe1xuICBnaXZlOiB7fSxcbiAgd2FudDoge30sXG4gIGV4aXQ6IHsgb25EZW1hbmQ6IG51bGwgfSxcbn0pOyRozY9fb25jZS5FbXB0eVByb3Bvc2FsU2hhcGUoRW1wdHlQcm9wb3NhbFNoYXBlKTtcblxuICAgICAgIGNvbnN0IGlzT25EZW1hbmRFeGl0UnVsZSA9IGV4aXQgPT4ge1xuICBjb25zdCBbZXhpdEtleV0gPSBPYmplY3Qua2V5cyhleGl0KTtcbiAgcmV0dXJuIGV4aXRLZXkgPT09ICdvbkRlbWFuZCc7XG59OyRozY9fb25jZS5pc09uRGVtYW5kRXhpdFJ1bGUoaXNPbkRlbWFuZEV4aXRSdWxlKTtcbmhhcmRlbihpc09uRGVtYW5kRXhpdFJ1bGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqIEByZXR1cm5zIHtleGl0IGlzIFdhaXZlZEV4aXRSdWxlfVxuICovXG4gICAgICAgY29uc3QgaXNXYWl2ZWRFeGl0UnVsZSA9IGV4aXQgPT4ge1xuICBjb25zdCBbZXhpdEtleV0gPSBPYmplY3Qua2V5cyhleGl0KTtcbiAgcmV0dXJuIGV4aXRLZXkgPT09ICd3YWl2ZWQnO1xufTskaM2PX29uY2UuaXNXYWl2ZWRFeGl0UnVsZShpc1dhaXZlZEV4aXRSdWxlKTtcbmhhcmRlbihpc1dhaXZlZEV4aXRSdWxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKiBAcmV0dXJucyB7ZXhpdCBpcyBBZnRlckRlYWRsaW5lRXhpdFJ1bGV9XG4gKi9cbiAgICAgICBjb25zdCBpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSA9IGV4aXQgPT4ge1xuICBjb25zdCBbZXhpdEtleV0gPSBPYmplY3Qua2V5cyhleGl0KTtcbiAgcmV0dXJuIGV4aXRLZXkgPT09ICdhZnRlckRlYWRsaW5lJztcbn07JGjNj19vbmNlLmlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKTtcbmhhcmRlbihpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPEludml0YXRpb25EZXRhaWxzPn0gKi9cbiAgICAgICBjb25zdCBJbnZpdGF0aW9uRWxlbWVudFNoYXBlID0gTS5zcGxpdFJlY29yZCh7XG4gIGRlc2NyaXB0aW9uOiBNLnN0cmluZygpLFxuICBoYW5kbGU6IEludml0YXRpb25IYW5kbGVTaGFwZSxcbiAgaW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG4gIGluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uU2hhcGUsXG59KTskaM2PX29uY2UuSW52aXRhdGlvbkVsZW1lbnRTaGFwZShJbnZpdGF0aW9uRWxlbWVudFNoYXBlKTtcblxuICAgICAgIGNvbnN0IE9mZmVySGFuZGxlckkgPSBNLmludGVyZmFjZSgnT2ZmZXJIYW5kbGVyJywge1xuICBoYW5kbGU6IE0uY2FsbChTZWF0U2hhcGUpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5hbnkoKSksXG59KTskaM2PX29uY2UuT2ZmZXJIYW5kbGVySShPZmZlckhhbmRsZXJJKTtcblxuICAgICAgIGNvbnN0IFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlID0gTS5hcnJheU9mKHtcbiAgc2VhdEhhbmRsZTogU2VhdFNoYXBlLFxuICBhbGxvY2F0aW9uOiBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG59KTskaM2PX29uY2UuU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpO1xuXG4gICAgICAgY29uc3QgWm9lTWludFNoYXBlID0gTS5yZW1vdGFibGUoJ1pvZU1pbnQnKTskaM2PX29uY2UuWm9lTWludFNoYXBlKFpvZU1pbnRTaGFwZSk7XG4gICAgICAgY29uc3QgWm9lTWludEkgPSBNLmludGVyZmFjZSgnWm9lTWludCcsIHtcbiAgZ2V0SXNzdWVyUmVjb3JkOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclJlY29yZFNoYXBlKSxcbiAgbWludEFuZEVzY3JvdzogTS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCksXG4gIHdpdGhkcmF3QW5kQnVybjogTS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCksXG59KTskaM2PX29uY2UuWm9lTWludEkoWm9lTWludEkpO1xuXG4gICAgICAgY29uc3QgRmVlTWludEFjY2Vzc1NoYXBlID0gTS5yZW1vdGFibGUoJ0ZlZU1pbnRBY2Nlc3MnKTskaM2PX29uY2UuRmVlTWludEFjY2Vzc1NoYXBlKEZlZU1pbnRBY2Nlc3NTaGFwZSk7XG5cbiAgICAgICBjb25zdCBFeGl0T2JqZWN0SSA9IE0uaW50ZXJmYWNlKCdFeGl0IE9iamVjdCcsIHtcbiAgZXhpdDogTS5jYWxsKCkucmV0dXJucygpLFxufSk7JGjNj19vbmNlLkV4aXRPYmplY3RJKEV4aXRPYmplY3RJKTtcblxuICAgICAgIGNvbnN0IEV4aXRPYmplY3RTaGFwZSA9IE0ucmVtb3RhYmxlKCdFeGl0T2JqJyk7JGjNj19vbmNlLkV4aXRPYmplY3RTaGFwZShFeGl0T2JqZWN0U2hhcGUpO1xuICAgICAgIGNvbnN0IEluc3RhbmNlQWRtaW5TaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnN0YW5jZUFkbWluJyk7JGjNj19vbmNlLkluc3RhbmNlQWRtaW5TaGFwZShJbnN0YW5jZUFkbWluU2hhcGUpO1xuICAgICAgIGNvbnN0IEluc3RhbmNlQWRtaW5JID0gTS5pbnRlcmZhY2UoJ0luc3RhbmNlQWRtaW4nLCB7XG4gIG1ha2VJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLCBNLnN0cmluZygpKVxuICAgIC5vcHRpb25hbChNLnJlY29yZCgpLCBNLnBhdHRlcm4oKSlcbiAgICAucmV0dXJucyhJbnZpdGF0aW9uU2hhcGUpLFxuICBzYXZlSXNzdWVyOiBNLmNhbGxXaGVuKE0uYXdhaXQoSXNzdWVyU2hhcGUpLCBLZXl3b3JkU2hhcGUpLnJldHVybnMoXG4gICAgSXNzdWVyUmVjb3JkU2hhcGUsXG4gICksXG4gIG1ha2VOb0VzY3Jvd1NlYXQ6IE0uY2FsbChcbiAgICBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICAgUHJvcG9zYWxTaGFwZSxcbiAgICBFeGl0T2JqZWN0U2hhcGUsXG4gICAgU2VhdFNoYXBlLFxuICApLnJldHVybnMoU2VhdFNoYXBlKSxcbiAgZXhpdEFsbFNlYXRzOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBmYWlsQWxsU2VhdHM6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG4gIGV4aXRTZWF0OiBNLmNhbGwoU2VhdFNoYXBlLCBNLmFueSgpKS5yZXR1cm5zKCksXG4gIGZhaWxTZWF0OiBNLmNhbGwoU2VhdFNoYXBlLCBNLmFueSgpKS5yZXR1cm5zKCksXG4gIG1ha2Vab2VNaW50OiBNLmNhbGwoS2V5d29yZFNoYXBlKVxuICAgIC5vcHRpb25hbChcbiAgICAgIEFzc2V0S2luZFNoYXBlLFxuICAgICAgRGlzcGxheUluZm9TaGFwZSxcbiAgICAgIE0uc3BsaXRSZWNvcmQoe30sIHsgZWxlbWVudFNoYXBlOiBNLnBhdHRlcm4oKSB9KSxcbiAgICApXG4gICAgLnJldHVybnMoTS5yZW1vdGFibGUoJ3pvZU1pbnQnKSksXG4gIHJlZ2lzdGVyRmVlTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSwgRmVlTWludEFjY2Vzc1NoYXBlKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdmZWVNaW50JyksXG4gICksXG4gIHJlcGxhY2VBbGxvY2F0aW9uczogTS5jYWxsKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKS5yZXR1cm5zKCksXG4gIHN0b3BBY2NlcHRpbmdPZmZlcnM6IE0uY2FsbCgpLnJldHVybnMoKSxcbiAgc2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbChNLmFycmF5T2YoTS5zdHJpbmcoKSkpLnJldHVybnMoKSxcbiAgZ2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbiAgZ2V0RXhpdFN1YnNjcmliZXI6IE0uY2FsbChTZWF0U2hhcGUpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbiAgaXNCbG9ja2VkOiBNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gIHJlcGFpckNvbnRyYWN0Q29tcGxldGlvbldhdGNoZXI6IE0uY2FsbCgpLnJldHVybnMoKSxcbn0pOyRozY9fb25jZS5JbnN0YW5jZUFkbWluSShJbnN0YW5jZUFkbWluSSk7XG5cbiAgICAgICBjb25zdCBJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCA9IHtcbiAgaW5zdGFuY2VTdG9yYWdlTWFuYWdlcjogTS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXInLCB7XG4gICAgZ2V0VGVybXM6IE0uY2FsbCgpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG4gICAgZ2V0SXNzdWVyczogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuICAgIGdldEJyYW5kczogTS5jYWxsKCkucmV0dXJucyhCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgZ2V0SW5zdGFsbGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbGxhdGlvblNoYXBlKSxcbiAgICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuICAgIHNhdmVJc3N1ZXI6IE0uY2FsbChJc3N1ZXJTaGFwZSwgS2V5d29yZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICBtYWtlWm9lTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSlcbiAgICAgIC5vcHRpb25hbChcbiAgICAgICAgQXNzZXRLaW5kU2hhcGUsXG4gICAgICAgIERpc3BsYXlJbmZvU2hhcGUsXG4gICAgICAgIE0uc3BsaXRSZWNvcmQoe30sIHsgZWxlbWVudFNoYXBlOiBNLnBhdHRlcm4oKSB9KSxcbiAgICAgIClcbiAgICAgIC5yZXR1cm5zKE0uZXJlZihab2VNaW50U2hhcGUpKSxcbiAgICByZWdpc3RlckZlZU1pbnQ6IE0uY2FsbChLZXl3b3JkU2hhcGUsIEZlZU1pbnRBY2Nlc3NTaGFwZSkucmV0dXJucyhcbiAgICAgIE0ucmVtb3RhYmxlKCdmZWVNaW50JyksXG4gICAgKSxcbiAgICBnZXRJbnN0YW5jZVJlY29yZDogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZVJlY29yZFNoYXBlKSxcbiAgICBnZXRJc3N1ZXJSZWNvcmRzOiBNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihJc3N1ZXJSZWNvcmRTaGFwZSkpLFxuICAgIGdldFdpdGhkcmF3RmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ1dpdGhkcmF3RmFjZXQnKSksXG4gICAgaW5pdEluc3RhbmNlQWRtaW46IE0uY2FsbChcbiAgICAgIEluc3RhbmNlSGFuZGxlU2hhcGUsXG4gICAgICBNLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpLFxuICAgICkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgZGVsZXRlSW5zdGFuY2VBZG1pbjogTS5jYWxsKEluc3RhbmNlQWRtaW5TaGFwZSkucmV0dXJucygpLFxuICAgIG1ha2VJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLCBNLnN0cmluZygpKVxuICAgICAgLm9wdGlvbmFsKE0ucmVjb3JkKCksIE0ucGF0dGVybigpKVxuICAgICAgLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbiAgICBnZXRSb290OiBNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuICAgIGdldEFkbWluTm9kZTogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnYWRtaW5Ob2RlJykpLFxuICB9KSxcbiAgd2l0aGRyYXdGYWNldDogTS5pbnRlcmZhY2UoJ1dpdGhkcmF3RmFjZXQnLCB7XG4gICAgd2l0aGRyYXdQYXltZW50czogTS5jYWxsKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucyhcbiAgICAgIFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlLFxuICAgICksXG4gIH0pLFxuICBoZWxwZXJzOiBNLmludGVyZmFjZSgnSW5zdGFuY2VTdG9yYWdlTWFuYWdlciBoZWxwZXInLCB7XG4gICAgd3JhcElzc3VlcktpdFdpdGhab2VNaW50OiBNLmNhbGwoXG4gICAgICBLZXl3b3JkU2hhcGUsXG4gICAgICBJc3N1ZXJLaXRTaGFwZSxcbiAgICAgIE0ucmVtb3RhYmxlKCdhZG1pbk5vZGUnKSxcbiAgICApLnJldHVybnMoWm9lTWludFNoYXBlKSxcbiAgfSksXG59OyRozY9fb25jZS5JbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdChJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5oYXJkZW4oSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuXG4gICAgICAgY29uc3QgQnVuZGxlQ2FwU2hhcGUgPSBNLnJlbW90YWJsZSgnYnVuZGxlQ2FwJyk7JGjNj19vbmNlLkJ1bmRsZUNhcFNoYXBlKEJ1bmRsZUNhcFNoYXBlKTtcbiAgICAgICBjb25zdCBCdW5kbGVTaGFwZSA9IE0uYW5kKFxuICBNLnNwbGl0UmVjb3JkKHsgbW9kdWxlRm9ybWF0OiBNLmFueSgpIH0pLFxuICBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0uc3RyaW5nKHsgc3RyaW5nTGVuZ3RoTGltaXQ6IEluZmluaXR5IH0pKSxcbik7JGjNj19vbmNlLkJ1bmRsZVNoYXBlKEJ1bmRsZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IFVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAgeyBpbnN0YWxsYXRpb246IEluc3RhbGxhdGlvblNoYXBlIH0sXG4gIHtcbiAgICBidW5kbGU6IE0ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5zdHJpbmcoeyBzdHJpbmdMZW5ndGhMaW1pdDogSW5maW5pdHkgfSkpLFxuICAgIGJ1bmRsZUNhcDogQnVuZGxlQ2FwU2hhcGUsXG4gICAgYnVuZGxlSUQ6IE0uc3RyaW5nKCksXG4gIH0sXG4gIHt9LFxuKTskaM2PX29uY2UuVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUoVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgWm9lU3RvcmFnZU1hbmFnZXJJS2l0ID0ge1xuICB6b2VTZXJ2aWNlRGF0YUFjY2VzczogTS5pbnRlcmZhY2UoJ1pvZVNlcnZpY2UgZGF0YUFjY2VzcycsIHtcbiAgICBnZXRUZXJtczogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG4gICAgZ2V0SXNzdWVyczogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbiAgICBnZXRCcmFuZHM6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbiAgICBnZXRJbnN0YWxsYXRpb246IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSksXG4gICAgKSxcbiAgICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuICAgIGdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjogTS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5lcmVmKE0uc3RyaW5nKCkpLFxuICAgICksXG4gICAgaW5zdGFsbEJ1bmRsZTogTS5jYWxsKEJ1bmRsZVNoYXBlKVxuICAgICAgLm9wdGlvbmFsKE0uc3RyaW5nKCkpXG4gICAgICAucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgaW5zdGFsbEJ1bmRsZUlEOiBNLmNhbGwoTS5zdHJpbmcoKSlcbiAgICAgIC5vcHRpb25hbChNLnN0cmluZygpKVxuICAgICAgLnJldHVybnMoTS5wcm9taXNlKCkpLFxuXG4gICAgZ2V0UHVibGljRmFjZXQ6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5lcmVmKE0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpKSxcbiAgICApLFxuICAgIGdldE9mZmVyRmlsdGVyOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuICAgIGdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5vcHQoTS5wYXR0ZXJuKCkpLFxuICAgICksXG4gIH0pLFxuICBtYWtlT2ZmZXJBY2Nlc3M6IE0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIG1ha2VPZmZlciBhY2Nlc3MnLCB7XG4gICAgZ2V0QXNzZXRLaW5kQnlCcmFuZDogTS5jYWxsKEJyYW5kU2hhcGUpLnJldHVybnMoQXNzZXRLaW5kU2hhcGUpLFxuICAgIGdldEluc3RhbmNlQWRtaW46IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKSxcbiAgICApLFxuICAgIGdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5vcHQoTS5wYXR0ZXJuKCkpLFxuICAgICksXG4gICAgZ2V0SW52aXRhdGlvbklzc3VlcjogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG4gICAgZGVwb3NpdFBheW1lbnRzOiBNLmNhbGwoUHJvcG9zYWxTaGFwZSwgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoXG4gICAgICBNLnByb21pc2UoKSxcbiAgICApLFxuICB9KSxcbiAgc3RhcnRJbnN0YW5jZUFjY2VzczogTS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2Ugc3RhcnRJbnN0YW5jZSBhY2Nlc3MnLCB7XG4gICAgbWFrZVpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXI6IE0uY2FsbChcbiAgICAgIEluc3RhbGxhdGlvblNoYXBlLFxuICAgICAgTS5hbnkoKSxcbiAgICAgIElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICAgICBJbnN0YW5jZUhhbmRsZVNoYXBlLFxuICAgICAgTS5vcihCdW5kbGVDYXBTaGFwZSwgQnVuZGxlU2hhcGUpLFxuICAgICAgTS5zdHJpbmcoKSxcbiAgICApLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIHVud3JhcEluc3RhbGxhdGlvbjogTS5jYWxsV2hlbihNLmVyZWYoSW5zdGFsbGF0aW9uU2hhcGUpKS5yZXR1cm5zKFxuICAgICAgVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUsXG4gICAgKSxcbiAgfSksXG4gIGludml0YXRpb25Jc3N1ZXJBY2Nlc3M6IE0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIGludml0YXRpb25Jc3N1ZXInLCB7XG4gICAgZ2V0SW52aXRhdGlvbklzc3VlcjogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG4gIH0pLFxufTskaM2PX29uY2UuWm9lU3RvcmFnZU1hbmFnZXJJS2l0KFpvZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5oYXJkZW4oWm9lU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuICAgICAgIGNvbnN0IFpvZVNlcnZpY2VJID0gTS5pbnRlcmZhY2UoJ1pvZVNlcnZpY2UnLCB7XG4gIGluc3RhbGw6IE0uY2FsbChNLmFueSgpKS5vcHRpb25hbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgaW5zdGFsbEJ1bmRsZUlEOiBNLmNhbGwoTS5zdHJpbmcoKSkub3B0aW9uYWwoTS5zdHJpbmcoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHN0YXJ0SW5zdGFuY2U6IE0uY2FsbChNLmVyZWYoSW5zdGFsbGF0aW9uU2hhcGUpKVxuICAgIC5vcHRpb25hbChJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLCBNLnJlY29yZCgpLCBNLnJlY29yZCgpLCBNLnN0cmluZygpKVxuICAgIC5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgb2ZmZXI6IE0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSlcbiAgICAub3B0aW9uYWwoUHJvcG9zYWxTaGFwZSwgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUsIE0uYW55KCkpXG4gICAgLnJldHVybnMoTS5wcm9taXNlKCkpLFxuXG4gIGdldE9mZmVyRmlsdGVyOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgTS5hcnJheU9mKE0uc3RyaW5nKCkpLFxuICApLFxuICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0RmVlSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0QnJhbmRzOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICksXG4gIGdldElzc3VlcnM6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICksXG4gIGdldFB1YmxpY0ZhY2V0OiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JyksXG4gICksXG4gIGdldFRlcm1zOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG4gIGdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSksXG4gICksXG4gIGdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbGxhdGlvblNoYXBlKSkucmV0dXJucyhcbiAgICBNLmVyZWYoTS5zdHJpbmcoKSksXG4gICksXG5cbiAgZ2V0SW5zdGFsbGF0aW9uOiBNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRJbnN0YW5jZTogTS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0Q29uZmlndXJhdGlvbjogTS5jYWxsKCkucmV0dXJucyh7XG4gICAgZmVlSXNzdWVyQ29uZmlnOiB7XG4gICAgICBuYW1lOiBNLnN0cmluZygpLFxuICAgICAgYXNzZXRLaW5kOiAnbmF0JyxcbiAgICAgIGRpc3BsYXlJbmZvOiBEaXNwbGF5SW5mb1NoYXBlLFxuICAgIH0sXG4gIH0pLFxuICBnZXRJbnZpdGF0aW9uRGV0YWlsczogTS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuICBnZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbiAgICBNLm9wdChNLnBhdHRlcm4oKSksXG4gICksXG59KTskaM2PX29uY2UuWm9lU2VydmljZUkoWm9lU2VydmljZUkpO1xuXG4gICAgICAgY29uc3QgQWRtaW5GYWNldEkgPSBNLmludGVyZmFjZSgnWmNmQWRtaW5GYWNldCcsIHtcbiAgZ2V0VmF0U2h1dGRvd25Qcm9taXNlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgcmVzdGFydENvbnRyYWN0OiBNLmNhbGwoKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgdXBncmFkZUNvbnRyYWN0OiBNLmNhbGwoTS5zdHJpbmcoKSkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHRlcm1pbmF0ZUNvbnRyYWN0OiBNLmNhbGwoTS5lcnJvcigpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbn0pOyRozY9fb25jZS5BZG1pbkZhY2V0SShBZG1pbkZhY2V0SSk7XG5cbiAgICAgICBjb25zdCBTZWF0RGF0YVNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIHByb3Bvc2FsOiBQcm9wb3NhbFNoYXBlLFxuICAgIGluaXRpYWxBbGxvY2F0aW9uOiBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICAgc2VhdEhhbmRsZTogU2VhdFNoYXBlLFxuICB9LFxuICB7XG4gICAgb2ZmZXJBcmdzOiBNLmFueSgpLFxuICB9LFxuKTskaM2PX29uY2UuU2VhdERhdGFTaGFwZShTZWF0RGF0YVNoYXBlKTtcblxuICAgICAgIGNvbnN0IEhhbmRsZU9mZmVySSA9IE0uaW50ZXJmYWNlKCdIYW5kbGVPZmZlcicsIHtcbiAgaGFuZGxlT2ZmZXI6IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsIFNlYXREYXRhU2hhcGUpLnJldHVybnMoe1xuICAgIG9mZmVyUmVzdWx0UHJvbWlzZTogTS5wcm9taXNlKCksXG4gICAgZXhpdE9iajogRXhpdE9iamVjdFNoYXBlLFxuICB9KSxcbn0pOyRozY9fb25jZS5IYW5kbGVPZmZlckkoSGFuZGxlT2ZmZXJJKTtcblxuICAgICAgIGNvbnN0IFByaWNlUXVvdGVTaGFwZSA9IHtcbiAgcXVvdGVBbW91bnQ6IEFtb3VudFNoYXBlLFxuICBxdW90ZVBheW1lbnQ6IE0uZXJlZihQYXltZW50U2hhcGUpLFxufTskaM2PX29uY2UuUHJpY2VRdW90ZVNoYXBlKFByaWNlUXVvdGVTaGFwZSk7XG5oYXJkZW4oUHJpY2VRdW90ZVNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IktleXdvcmRTaGFwZSI6WyJLZXl3b3JkU2hhcGUiXSwiSW52aXRhdGlvbkhhbmRsZVNoYXBlIjpbIkludml0YXRpb25IYW5kbGVTaGFwZSJdLCJJbnZpdGF0aW9uU2hhcGUiOlsiSW52aXRhdGlvblNoYXBlIl0sIkluc3RhbmNlSGFuZGxlU2hhcGUiOlsiSW5zdGFuY2VIYW5kbGVTaGFwZSJdLCJJbnN0YWxsYXRpb25TaGFwZSI6WyJJbnN0YWxsYXRpb25TaGFwZSJdLCJTZWF0U2hhcGUiOlsiU2VhdFNoYXBlIl0sIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSI6WyJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiXSwiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSI6WyJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIl0sIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIjpbIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSI6WyJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSI6WyJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIl0sIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIjpbIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclJlY29yZFNoYXBlIjpbIklzc3VlclJlY29yZFNoYXBlIl0sIlRlcm1zU2hhcGUiOlsiVGVybXNTaGFwZSJdLCJJbnN0YW5jZVJlY29yZFNoYXBlIjpbIkluc3RhbmNlUmVjb3JkU2hhcGUiXSwiSGFuZGxlSSI6WyJIYW5kbGVJIl0sIm1ha2VIYW5kbGVTaGFwZSI6WyJtYWtlSGFuZGxlU2hhcGUiXSwiVGltZXJTaGFwZSI6WyJUaW1lclNoYXBlIl0sIkZ1bGxQcm9wb3NhbFNoYXBlIjpbIkZ1bGxQcm9wb3NhbFNoYXBlIl0sIlByb3Bvc2FsU2hhcGUiOlsiUHJvcG9zYWxTaGFwZSJdLCJFbXB0eVByb3Bvc2FsU2hhcGUiOlsiRW1wdHlQcm9wb3NhbFNoYXBlIl0sImlzT25EZW1hbmRFeGl0UnVsZSI6WyJpc09uRGVtYW5kRXhpdFJ1bGUiXSwiaXNXYWl2ZWRFeGl0UnVsZSI6WyJpc1dhaXZlZEV4aXRSdWxlIl0sImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIjpbImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIl0sIkludml0YXRpb25FbGVtZW50U2hhcGUiOlsiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSJdLCJPZmZlckhhbmRsZXJJIjpbIk9mZmVySGFuZGxlckkiXSwiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiOlsiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiXSwiWm9lTWludFNoYXBlIjpbIlpvZU1pbnRTaGFwZSJdLCJab2VNaW50SSI6WyJab2VNaW50SSJdLCJGZWVNaW50QWNjZXNzU2hhcGUiOlsiRmVlTWludEFjY2Vzc1NoYXBlIl0sIkV4aXRPYmplY3RJIjpbIkV4aXRPYmplY3RJIl0sIkV4aXRPYmplY3RTaGFwZSI6WyJFeGl0T2JqZWN0U2hhcGUiXSwiSW5zdGFuY2VBZG1pblNoYXBlIjpbIkluc3RhbmNlQWRtaW5TaGFwZSJdLCJJbnN0YW5jZUFkbWluSSI6WyJJbnN0YW5jZUFkbWluSSJdLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJCdW5kbGVDYXBTaGFwZSI6WyJCdW5kbGVDYXBTaGFwZSJdLCJCdW5kbGVTaGFwZSI6WyJCdW5kbGVTaGFwZSJdLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSI6WyJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSJdLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiWm9lU3RvcmFnZU1hbmFnZXJJS2l0Il0sIlpvZVNlcnZpY2VJIjpbIlpvZVNlcnZpY2VJIl0sIkFkbWluRmFjZXRJIjpbIkFkbWluRmFjZXRJIl0sIlNlYXREYXRhU2hhcGUiOlsiU2VhdERhdGFTaGFwZSJdLCJIYW5kbGVPZmZlckkiOlsiSGFuZGxlT2ZmZXJJIl0sIlByaWNlUXVvdGVTaGFwZSI6WyJQcmljZVF1b3RlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2fSTtJYBAACWAQAAHgAAAEBhZ29yaWMvem9uZS12MC4yLjIvZHVyYWJsZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9kdXJhYmxlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZHVyYWJsZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9kdXJhYmxlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIAyUsraEwAA2hMAACIAAABAYWdvcmljL3pvbmUtdjAuMi4yL3NyYy9kdXJhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9iYXNlLXpvbmUiXSwiZXhwb3J0cyI6WyJtYWtlRHVyYWJsZVpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEZhcixpc1Bhc3NhYmxlLGNhbkJlRHVyYWJsZSxtYWtlU2NhbGFyTWFwU3RvcmUscHJlcGFyZUV4byxwcmVwYXJlRXhvQ2xhc3MscHJlcGFyZUV4b0NsYXNzS2l0LHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUscHJvdmlkZUR1cmFibGVTZXRTdG9yZSxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSx3YXRjaFByb21pc2Usa2V5cyxtYWtlT25jZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiaXNQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGlzUGFzc2FibGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIixbJGjNj19hID0+IChjYW5CZUR1cmFibGUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9cIixbJGjNj19hID0+IChwcmVwYXJlRXhvID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVNYXBTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVTZXRTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlID0gJGjNj19hKV1dLFtcIndhdGNoUHJvbWlzZVwiLFskaM2PX2EgPT4gKHdhdGNoUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lXCIsIFtbXCJhZ29yaWNWYXREYXRhS2V5c1wiLFskaM2PX2EgPT4gKGtleXMgPSAkaM2PX2EpXV0sW1wibWFrZU9uY2VLaXRcIixbJGjNj19hID0+IChtYWtlT25jZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICcuL2luZGV4LmpzJztcbiAqIEBpbXBvcnQge1N0b3Jlc30gZnJvbSAnLi9pbmRleC5qcyc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKi9cblxuLyoqXG4gKiBBIHZhcmlhbnQgb2YgYGNhbkJlRHVyYWJsZWAgdGhhdCByZXR1cm5zIGBmYWxzZWAgaW5zdGVhZCBvZiBldmVyIHRocm93aW5nLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc1N0b3JhYmxlID0gc3BlY2ltZW4gPT4gaXNQYXNzYWJsZShzcGVjaW1lbikgJiYgY2FuQmVEdXJhYmxlKHNwZWNpbWVuKTtcbmhhcmRlbihpc1N0b3JhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0geygpID0+IEJhZ2dhZ2V9IGdldEJhZ2dhZ2VcbiAqL1xuY29uc3QgYXR0YWNoRHVyYWJsZVN0b3JlcyA9IGdldEJhZ2dhZ2UgPT4ge1xuICAvKiogQHR5cGUge1pvbmVbJ21hcFN0b3JlJ119ICovXG4gIGNvbnN0IG1hcFN0b3JlID0gKGxhYmVsLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgYmFnZ2FnZSA9IGdldEJhZ2dhZ2UoKTtcbiAgICBjb25zdCByZXQgPSBwcm92aWRlRHVyYWJsZU1hcFN0b3JlKGJhZ2dhZ2UsIGxhYmVsLCBvcHRpb25zKTtcbiAgICByZXR1cm4gcmV0O1xuICB9O1xuICAvKiogQHR5cGUge1pvbmVbJ3NldFN0b3JlJ119ICovXG4gIGNvbnN0IHNldFN0b3JlID0gKGxhYmVsLCBvcHRpb25zKSA9PlxuICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUoZ2V0QmFnZ2FnZSgpLCBsYWJlbCwgb3B0aW9ucyk7XG4gIC8qKiBAdHlwZSB7Wm9uZVsnd2Vha1NldFN0b3JlJ119ICovXG4gIGNvbnN0IHdlYWtTZXRTdG9yZSA9IChsYWJlbCwgb3B0aW9ucykgPT5cbiAgICBwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZShnZXRCYWdnYWdlKCksIGxhYmVsLCBvcHRpb25zKTtcbiAgLyoqIEB0eXBlIHtab25lWyd3ZWFrTWFwU3RvcmUnXX0gKi9cbiAgY29uc3Qgd2Vha01hcFN0b3JlID0gKGxhYmVsLCBvcHRpb25zKSA9PlxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKGdldEJhZ2dhZ2UoKSwgbGFiZWwsIG9wdGlvbnMpO1xuXG4gIC8qKiBAdHlwZSB7U3RvcmVzfSAqL1xuICByZXR1cm4gRmFyKCdkdXJhYmxlU3RvcmVzJywge1xuICAgIGRldGFjaGVkOiAoKSA9PiBkZXRhY2hlZER1cmFibGVTdG9yZXMsXG4gICAgaXNTdG9yYWJsZSxcbiAgICBtYXBTdG9yZSxcbiAgICBzZXRTdG9yZSxcbiAgICB3ZWFrTWFwU3RvcmUsXG4gICAgd2Vha1NldFN0b3JlLFxuICB9KTtcbn07XG5cbi8qKiBAdHlwZSB7U3RvcmVzfSAqL1xuY29uc3QgZGV0YWNoZWREdXJhYmxlU3RvcmVzID0gYXR0YWNoRHVyYWJsZVN0b3JlcygoKSA9PlxuICBtYWtlU2NhbGFyTWFwU3RvcmUoJ2RldGFjaGVkJyksXG4pO1xuXG4vKipcbiAqIENyZWF0ZSBhIHpvbmUgd2hvc2Ugb2JqZWN0cyBwZXJzaXN0IGJldHdlZW4gQWdvcmljIHZhdCB1cGdyYWRlcy5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZUxhYmVsXVxuICogQHJldHVybnMge1pvbmV9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRHVyYWJsZVpvbmUgPSAoYmFnZ2FnZSwgYmFzZUxhYmVsID0gJ2R1cmFibGVab25lJykgPT4ge1xuICBiYWdnYWdlIHx8IEZhaWxgYmFnZ2FnZSByZXF1aXJlZGA7XG5cbiAgY29uc3QgYXR0YWNoZWRTdG9yZXMgPSBhdHRhY2hEdXJhYmxlU3RvcmVzKCgpID0+IGJhZ2dhZ2UpO1xuXG4gIGNvbnN0IHsgbWFrZU9uY2UsIHdyYXBQcm92aWRlciB9ID0gbWFrZU9uY2VLaXQoXG4gICAgYmFzZUxhYmVsLFxuICAgIGF0dGFjaGVkU3RvcmVzLFxuICAgIGJhZ2dhZ2UsXG4gICk7XG5cbiAgLyoqIEB0eXBlIHtab25lWydleG9DbGFzcyddfSAqL1xuICBjb25zdCBleG9DbGFzcyA9ICguLi5hcmdzKSA9PiBwcmVwYXJlRXhvQ2xhc3MoYmFnZ2FnZSwgLi4uYXJncyk7XG4gIC8qKiBAdHlwZSB7Wm9uZVsnZXhvQ2xhc3NLaXQnXX0gKi9cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCAtLSBoYXBwZW5zIG9ubHkgaW50ZWdyYXRpbmcgd2l0aCBFbmRvIG1hc3RlciovXG4gIC8qIEB0cy1pZ25vcmUgRklYTUUgaW4gRW5kbyovXG4gIGNvbnN0IGV4b0NsYXNzS2l0ID0gKC4uLmFyZ3MpID0+IHByZXBhcmVFeG9DbGFzc0tpdChiYWdnYWdlLCAuLi5hcmdzKTtcbiAgLyoqIEB0eXBlIHtab25lWydleG8nXX0gKi9cbiAgY29uc3QgZXhvID0gKC4uLmFyZ3MpID0+IHByZXBhcmVFeG8oYmFnZ2FnZSwgLi4uYXJncyk7XG5cbiAgY29uc3Qgc3ViWm9uZVN0b3JlID0gd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLm1hcFN0b3JlLCBrZXlzLnpvbmUpO1xuXG4gIC8qKiBAdHlwZSB7Wm9uZVsnc3ViWm9uZSddfSAqL1xuICBjb25zdCBzdWJab25lID0gKGxhYmVsLCBvcHRpb25zID0ge30pID0+IHtcbiAgICAvKiogQHR5cGUge0JhZ2dhZ2V9ICovXG4gICAgY29uc3Qgc3ViQmFnZ2FnZSA9IHN1YlpvbmVTdG9yZShsYWJlbCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG1ha2VEdXJhYmxlWm9uZShzdWJCYWdnYWdlLCBgJHtiYXNlTGFiZWx9LiR7bGFiZWx9YCk7XG4gIH07XG5cbiAgcmV0dXJuIEZhcignZHVyYWJsZVpvbmUnLCB7XG4gICAgZXhvOiB3cmFwUHJvdmlkZXIoZXhvLCBrZXlzLmV4byksXG4gICAgZXhvQ2xhc3M6IHdyYXBQcm92aWRlcihleG9DbGFzcywga2V5cy5leG9DbGFzcyksXG4gICAgZXhvQ2xhc3NLaXQ6IHdyYXBQcm92aWRlcihleG9DbGFzc0tpdCwga2V5cy5leG9DbGFzc0tpdCksXG4gICAgc3ViWm9uZSxcblxuICAgIG1ha2VPbmNlLFxuICAgIHdhdGNoUHJvbWlzZSxcbiAgICBkZXRhY2hlZDogYXR0YWNoZWRTdG9yZXMuZGV0YWNoZWQsXG4gICAgaXNTdG9yYWJsZTogYXR0YWNoZWRTdG9yZXMuaXNTdG9yYWJsZSxcblxuICAgIG1hcFN0b3JlOiB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMubWFwU3RvcmUsIGtleXMuc3RvcmUpLFxuICAgIHNldFN0b3JlOiB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMuc2V0U3RvcmUsIGtleXMuc3RvcmUpLFxuICAgIHdlYWtNYXBTdG9yZTogd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLndlYWtNYXBTdG9yZSwga2V5cy5zdG9yZSksXG4gICAgd2Vha1NldFN0b3JlOiB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMud2Vha1NldFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRHVyYWJsZVpvbmUobWFrZUR1cmFibGVab25lKTtcbmhhcmRlbihtYWtlRHVyYWJsZVpvbmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUR1cmFibGVab25lIjpbIm1ha2VEdXJhYmxlWm9uZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADWOFQCxQEAAMUBAAAfAAAAQGVuZG8vY2FjaGUtbWFwLXYxLjEuMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9jYWNoZW1hcC5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2NhY2hlbWFwLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvY2FjaGVtYXAuanMiOltbIm1ha2VDYWNoZU1hcEtpdCIsIm1ha2VDYWNoZU1hcEtpdCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgZXu/CYnAAAmJwAAJgAAAEBlbmRvL2NhY2hlLW1hcC12MS4xLjAvc3JjL2NhY2hlbWFwLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlQ2FjaGVNYXBLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cbi8qIGdsb2JhbCBnbG9iYWxUaGlzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsICovXG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuY29uc3QgeyBFcnJvciwgVHlwZUVycm9yLCBXZWFrTWFwIH0gPSBnbG9iYWxUaGlzO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG5jb25zdCB7IHBhcnNlLCBzdHJpbmdpZnkgfSA9IEpTT047XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbmNvbnN0IHsgaXNTYWZlSW50ZWdlciB9ID0gTnVtYmVyO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG5jb25zdCB7IGZyZWV6ZSB9ID0gT2JqZWN0O1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG5jb25zdCB7IHRvU3RyaW5nVGFnOiB0b1N0cmluZ1RhZ1N5bWJvbCB9ID0gU3ltYm9sO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbmNvbnN0IFVOS05PV05fS0VZID0gU3ltYm9sKCdVTktOT1dOX0tFWScpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzIG9iamVjdCA/IHsgLXJlYWRvbmx5IFtLIGluIGtleW9mIFRdOiBUW0tdIH0gOiBuZXZlcn0gV3JpdGFibGVEZWVwXG4gKiAgIEludGVudGlvbmFsbHkgbGltaXRlZCB0byBsb2NhbCBuZWVkczsgcmVmZXIgdG9cbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy90eXBlLWZlc3QgaWYgaW5zdWZmaWNpZW50LlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gdmFsdWVcbiAqIEBwYXJhbSB7PFUsPihuYW1lOiBzdHJpbmcsIHZhbHVlOiBVKSA9PiBVfSBbcmV2aXZlcl1cbiAqIEByZXR1cm5zIHtXcml0YWJsZURlZXA8VD59XG4gKi9cbmNvbnN0IGRlZXBDb3B5SnNvbmFibGUgPSAodmFsdWUsIHJldml2ZXIpID0+IHtcbiAgY29uc3QgZW5jb2RlZCA9IHN0cmluZ2lmeSh2YWx1ZSk7XG4gIGNvbnN0IGRlY29kZWQgPSBwYXJzZShlbmNvZGVkLCByZXZpdmVyKTtcbiAgcmV0dXJuIGRlY29kZWQ7XG59O1xuXG5jb25zdCBmcmVlemluZ1Jldml2ZXIgPSAoX25hbWUsIHZhbHVlKSA9PiBmcmVlemUodmFsdWUpO1xuXG4vKiogQHR5cGUgezxULD4odmFsdWU6IFQpID0+IFR9ICovXG5jb25zdCBkZWVwQ29weUFuZEZyZWV6ZUpzb25hYmxlID0gdmFsdWUgPT5cbiAgZGVlcENvcHlKc29uYWJsZSh2YWx1ZSwgZnJlZXppbmdSZXZpdmVyKTtcblxuLyoqXG4gKiBBIGNhY2hlIG9mIGJvdW5kZWQgc2l6ZSwgaW1wbGVtZW50aW5nIHRoZSBXZWFrTWFwIGludGVyZmFjZSBidXQgaG9sZGluZyBrZXlzXG4gKiBzdHJvbmdseSBpZiBjcmVhdGVkIHdpdGggYSBub24td2VhayBgbWFrZU1hcGAgb3B0aW9uIG9mXG4gKiB7QGxpbmsgbWFrZUNhY2hlTWFwS2l0fS5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlZGVmIHtQaWNrPE1hcDxLLCBWPiwgRXhjbHVkZTxrZXlvZiBXZWFrTWFwPFdlYWtLZXksICo+LCAnc2V0Jz4+ICYge3NldDogKGtleTogSywgdmFsdWU6IFYpID0+IFdlYWtNYXBBUEk8SywgVj59fSBXZWFrTWFwQVBJXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlZGVmIHtXZWFrTWFwQVBJPEssIFY+ICYgKHtjbGVhcj86IHVuZGVmaW5lZH0gfCBQaWNrPE1hcDxLLCBWPiwgJ2NsZWFyJz4pfSBTaW5nbGVFbnRyeU1hcFxuICovXG5cbi8qKlxuICogQSBjZWxsIG9mIGEgZG91Ymx5LWxpbmtlZCByaW5nIChjaXJjdWxhciBsaXN0KSBmb3IgYSBjYWNoZSBtYXAuXG4gKiBJbnN0YW5jZXMgYXJlIG5vdCBmcm96ZW4sIGFuZCBzbyBzaG91bGQgYmUgY2xvc2VseSBlbmNhcHN1bGF0ZWQuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDYWNoZU1hcENlbGxcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpZCBmb3IgZGVidWdnaW5nXG4gKiBAcHJvcGVydHkge0NhY2hlTWFwQ2VsbDxLLCBWPn0gbmV4dFxuICogQHByb3BlcnR5IHtDYWNoZU1hcENlbGw8SywgVj59IHByZXZcbiAqIEBwcm9wZXJ0eSB7U2luZ2xlRW50cnlNYXA8SywgVj59IGRhdGFcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtDYWNoZU1hcENlbGw8SywgVj59IHByZXZcbiAqIEBwYXJhbSB7bnVtYmVyfSBpZFxuICogQHBhcmFtIHtTaW5nbGVFbnRyeU1hcDxLLCBWPn0gZGF0YVxuICogQHJldHVybnMge0NhY2hlTWFwQ2VsbDxLLCBWPn1cbiAqL1xuY29uc3QgYXBwZW5kTmV3Q2VsbCA9IChwcmV2LCBpZCwgZGF0YSkgPT4ge1xuICBjb25zdCBuZXh0ID0gcHJldj8ubmV4dDtcbiAgY29uc3QgY2VsbCA9IHsgaWQsIG5leHQsIHByZXYsIGRhdGEgfTtcbiAgcHJldi5uZXh0ID0gY2VsbDtcbiAgbmV4dC5wcmV2ID0gY2VsbDtcbiAgcmV0dXJuIGNlbGw7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtDYWNoZU1hcENlbGw8SywgVj59IGNlbGxcbiAqIEBwYXJhbSB7Q2FjaGVNYXBDZWxsPEssIFY+fSBwcmV2XG4gKiBAcGFyYW0ge0NhY2hlTWFwQ2VsbDxLLCBWPn0gW25leHRdXG4gKi9cbmNvbnN0IG1vdmVDZWxsQWZ0ZXIgPSAoY2VsbCwgcHJldiwgbmV4dCA9IHByZXYubmV4dCkgPT4ge1xuICBpZiAoY2VsbCA9PT0gcHJldiB8fCBjZWxsID09PSBuZXh0KSByZXR1cm47IC8qIGFscmVhZHkgaW4gcG9zaXRpb24qL1xuXG4gIC8qIFNwbGljZSBvdXQgY2VsbC4qL1xuICBjb25zdCB7IHByZXY6IG9sZFByZXYsIG5leHQ6IG9sZE5leHQgfSA9IGNlbGw7XG4gIG9sZFByZXYubmV4dCA9IG9sZE5leHQ7XG4gIG9sZE5leHQucHJldiA9IG9sZFByZXY7XG5cbiAgLyogU3BsaWNlIGluIGNlbGwgYWZ0ZXIgcHJldi4qL1xuICBjZWxsLnByZXYgPSBwcmV2O1xuICBjZWxsLm5leHQgPSBuZXh0O1xuICBwcmV2Lm5leHQgPSBjZWxsO1xuICBuZXh0LnByZXYgPSBjZWxsO1xufTtcblxuLyoqXG4gKiBDbGVhciBvdXQgYSBjZWxsIHRvIHByZXBhcmUgaXQgZm9yIGZ1dHVyZSB1c2UuIEl0cyBtYXAgaXMgcHJlc2VydmVkIHdoZW5cbiAqIHBvc3NpYmxlLCBidXQgbXVzdCBpbnN0ZWFkIGJlIHJlcGxhY2VkIGlmIHRoZSBhc3NvY2lhdGVkIGtleSBpcyBub3Qga25vd24uXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge0NhY2hlTWFwQ2VsbDxLLCBWPn0gY2VsbFxuICogQHBhcmFtIHtLIHwgVU5LTk9XTl9LRVl9IG9sZEtleVxuICogQHBhcmFtIHsoKSA9PiBTaW5nbGVFbnRyeU1hcDxLLCBWPn0gW21ha2VNYXBdIHJlcXVpcmVkIHdoZW4gdGhlIGtleSBpcyB1bmtub3duXG4gKi9cbmNvbnN0IHJlc2V0Q2VsbCA9IChjZWxsLCBvbGRLZXksIG1ha2VNYXApID0+IHtcbiAgaWYgKG9sZEtleSAhPT0gVU5LTk9XTl9LRVkpIHtcbiAgICBjZWxsLmRhdGEuZGVsZXRlKG9sZEtleSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChjZWxsLmRhdGEuY2xlYXIpIHtcbiAgICBjZWxsLmRhdGEuY2xlYXIoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgLyogV2Vha01hcCBpbnN0YW5jZXMgbXVzdCBiZSByZXBsYWNlZCB3aGVuIHRoZSBrZXkgaXMgdW5rbm93bi4qL1xuICBpZiAoIW1ha2VNYXApIHtcbiAgICB0aHJvdyBFcnJvcignaW50ZXJuYWw6IG1ha2VNYXAgaXMgcmVxdWlyZWQgd2l0aCBVTktOT1dOX0tFWScpO1xuICB9XG4gIGNlbGwuZGF0YSA9IG1ha2VNYXAoKTtcbn07XG5cbmNvbnN0IHplcm9NZXRyaWNzID0gZnJlZXplKHtcbiAgdG90YWxRdWVyeUNvdW50OiAwLFxuICB0b3RhbEhpdENvdW50OiAwXG4gIC8qIFRPRE8/Ki9cbiAgLyogKiBtZXRob2Qtc3BlY2lmaWMgY291bnRzKi9cbiAgLyogKiBsaXZlVG91Y2hTdGF0cy9ldmljdGVkVG91Y2hTdGF0cyB7IGNvdW50LCBzdW0sIG1lYW4sIG1pbiwgbWF4IH0qL1xuICAvKiAqIHA1MC9wOTAvcDk1L3A5OSB2aWEgQmVuLUhhaW0vVG9tLVRvdiBzdHJlYW1pbmcgaGlzdG9ncmFtcyovXG59KTtcbi8qKiBAdHlwZWRlZiB7dHlwZW9mIHplcm9NZXRyaWNzfSBDYWNoZU1hcE1ldHJpY3MgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge01hcENvbnN0cnVjdG9yIHwgV2Vha01hcENvbnN0cnVjdG9yfSBbQz1XZWFrTWFwQ29uc3RydWN0b3JdXG4gKiBAdGVtcGxhdGUge1BhcmFtZXRlcnM8SW5zdGFuY2VUeXBlPEM+WydzZXQnXT5bMF19IFtLPVBhcmFtZXRlcnM8SW5zdGFuY2VUeXBlPEM+WydzZXQnXT5bMF1dXG4gKiBAdGVtcGxhdGUge3Vua25vd259IFtWPXVua25vd25dXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDYWNoZU1hcEtpdFxuICogQHByb3BlcnR5IHtXZWFrTWFwQVBJPEssIFY+fSBjYWNoZVxuICogQHByb3BlcnR5IHsoKSA9PiBDYWNoZU1hcE1ldHJpY3N9IGdldE1ldHJpY3NcbiAqL1xuXG4vKipcbiAqIENyZWF0ZSBhIGJvdW5kZWQtc2l6ZSBjYWNoZSBoYXZpbmcgV2Vha01hcC1jb21wYXRpYmxlXG4gKiBgaGFzYC9gZ2V0YC9gc2V0YC9gZGVsZXRlYCBtZXRob2RzLCBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgU0VTIChzcGVjaWZpY2FsbHlcbiAqIGBhc3NlcnRgIGVycm9yIG5vdGVzKS5cbiAqIEtleSB2YWxpZGl0eSwgY29tcGFyaXNvbiwgYW5kIHJlZmVyZW50aWFsIHN0cmVuZ3RoIGFyZSBjb250cm9sbGVkIGJ5IHRoZVxuICogYG1ha2VNYXBgIG9wdGlvbiwgd2hpY2ggZGVmYXVsdHMgdG8gYFdlYWtNYXBgIGJ1dCBjYW4gYmUgc2V0IHRvIGFueSBwcm9kdWNlclxuICogb2Ygb2JqZWN0cyB3aXRoIHRob3NlIG1ldGhvZHMgKGUuZy4sIHVzaW5nIGBNYXBgIGFsbG93cyBmb3IgYXJiaXRyYXJ5IGtleXNcbiAqIHdoaWNoIHdpbGwgYmUgc3Ryb25nbHkgaGVsZCkuXG4gKiBDYWNoZSBldmljdGlvbiBwb2xpY3kgaXMgbm90IGN1cnJlbnRseSBjb25maWd1cmFibGUsIGJ1dCBzdHJpdmVzIGZvciBhIGhpdFxuICogcmF0aW8gYXQgbGVhc3QgYXMgZ29vZCBhc1xuICogW0xSVV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FjaGVfcmVwbGFjZW1lbnRfcG9saWNpZXMjTFJVKSAoZS5nLiwgaXRcbiAqIG1pZ2h0IGJlXG4gKiBbQ0xPQ0tdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BhZ2VfcmVwbGFjZW1lbnRfYWxnb3JpdGhtI0Nsb2NrKVxuICogb3IgW1NJRVZFXShodHRwczovL3NpZXZlY2FjaGUuY29tLykpLlxuICpcbiAqIEB0ZW1wbGF0ZSB7TWFwQ29uc3RydWN0b3IgfCBXZWFrTWFwQ29uc3RydWN0b3J9IFtDPVdlYWtNYXBDb25zdHJ1Y3Rvcl1cbiAqIEB0ZW1wbGF0ZSB7UGFyYW1ldGVyczxJbnN0YW5jZVR5cGU8Qz5bJ3NldCddPlswXX0gW0s9UGFyYW1ldGVyczxJbnN0YW5jZVR5cGU8Qz5bJ3NldCddPlswXV1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bn0gW1Y9dW5rbm93bl1cbiAqIEBwYXJhbSB7bnVtYmVyfSBjYXBhY2l0eVxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtDIHwgKCgpID0+IFNpbmdsZUVudHJ5TWFwPEssIFY+KX0gW29wdGlvbnMubWFrZU1hcF1cbiAqIEByZXR1cm5zIHtDYWNoZU1hcEtpdDxDLCBLLCBWPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDYWNoZU1hcEtpdCA9IChjYXBhY2l0eSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICghaXNTYWZlSW50ZWdlcihjYXBhY2l0eSkgfHwgY2FwYWNpdHkgPCAwKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFxuICAgICAgJ2NhcGFjaXR5IG11c3QgYmUgYSBub24tbmVnYXRpdmUgc2FmZSBpbnRlZ2VyIG51bWJlciA8PSAyKio1MyAtIDEnLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAdHlwZSB7PFYsPigpID0+IFNpbmdsZUVudHJ5TWFwPEssIFY+fVxuICovXG4gIGNvbnN0IG1ha2VNYXAgPSAoTWF5YmVDdG9yID0+IHtcbiAgICB0cnkge1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciovXG4gICAgICBNYXliZUN0b3IoKTtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge2FueX0gKi8gKE1heWJlQ3Rvcik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yKi9cbiAgICAgIGNvbnN0IGNvbnN0cnVjdE5ld01hcCA9ICgpID0+IG5ldyBNYXliZUN0b3IoKTtcbiAgICAgIHJldHVybiBjb25zdHJ1Y3ROZXdNYXA7XG4gICAgfVxuICB9KShvcHRpb25zLm1ha2VNYXAgPz8gV2Vha01hcCk7XG4gIGNvbnN0IHRhZyA9XG4gICAgLyoqIEB0eXBlIHthbnl9ICovIChtYWtlTWFwKCkpLmNsZWFyID09PSB1bmRlZmluZWRcbiAgICAgID8gJ1dlYWtDYWNoZU1hcCdcbiAgICAgIDogJ0NhY2hlTWFwJztcblxuICAvKiogQHR5cGUge1dlYWtNYXBBUEk8SywgQ2FjaGVNYXBDZWxsPEssIFY+Pn0gKi9cbiAgY29uc3Qga2V5VG9DZWxsID0gbWFrZU1hcCgpO1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIHRoaXMgc2VudGluZWwgaGVhZCBpcyBzcGVjaWFsKi9cbiAgY29uc3QgaGVhZCA9IC8qKiBAdHlwZSB7Q2FjaGVNYXBDZWxsPEssIFY+fSAqLyAoe1xuICAgIGlkOiAwLFxuICAgIC8qIG5leHQgYW5kIHByZXYgYXJlIGVzdGFibGlzaGVkIGJlbG93IGFzIHNlbGYtcmVmZXJlbnRpYWwuKi9cbiAgICBuZXh0OiB1bmRlZmluZWQsXG4gICAgcHJldjogdW5kZWZpbmVkLFxuICAgIGRhdGE6IHtcbiAgICAgIGhhczogKCkgPT4ge1xuICAgICAgICB0aHJvdyBFcnJvcignaW50ZXJuYWw6IHNlbnRpbmVsIGhlYWQgY2VsbCBoYXMgbm8gZGF0YScpO1xuICAgICAgfSxcbiAgICB9LFxuICB9KTtcbiAgaGVhZC5uZXh0ID0gaGVhZDtcbiAgaGVhZC5wcmV2ID0gaGVhZDtcbiAgbGV0IGNlbGxDb3VudCA9IDA7XG5cbiAgY29uc3QgbWV0cmljcyA9IGRlZXBDb3B5SnNvbmFibGUoemVyb01ldHJpY3MpO1xuICBjb25zdCBnZXRNZXRyaWNzID0gKCkgPT4gZGVlcENvcHlBbmRGcmVlemVKc29uYWJsZShtZXRyaWNzKTtcblxuICAvKipcbiAqIFRvdWNoaW5nIG1vdmVzIGEgY2VsbCB0byBmaXJzdCBwb3NpdGlvbiBzbyBMUlUgZXZpY3Rpb24gY2FuIHRhcmdldCB0aGUgbGFzdFxuICogY2VsbCAoYGhlYWQucHJldmApLlxuICpcbiAqIEB0eXBlIHsoa2V5OiBLKSA9PiAoQ2FjaGVNYXBDZWxsPEssIFY+IHwgdW5kZWZpbmVkKX1cbiAqL1xuICBjb25zdCB0b3VjaEtleSA9IGtleSA9PiB7XG4gICAgbWV0cmljcy50b3RhbFF1ZXJ5Q291bnQgKz0gMTtcbiAgICBjb25zdCBjZWxsID0ga2V5VG9DZWxsLmdldChrZXkpO1xuICAgIGlmICghY2VsbD8uZGF0YS5oYXMoa2V5KSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIG1ldHJpY3MudG90YWxIaXRDb3VudCArPSAxO1xuICAgIG1vdmVDZWxsQWZ0ZXIoY2VsbCwgaGVhZCk7XG4gICAgcmV0dXJuIGNlbGw7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHtXZWFrTWFwQVBJPEssIFY+WydoYXMnXX0gKi9cbiAgY29uc3QgaGFzID0ga2V5ID0+IHtcbiAgICBjb25zdCBjZWxsID0gdG91Y2hLZXkoa2V5KTtcbiAgICByZXR1cm4gY2VsbCAhPT0gdW5kZWZpbmVkO1xuICB9O1xuICBmcmVlemUoaGFzKTtcblxuICAvKiogQHR5cGUge1dlYWtNYXBBUEk8SywgVj5bJ2dldCddfSAqL1xuICBjb25zdCBnZXQgPSBrZXkgPT4ge1xuICAgIGNvbnN0IGNlbGwgPSB0b3VjaEtleShrZXkpO1xuICAgIHJldHVybiBjZWxsPy5kYXRhLmdldChrZXkpO1xuICB9O1xuICBmcmVlemUoZ2V0KTtcblxuICAvKiogQHR5cGUge1dlYWtNYXBBUEk8SywgVj5bJ3NldCddfSAqL1xuICBjb25zdCBzZXQgPSAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgIGxldCBjZWxsID0gdG91Y2hLZXkoa2V5KTtcbiAgICBpZiAoY2VsbCkge1xuICAgICAgY2VsbC5kYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICByZXR1cm4gaW1wbGVtZW50YXRpb247XG4gICAgfVxuXG4gICAgaWYgKGNlbGxDb3VudCA8IGNhcGFjaXR5KSB7XG4gICAgICAvKiBBZGQgYW5kIHVzZSBhIG5ldyBjZWxsIGF0IGZpcnN0IHBvc2l0aW9uLiovXG4gICAgICBjZWxsID0gYXBwZW5kTmV3Q2VsbChoZWFkLCBjZWxsQ291bnQgKyAxLCBtYWtlTWFwKCkpO1xuICAgICAgY2VsbENvdW50ICs9IDE7IC8qIGludGVudGlvbmFsbHkgZm9sbG93cyBjZWxsIGNyZWF0aW9uKi9cbiAgICAgIGNlbGwuZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChjYXBhY2l0eSA+IDApIHtcbiAgICAgIC8qIFJldXNlIHRoZSBjdXJyZW50IHRhaWwsIG1vdmluZyBpdCB0byBmaXJzdCBwb3NpdGlvbi4qL1xuICAgICAgY2VsbCA9IGhlYWQucHJldjtcbiAgICAgIHJlc2V0Q2VsbCgvKiogQHR5cGUge2FueX0gKi8gKGNlbGwpLCBVTktOT1dOX0tFWSwgbWFrZU1hcCk7XG4gICAgICBjZWxsLmRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgbW92ZUNlbGxBZnRlcihjZWxsLCBoZWFkKTtcbiAgICB9XG5cbiAgICAvKiBEb24ndCBlc3RhYmxpc2ggdGhpcyBlbnRyeSB1bnRpbCBwcmlvciBzdGVwcyBzdWNjZWVkLiovXG4gICAgaWYgKGNlbGwpIGtleVRvQ2VsbC5zZXQoa2V5LCBjZWxsKTtcblxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgcmV0dXJuIGltcGxlbWVudGF0aW9uO1xuICB9O1xuICBmcmVlemUoc2V0KTtcblxuICAvKiBcImRlbGV0ZVwiIGlzIGEga2V5d29yZC4qL1xuICBjb25zdCB7IGRlbGV0ZTogZGVsZXRlRW50cnkgfSA9IHtcbiAgICAvKiogQHR5cGUge1dlYWtNYXBBUEk8SywgVj5bJ2RlbGV0ZSddfSAqL1xuICAgIGRlbGV0ZToga2V5ID0+IHtcbiAgICAgIGNvbnN0IGNlbGwgPSBrZXlUb0NlbGwuZ2V0KGtleSk7XG4gICAgICBpZiAoIWNlbGw/LmRhdGEuaGFzKGtleSkpIHtcbiAgICAgICAga2V5VG9DZWxsLmRlbGV0ZShrZXkpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBtb3ZlQ2VsbEFmdGVyKGNlbGwsIGhlYWQucHJldik7XG4gICAgICByZXNldENlbGwoY2VsbCwga2V5KTtcbiAgICAgIGtleVRvQ2VsbC5kZWxldGUoa2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH07XG4gIGZyZWV6ZShkZWxldGVFbnRyeSk7XG5cbiAgY29uc3QgaW1wbGVtZW50YXRpb24gPSAvKiogQHR5cGUge1dlYWtNYXBBUEk8SywgVj59ICovICh7XG4gICAgaGFzLFxuICAgIGdldCxcbiAgICBzZXQsXG4gICAgZGVsZXRlOiBkZWxldGVFbnRyeSxcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvY2hlY2stdHlwZXMqL1xuICAgIFsvKiogQHR5cGUge3R5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWd9ICovICh0b1N0cmluZ1RhZ1N5bWJvbCldOiB0YWcsXG4gIH0pO1xuICBmcmVlemUoaW1wbGVtZW50YXRpb24pO1xuXG4gIGNvbnN0IGtpdCA9IHsgY2FjaGU6IGltcGxlbWVudGF0aW9uLCBnZXRNZXRyaWNzIH07XG4gIHJldHVybiBmcmVlemUoa2l0KTtcbn07JGjNj19vbmNlLm1ha2VDYWNoZU1hcEtpdChtYWtlQ2FjaGVNYXBLaXQpO1xuZnJlZXplKG1ha2VDYWNoZU1hcEtpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQ2FjaGVNYXBLaXQiOlsibWFrZUNhY2hlTWFwS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG9RIY9hCwAAYQsAACwAAABAZW5kby9jb21tb24tdjEuMi4xMy9hcHBseS1sYWJlbGluZy1lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Rocm93LWxhYmVsZWQuanMiXSwiZXhwb3J0cyI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLGlzUHJvbWlzZSx0aHJvd0xhYmVsZWQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3Rocm93LWxhYmVsZWQuanNcIiwgW1tcInRocm93TGFiZWxlZFwiLFskaM2PX2EgPT4gKHRocm93TGFiZWxlZCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIENhbGxzIGBmdW5jKC4uLmFyZ3MpYCwgYnV0IGFubm90YXRpbmcgYW55IGZhaWx1cmUgZXJyb3Igd2l0aCBgbGFiZWxgLlxuICpcbiAqIElmIGBsYWJlbGAgaXMgb21pdHRlZCBvciBgdW5kZWZpbmVkYCwgdGhlbiB0aGlzIGlzIGVxdWl2YWxlbnQgdG9cbiAqIGBmdW5jKC4uLmFyZ3MpLlxuICpcbiAqIE90aGVyd2lzZSwgaWYgaXQgc3VjY2Vzc2Z1bGx5IHJldHVybnMgYSBub24tcHJvbWlzZSwgdGhhdCBub24tcHJvbWlzZSBpc1xuICogcmV0dXJuZWQuXG4gKlxuICogSWYgaXQgdGhyb3dzLCByZXRocm93IGEgc2ltaWxhciBlcnJvciB3aG9zZSBtZXNzYWdlIGlzXG4gKiBgYGBqc1xuICogYCR7bGFiZWx9OiAke29yaWdpbmFsTWVzc2FnZX1gXG4gKiBgYGBcbiAqIFRoYXQgd2F5LCBpbiBhbiBlcnJvciBoYXBwZW5zIGRlZXAgd2l0aGluIGEgc3RhY2sgb2YgY2FsbHMgdG9cbiAqIGBhcHBseUxhYmVsaW5nRXJyb3JgLCB0aGUgcmVzdWx0aW5nIGVycm9yIHdpbGwgc2hvdyB0aGUgc3RhY2sgb2YgbGFiZWxzLlxuICpcbiAqIElmIGl0IHJldHVybnMgYSBwcm9taXNlLCB0aGVuIGBhcHBseUxhYmVsaW5nRXJyb3JgIGNhbm5vdCB0ZWxsIHVudGlsIHRoYXRcbiAqIHByb21pc2Ugc2V0dGxlcyB3aGV0aGVyIGl0IHJlcHJlc2VudHMgYSBzdWNjZXNzIG9yIGZhaWx1cmUuIFNvIGl0IGltbWVkaWF0ZWx5XG4gKiByZXR1cm5zIGEgbmV3IHByb21pc2UuIElmIHRoZSBvcmlnaW5hbCBwcm9taXNlIGZ1bGZpbGxzLCB0aGVuIHRoZVxuICogZnVsZmlsbG1lbnQgaXMgcHJvcGFnYXRlZCB0byB0aGUgcmV0dXJuZWQgcHJvbWlzZS5cbiAqXG4gKiBJZiB0aGUgcHJvbWlzZSByZWplY3RzIHdpdGggYW4gZXJyb3IsIHRoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXNcbiAqIHJlamVjdGVkIHdpdGggYSBzaW1pbGFyIHByb21pc2UsIHByZWZpeGVkIHdpdGggdGhlIGxhYmVsIGluIHRoYXQgc2FtZSB3YXkuXG4gKlxuICogQHRlbXBsYXRlIEEsUlxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBSfSBmdW5jXG4gKiBAcGFyYW0ge0FbXX0gYXJnc1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Un1cbiAqL1xuICAgICAgIGNvbnN0IGFwcGx5TGFiZWxpbmdFcnJvciA9IChmdW5jLCBhcmdzLCBsYWJlbCA9IHVuZGVmaW5lZCkgPT4ge1xuICBpZiAobGFiZWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmdW5jKC4uLmFyZ3MpO1xuICB9XG4gIGxldCByZXN1bHQ7XG4gIHRyeSB7XG4gICAgcmVzdWx0ID0gZnVuYyguLi5hcmdzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3dMYWJlbGVkKGVyciwgbGFiZWwpO1xuICB9XG4gIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgIC8qIENhbm5vdCBiZSBhdC10cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGVyZSBpcyBubyB0eXBlIGVycm9yIGxvY2FsbHkuKi9cbiAgICAvKiBSYXRoZXIsIGEgdHlwZSBlcnJvciBvbmx5IGFzIGltcG9ydGVkIGludG8gZXhvLiovXG4gICAgLyogQHRzLWlnbm9yZSBJZiByZXN1bHQgaXMgYSByZWplY3RlZCBwcm9taXNlLCB0aGlzIHdpbGwqL1xuICAgIC8qIHJldHVybiBhIHByb21pc2Ugd2l0aCBhIGRpZmZlcmVudCByZWplY3Rpb24gcmVhc29uLiBCdXQgdGhpcyovXG4gICAgLyogY29uZnVzZXMgVHlwZVNjcmlwdCBiZWNhdXNlIGl0IHR5cGVzIHRoYXQgY2FzZSBhcyBgUHJvbWlzZTxuZXZlcj5gKi9cbiAgICAvKiB3aGljaCBpcyBjb29sIGZvciBhIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyIGZ1bGZsbC4qL1xuICAgIC8qIEJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IHRoaXMgd2lsbCBvbmx5IGhhcHBlbiovXG4gICAgLyogd2hlbiBgcmVzdWx0YCB3YXMgYSByZWplY3RlZCBwcm9taXNlLiBJbiBvbmx5IHRoaXMgY2FzZSBgUmAqL1xuICAgIC8qIHNob3VsZCBhbHJlYWR5IGFsbG93IGBQcm9taXNlPG5ldmVyPmAgYXMgYSBzdWJ0eXBlLiovXG4gICAgcmV0dXJuIEUud2hlbihyZXN1bHQsIHVuZGVmaW5lZCwgcmVhc29uID0+IHRocm93TGFiZWxlZChyZWFzb24sIGxhYmVsKSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTskaM2PX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFwcGx5TGFiZWxpbmdFcnJvciI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASPhCyt0FAADdBQAAKwAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL2Zyb20tdW5pcXVlLWVudHJpZXMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIFRocm93cyBpZiBtdWx0aXBsZSBlbnRyaWVzIHVzZSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lLiBPdGhlcndpc2UgYWN0c1xuICogbGlrZSBgT2JqZWN0LmZyb21FbnRyaWVzYCBidXQgaGFyZGVucyB0aGUgcmVzdWx0LlxuICogVXNlIGl0IHRvIHByb3RlY3QgZnJvbSBwcm9wZXJ0eSBuYW1lcyBjb21wdXRlZCBmcm9tIHVzZXItcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9YW55XVxuICogQHBhcmFtIHtJdGVyYWJsZTxyZWFkb25seSBbUHJvcGVydHlLZXksIFRdPn0gYWxsRW50cmllc1xuICogQHJldHVybnMge3sgW2s6IHN0cmluZ106IFQ7IH19XG4gKi9cbiAgICAgICBjb25zdCBmcm9tVW5pcXVlRW50cmllcyA9IGFsbEVudHJpZXMgPT4ge1xuICBjb25zdCBlbnRyaWVzQXJyYXkgPSBbLi4uYWxsRW50cmllc107XG4gIGNvbnN0IHJlc3VsdCA9IGhhcmRlbihmcm9tRW50cmllcyhlbnRyaWVzQXJyYXkpKTtcbiAgaWYgKG93bktleXMocmVzdWx0KS5sZW5ndGggPT09IGVudHJpZXNBcnJheS5sZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBfXSBvZiBlbnRyaWVzQXJyYXkpIHtcbiAgICBpZiAobmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICBGYWlsYGNvbGxpc2lvbiBvbiBwcm9wZXJ0eSBuYW1lICR7cShuYW1lKX06ICR7ZW50cmllc0FycmF5fWA7XG4gICAgfVxuICAgIG5hbWVzLmFkZChuYW1lKTtcbiAgfVxuICB0aHJvdyBGYWlsYGludGVybmFsOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCBmcm9tIHVuaXF1ZSBlbnRyaWVzYDtcbn07JGjNj19vbmNlLmZyb21VbmlxdWVFbnRyaWVzKGZyb21VbmlxdWVFbnRyaWVzKTtcbmhhcmRlbihmcm9tVW5pcXVlRW50cmllcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC3lVPuJQgAACUIAAAlAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvaWRlbnQtY2hlY2tlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaWRlbnRDaGVja2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIFRPRE8gQ29tcGxldGUgbWlncmF0aW9uIG9mIENoZWNrZXIgdHlwZSBmcm9tIEBlbmRvL3Bhc3Mtc3R5bGUgdG8gQGVuZG8vY29tbW9uKi9cbi8qIGJ5IGhhdmluZyBAZW5kby9wYXNzLXN0eWxlLCBhbmQgZXZlcnlvbmUgZWxzZSB3aG8gbmVlZHMgaXQsIGltcG9ydCBpdCBmcm9tKi9cbi8qIGBAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qc2AuKi9cbi8qKlxuICogQGNhbGxiYWNrIENoZWNrZXJcbiAqIEludGVybmFsIHRvIGEgdXNlZnVsIHBhdHRlcm4gZm9yIHdyaXRpbmcgY2hlY2tpbmcgbG9naWNcbiAqIChhIFwiY2hlY2tGb29cIiBmdW5jdGlvbikgdGhhdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYSBwcmVkaWNhdGVcbiAqIChhbiBcImlzRm9vXCIgZnVuY3Rpb24pIG9yIGEgdmFsaWRhdG9yIChhbiBcImFzc2VydEZvb1wiIGZ1bmN0aW9uKS5cbiAqXG4gKiAgICAqIEEgcHJlZGljYXRlIGlkZWFsbHkgb25seSByZXR1cm5zIGB0cnVlYCBvciBgZmFsc2VgIGFuZCByYXJlbHkgdGhyb3dzLlxuICogICAgKiBBIHZhbGlkYXRvciB0aHJvd3MgYW4gaW5mb3JtYXRpdmUgZGlhZ25vc3RpYyB3aGVuIHRoZSBwcmVkaWNhdGVcbiAqICAgICAgd291bGQgaGF2ZSByZXR1cm5lZCBgZmFsc2VgLCBhbmQgc2ltcGx5IHJldHVybnMgYHVuZGVmaW5lZGAgbm9ybWFsbHlcbiAqICAgICAgd2hlbiB0aGUgcHJlZGljYXRlIHdvdWxkIGhhdmUgcmV0dXJuZWQgYHRydWVgLlxuICogICAgKiBUaGUgaW50ZXJuYWwgY2hlY2tpbmcgZnVuY3Rpb24gdGhhdCB0aGV5IHNoYXJlIGlzIHBhcmFtZXRlcml6ZWQgYnkgYVxuICogICAgICBgQ2hlY2tlcmAgdGhhdCBkZXRlcm1pbmVzIGhvdyB0byBwcm9jZWVkIHdpdGggYSBmYWlsdXJlIGNvbmRpdGlvbi5cbiAqICAgICAgUHJlZGljYXRlcyBwYXNzIGluIGFuIGlkZW50aXR5IGZ1bmN0aW9uIGFzIGNoZWNrZXIuIFZhbGlkYXRvcnNcbiAqICAgICAgcGFzcyBpbiBgYXNzZXJ0Q2hlY2tlcmAgd2hpY2ggaXMgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kIGBhc3NlcnRgLlxuICpcbiAqIFNlZSB0aGUgdmFyaW91cyB1c2VzIGZvciBnb29kIGV4YW1wbGVzLlxuICogQHBhcmFtIHtib29sZWFufSBjb25kXG4gKiBAcGFyYW0ge0lNUE9SVCgnc2VzJykuRGV0YWlsc30gW2RldGFpbHNdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEluIHRoZSBgYXNzZXJ0Rm9vYC9gaXNGb29gL2BjaGVja0Zvb2AgcGF0dGVybiwgYGNoZWNrRm9vYCBoYXMgYSBgY2hlY2tgXG4gKiBwYXJhbWV0ZXIgb2YgdHlwZSBgQ2hlY2tlcmAuIGBhc3NlcnRGb29gIGNhbGxzIGBjaGVja0Zvb2AgcGFzc2VzXG4gKiBgYXNzZXJ0Q2hlY2tlcmAgYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpc0Zvb2AgcGFzc2VzIGBpZGVudENoZWNrZXJgXG4gKiBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlkZW50Q2hlY2tlcmAgYWN0cyBwcmVjaXNlbHkgbGlrZSBhblxuICogaWRlbnRpdHkgZnVuY3Rpb24sIGJ1dCBpcyB0eXBlZCBhcyBhIGBDaGVja2VyYCB0byBpbmRpY2F0ZSBpdHNcbiAqIGludGVuZGVkIHVzZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuICAgICAgIGNvbnN0IGlkZW50Q2hlY2tlciA9IChjb25kLCBfZGV0YWlscykgPT4gY29uZDskaM2PX29uY2UuaWRlbnRDaGVja2VyKGlkZW50Q2hlY2tlcik7XG5oYXJkZW4oaWRlbnRDaGVja2VyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlkZW50Q2hlY2tlciI6WyJpZGVudENoZWNrZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYa/8argEAAC4BAAAJwAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL2xpc3QtZGlmZmVyZW5jZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibGlzdERpZmZlcmVuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyoqXG4gKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgcHJlc2VudCBpbiB0aGUgYGxlZnRMaXN0YCBhbmQgbm90XG4gKiBpbiB0aGUgYHJpZ2h0TGlzdGAuIFJldHVybiBpbiB0aGUgb3JkZXIgb2YgdGhlaXIgYXBwZWFyYW5jZSBpbiBgbGVmdExpc3RgLlxuICogVXNlcyB0aGUgY29tcGFyaXNvbiBidWlsdCBpbnRvIGBTZXRgIG1lbWJlcnNoaXAgKFNhbWVWYWx1ZVplcm8pXG4gKiB3aGljaCBpcyBsaWtlIEphdmFTY3JpcHQncyBgPT09YCBleGNlcHQgdGhhdCBpdCBqdWRnZXMgYW55IGBOYU5gIHRvXG4gKiBiZSB0aGUgc2FtZSBhcyBhbnkgYE5hTmAgYW5kIGl0IGp1ZGdlcyBgMGAgdG8gYmUgdGhlIHNhbWUgYSBgLTBgLlxuICpcbiAqIFRoaXMgaXMgb2Z0ZW4gdXNlZCBvbiBsaXN0cyBvZiBuYW1lcyB0aGF0IHNob3VsZCBtYXRjaCwgaW4gb3JkZXIgdG8gZ2VuZXJhdGVcbiAqIHVzZWZ1bCBkaWFnbm9zdGljcyBhYm91dCB0aGUgdW5tYXRjaGVkIG5hbWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7YW55fSBWXG4gKiBAcGFyYW0ge1ZbXX0gbGVmdExpc3RcbiAqIEBwYXJhbSB7VltdfSByaWdodExpc3RcbiAqL1xuICAgICAgIGNvbnN0IGxpc3REaWZmZXJlbmNlID0gKGxlZnRMaXN0LCByaWdodExpc3QpID0+IHtcbiAgY29uc3QgcmlnaHRTZXQgPSBuZXcgU2V0KHJpZ2h0TGlzdCk7XG4gIHJldHVybiBsZWZ0TGlzdC5maWx0ZXIoZWxlbWVudCA9PiAhcmlnaHRTZXQuaGFzKGVsZW1lbnQpKTtcbn07JGjNj19vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJsaXN0RGlmZmVyZW5jZSI6WyJsaXN0RGlmZmVyZW5jZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAl7F33eQQAAHkEAAArAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvbWFrZS1hcnJheS1pdGVyYXRvci5qc3siaW1wb3J0cyI6WyIuL21ha2UtaXRlcmF0b3IuanMiXSwiZXhwb3J0cyI6WyJtYWtlQXJyYXlJdGVyYXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VJdGVyYXRvcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFrZS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUl0ZXJhdG9yXCIsWyRozY9fYSA9PiAobWFrZUl0ZXJhdG9yID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBBIGBoYXJkZW5gaW5nIGFuYWxvZyBvZiBBcnJheS5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXS5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7QXJyYXk8VD59IGFyclxuICogQHJldHVybnMge0l0ZXJhYmxlSXRlcmF0b3I8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQXJyYXlJdGVyYXRvciA9IGFyciA9PiB7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBhcnI7XG4gIGxldCBpID0gMDtcbiAgcmV0dXJuIG1ha2VJdGVyYXRvcigoKSA9PiB7XG4gICAgLyoqIEB0eXBlIHtUfSAqL1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgdmFsdWUgPSBhcnJbaV07XG4gICAgICBpICs9IDE7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pO1xuICAgIH1cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFRoZSB0ZXJtaW5hbCB2YWx1ZSBkb2Vzbid0IG1hdHRlciovXG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlIH0pO1xuICB9KTtcbn07JGjNj19vbmNlLm1ha2VBcnJheUl0ZXJhdG9yKG1ha2VBcnJheUl0ZXJhdG9yKTtcbmhhcmRlbihtYWtlQXJyYXlJdGVyYXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXJyYXlJdGVyYXRvciI6WyJtYWtlQXJyYXlJdGVyYXRvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABdNq96BgMAAAYDAAAlAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvbWFrZS1pdGVyYXRvci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZUl0ZXJhdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qKlxuICogTWFrZXMgYSBvbmUtc2hvdCBpdGVyYWJsZSBpdGVyYXRvciBmcm9tIGEgcHJvdmlkZWQgYG5leHRgIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHsoKSA9PiBJdGVyYXRvclJlc3VsdDxUPn0gbmV4dFxuICogQHJldHVybnMge0l0ZXJhYmxlSXRlcmF0b3I8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlSXRlcmF0b3IgPSBuZXh0ID0+IHtcbiAgY29uc3QgaXRlciA9IGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IGl0ZXIsXG4gICAgbmV4dCxcbiAgfSk7XG4gIHJldHVybiBpdGVyO1xufTskaM2PX29uY2UubWFrZUl0ZXJhdG9yKG1ha2VJdGVyYXRvcik7XG5oYXJkZW4obWFrZUl0ZXJhdG9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VJdGVyYXRvciI6WyJtYWtlSXRlcmF0b3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAduerGW8KAABvCgAAIgAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL29iamVjdC1tYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm9iamVjdE1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtjb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQnkgYW5hbG9neSB3aXRoIGhvdyBgQXJyYXkucHJvdG90eXBlLm1hcGAgd2lsbCBtYXAgdGhlIGVsZW1lbnRzIG9mXG4gKiBhbiBhcnJheSB0byB0cmFuc2Zvcm1lZCBlbGVtZW50cyBvZiBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaGFwZSxcbiAqIGBvYmplY3RNYXBgIHdpbGwgZG8gbGlrZXdpc2UgZm9yIHRoZSBzdHJpbmctbmFtZWQgb3duIGVudW1lcmFibGVcbiAqIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LlxuICpcbiAqIFR5cGljYWwgdXNhZ2UgYXBwbGllcyBgb2JqZWN0TWFwYCB0byBhIENvcHlSZWNvcmQsIGkuZS4sXG4gKiBhbiBvYmplY3QgZm9yIHdoaWNoIGBwYXNzU3R5bGVPZihvcmlnaW5hbCkgPT09ICdjb3B5UmVjb3JkJ2AuIEZvciB0aGVzZSxcbiAqIG5vbmUgb2YgdGhlIGZvbGxvd2luZyBlZGdlIGNhc2VzIGFyaXNlLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBDb3B5UmVjb3JkXG4gKiB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydHkgbmFtZXMsIHdob3NlIHZhbHVlcyBhcmUgdGhlIG1hcHBlZCBmb3JtIG9mXG4gKiB0aGUgb3JpZ2luYWwncyB2YWx1ZXMuXG4gKlxuICogV2hlbiB0aGUgb3JpZ2luYWwgaXMgbm90IGEgQ29weVJlY29yZCwgc29tZSBlZGdlIGNhc2VzIHRvIGJlIGF3YXJlIG9mXG4gKiAgICAqIE5vIG1hdHRlciBob3cgbXV0YWJsZSB0aGUgb3JpZ2luYWwgb2JqZWN0LCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzXG4gKiAgICAgIGhhcmRlbmVkLlxuICogICAgKiBPbmx5IHRoZSBzdHJpbmctbmFtZWQgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZiB0aGUgb3JpZ2luYWxcbiAqICAgICAgYXJlIG1hcHBlZC4gQWxsIG90aGVyIHByb3BlcnRpZXMgYXJlIGlnbm9yZWQuXG4gKiAgICAqIElmIGFueSBvZiB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyB3ZXJlIGFjY2Vzc29ycywgYE9iamVjdC5lbnRyaWVzYFxuICogICAgICB3aWxsIGNhdXNlIGl0cyBgZ2V0dGVyYCB0byBiZSBjYWxsZWQgYW5kIHdpbGwgdXNlIHRoZSByZXN1bHRpbmdcbiAqICAgICAgdmFsdWUuXG4gKiAgICAqIE5vIG1hdHRlciB3aGV0aGVyIHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSB3YXMgYW4gYWNjZXNzb3IsIHdyaXRhYmxlLFxuICogICAgICBvciBjb25maWd1cmFibGUsIGFsbCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqICAgICAgbm9uLXdyaXRhYmxlLCBub24tY29uZmlndXJhYmxlLCBkYXRhIHByb3BlcnRpZXMuXG4gKiAgICAqIE5vIG1hdHRlciB3aGF0IHRoZSBvcmlnaW5hbCBvYmplY3QgbWF5IGhhdmUgaW5oZXJpdGVkIGZyb20sIGFuZFxuICogICAgICBubyBtYXR0ZXIgd2hldGhlciBpdCB3YXMgYSBzcGVjaWFsIGtpbmQgb2Ygb2JqZWN0IHN1Y2ggYXMgYW4gYXJyYXksXG4gKiAgICAgIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgYSBwbGFpbiBvYmplY3QgaW5oZXJpdGluZyBkaXJlY3RseVxuICogICAgICBmcm9tIGBPYmplY3QucHJvdG90eXBlYCBhbmQgd2hvc2Ugc3RhdGUgaXMgb25seSB0aGVzZSBuZXcgbWFwcGVkXG4gKiAgICAgIG93biBwcm9wZXJ0aWVzLlxuICpcbiAqIFdpdGggdGhlc2UgZGlmZmVyZW5jZXMsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIG9iamVjdCB3YXMgbm90IGEgQ29weVJlY29yZCxcbiAqIGlmIGFsbCB0aGUgbWFwcGVkIHZhbHVlcyBhcmUgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiBhIENvcHlSZWNvcmQuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBPXG4gKiBAdGVtcGxhdGUgUiBtYXAgcmVzdWx0XG4gKiBAcGFyYW0ge099IG9yaWdpbmFsXG4gKiBAcGFyYW0geyh2YWx1ZTogT1trZXlvZiBPXSwga2V5OiBrZXlvZiBPKSA9PiBSfSBtYXBGblxuICogQHJldHVybnMge1JlY29yZDxrZXlvZiBPLCBSPn1cbiAqL1xuICAgICAgIGNvbnN0IG9iamVjdE1hcCA9IChvcmlnaW5hbCwgbWFwRm4pID0+IHtcbiAgY29uc3QgZW50cyA9IGVudHJpZXMob3JpZ2luYWwpO1xuICBjb25zdCBtYXBFbnRzID0gZW50cy5tYXAoXG4gICAgKFtrLCB2XSkgPT4gLyoqIEB0eXBlIHtba2V5b2YgTywgUl19ICovIChbaywgbWFwRm4odiwgayldKSxcbiAgKTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPGtleW9mIE8sIFI+fSAqLyAoaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKSk7XG59OyRozY9fb25jZS5vYmplY3RNYXAob2JqZWN0TWFwKTtcbmhhcmRlbihvYmplY3RNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAComiDaOwkAADsJAAAnAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1ldGEtbWFwLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJvYmplY3RNZXRhTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO2NvbnN0IHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgY3JlYXRlLCBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIExpa2UgYG9iamVjdE1hcGAsIGJ1dCBhdCB0aGUgcmVmbGVjdGl2ZSBsZXZlbCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9yc1xuICogcmF0aGVyIHRoYW4gcHJvcGVydHkgdmFsdWVzLlxuICpcbiAqIEV4Y2VwdCBmb3IgaGFyZGVuaW5nLCB0aGUgZWRnZSBjYXNlIGJlaGF2aW9yIGlzIG1vc3RseSB0aGUgb3Bwb3NpdGUgb2ZcbiAqIHRoZSBgb2JqZWN0TWFwYCBlZGdlIGNhc2VzLlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogQWxsIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbCBhcmUgbWFwcGVkLCBldmVuIGlmIHN5bWJvbC1uYW1lZFxuICogICAgICBvciBub24tZW51bWVyYWJsZS5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCB0aGUgZGVzY3JpcHRvclxuICogICAgICBjb250YWluaW5nIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhcmUgZ2l2ZW4gdG8gYG1ldGFNYXBGbmAuXG4gKiAgICAqIFRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgcmV0dXJuZWQgYXJlIGFjY29yZGluZyB0byB0aGUgZGVzY3JpcHRvcnNcbiAqICAgICAgcmV0dXJuZWQgYnkgYG1ldGFNYXBGbmAuXG4gKiAgICAqIFRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgYSBwbGFpbiBvYmplY3Qgd2hvc2Ugc3RhdGUgaXNcbiAqICAgICAgb25seSB0aGVzZSBtYXBwZWQgb3duIHByb3BlcnRpZXMuIEl0IHdpbGwgaW5oZXJpdCBmcm9tIHRoZSB0aGlyZFxuICogICAgICBhcmd1bWVudCBpZiBwcm92aWRlZCwgZGVmYXVsdGluZyB0byBgT2JqZWN0LnByb3RvdHlwZWAgaWYgb21pdHRlZC5cbiAqXG4gKiBCZWNhdXNlIGEgcHJvcGVydHkgZGVzY3JpcHRvciBpcyBkaXN0aW5jdCBmcm9tIGB1bmRlZmluZWRgLCB3ZSBidW5kbGVcbiAqIG1hcHBpbmcgYW5kIGZpbHRlcmluZyB0b2dldGhlci4gV2hlbiB0aGUgYG1ldGFNYXBGbmAgcmV0dXJucyBgdW5kZWZpbmVkYCxcbiAqIHRoYXQgcHJvcGVydHkgaXMgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIGFueT59IE9cbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEBwYXJhbSB7KFxuICogICBkZXNjOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxPW2tleW9mIE9dPixcbiAqICAga2V5OiBrZXlvZiBPXG4gKiApID0+IChQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQpfSBtZXRhTWFwRm5cbiAqIEBwYXJhbSB7YW55fSBbcHJvdG9dXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG4gICAgICAgY29uc3Qgb2JqZWN0TWV0YU1hcCA9IChcbiAgb3JpZ2luYWwsXG4gIG1ldGFNYXBGbixcbiAgcHJvdG8gPSBPYmplY3QucHJvdG90eXBlLFxuKSA9PiB7XG4gIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvcmlnaW5hbCk7XG4gIGNvbnN0IGtleXMgPSBvd25LZXlzKG9yaWdpbmFsKTtcblxuICBjb25zdCBkZXNjRW50cmllcyA9IC8qKiBAdHlwZSB7W1Byb3BlcnR5S2V5LFByb3BlcnR5RGVzY3JpcHRvcl1bXX0gKi8gKFxuICAgIGtleXNcbiAgICAgIC5tYXAoa2V5ID0+IFtrZXksIG1ldGFNYXBGbihkZXNjc1trZXldLCBrZXkpXSlcbiAgICAgIC5maWx0ZXIoKFtfa2V5LCBvcHREZXNjXSkgPT4gb3B0RGVzYyAhPT0gdW5kZWZpbmVkKVxuICApO1xuICByZXR1cm4gaGFyZGVuKGNyZWF0ZShwcm90bywgZnJvbUVudHJpZXMoZGVzY0VudHJpZXMpKSk7XG59OyRozY9fb25jZS5vYmplY3RNZXRhTWFwKG9iamVjdE1ldGFNYXApO1xuaGFyZGVuKG9iamVjdE1ldGFNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsib2JqZWN0TWV0YU1hcCI6WyJvYmplY3RNZXRhTWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANizQYKZBQAAmQUAACUAAABAZW5kby9jb21tb24tdjEuMi4xMy90aHJvdy1sYWJlbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbInRocm93TGFiZWxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsbWFrZUVycm9yLGFubm90YXRlRXJyb3I7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogR2l2ZW4gYW4gZXJyb3IgYGlubmVyRXJyYCBhbmQgYSBgbGFiZWxgLCB0aHJvd3MgYSBzaW1pbGFyXG4gKiBlcnJvciB3aG9zZSBtZXNzYWdlIHN0cmluZyBpcyBgJHtsYWJlbH06ICR7aW5uZXJFcnIubWVzc2FnZX1gLlxuICogU2VlIGBhcHBseUxhYmVsaW5nRXJyb3JgIGZvciB0aGUgbW90aXZhdGluZyB1c2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7SU1QT1JUKCdzZXMnKS5HZW5lcmljRXJyb3JDb25zdHJ1Y3Rvcn0gW2VyckNvbnN0cnVjdG9yXVxuICogQHBhcmFtIHtJTVBPUlQoJ3NlcycpLkFzc2VydE1ha2VFcnJvck9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge25ldmVyfVxuICovXG4gICAgICAgY29uc3QgdGhyb3dMYWJlbGVkID0gKFxuICBpbm5lckVycixcbiAgbGFiZWwsXG4gIGVyckNvbnN0cnVjdG9yID0gdW5kZWZpbmVkLFxuICBvcHRpb25zID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGlmICh0eXBlb2YgbGFiZWwgPT09ICdudW1iZXInKSB7XG4gICAgbGFiZWwgPSBgWyR7bGFiZWx9XWA7XG4gIH1cbiAgY29uc3Qgb3V0ZXJFcnIgPSBtYWtlRXJyb3IoXG4gICAgYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YCxcbiAgICBlcnJDb25zdHJ1Y3RvcixcbiAgICBvcHRpb25zLFxuICApO1xuICBhbm5vdGF0ZUVycm9yKG91dGVyRXJyLCBYYENhdXNlZCBieSAke2lubmVyRXJyfWApO1xuICB0aHJvdyBvdXRlckVycjtcbn07JGjNj19vbmNlLnRocm93TGFiZWxlZCh0aHJvd0xhYmVsZWQpO1xuaGFyZGVuKHRocm93TGFiZWxlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0aHJvd0xhYmVsZWQiOlsidGhyb3dMYWJlbGVkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADSioamiAQAAogEAACIAAABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZW52LW9wdGlvbnMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvAEzgjgWAAA4FgAALAAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvc3JjL2Vudi1vcHRpb25zLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIiwiZ2V0RW52aXJvbm1lbnRPcHRpb24iLCJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0IiwibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIGdsb2JhbCBnbG9iYWxUaGlzICovXG4vKiBAdHMtY2hlY2sqL1xuXG4vKiBgQGVuZG8vZW52LW9wdGlvbnNgIG5lZWRzIHRvIGJlIGltcG9ydGVkIHF1aXRlIGVhcmx5LCBhbmQgc28gc2hvdWxkKi9cbi8qIGF2b2lkIGltcG9ydGluZyBmcm9tIHNlcyBvciBhbnl0aGluZyB0aGF0IGRlcGVuZHMgb24gc2VzLiovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cbi8qIFByZWx1ZGUgb2YgY2hlYXAgZ29vZCAtIGVub3VnaCBpbWl0YXRpb25zIG9mIHRoaW5ncyB3ZSdkIHVzZSBvciovXG4vKiBkbyBkaWZmZXJlbnRseSBpZiB3ZSBjb3VsZCBkZXBlbmQgb24gc2VzKi9cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG5jb25zdCBsb2NhbFRoaXMgPSBnbG9iYWxUaGlzO1xuXG5jb25zdCB7IE9iamVjdCwgUmVmbGVjdCwgQXJyYXksIFN0cmluZywgSlNPTiwgRXJyb3IgfSA9IGxvY2FsVGhpcztcbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vKiBTaG91bGQgYmUgZXF1aXZhbGVudCB0byB0aGUgb25lIGluIHNlcycgY29tbW9ucy5qcyBldmVuIHRob3VnaCBpdCovXG4vKiB1c2VzIHRoZSBvdGhlciB0ZWNobmlxdWUuKi9cbmNvbnN0IHVuY3VycnlUaGlzID1cbiAgZm4gPT5cbiAgKHJlY2VpdmVyLCAuLi5hcmdzKSA9PlxuICAgIGFwcGx5KGZuLCByZWNlaXZlciwgYXJncyk7XG5jb25zdCBhcnJheVB1c2ggPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUucHVzaCk7XG5jb25zdCBhcnJheUluY2x1ZGVzID0gdW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKTtcbmNvbnN0IHN0cmluZ1NwbGl0ID0gdW5jdXJyeVRoaXMoU3RyaW5nLnByb3RvdHlwZS5zcGxpdCk7XG5cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuY29uc3QgRmFpbCA9IChsaXRlcmFscywgLi4uYXJncykgPT4ge1xuICBsZXQgbXNnID0gbGl0ZXJhbHNbMF07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIG1zZyA9IGAke21zZ30ke2FyZ3NbaV19JHtsaXRlcmFsc1tpICsgMV19YDtcbiAgfVxuICB0aHJvdyBFcnJvcihtc2cpO1xufTtcblxuLyogZW5kIHByZWx1ZGUqL1xuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIGBtYWtlRW52aXJvbm1lbnRDYXB0b3JgIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBnZXR0aW5nIGVudmlyb25tZW50XG4gKiB2YXJpYWJsZXMsIGlmIHRoZXkgYXJlIG5lZWRlZCwgYW5kIGEgd2F5IHRvIGNhdGFsb2cgdGhlIG5hbWVzIG9mIGFsbFxuICogdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IHdlcmUgY2FwdHVyZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFHbG9iYWxcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Ryb3BOYW1lc10gRGVmYXVsdHMgdG8gZmFsc2UuIElmIHRydWUsIGRvbid0IHRyYWNrXG4gKiBuYW1lcyB1c2VkLlxuICovXG4gICAgICAgY29uc3QgbWFrZUVudmlyb25tZW50Q2FwdG9yID0gKGFHbG9iYWwsIGRyb3BOYW1lcyA9IGZhbHNlKSA9PiB7XG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9IFtdO1xuXG4gIC8qKlxuICogR2V0cyBhbiBlbnZpcm9ubWVudCBvcHRpb24gYnkgbmFtZSBhbmQgcmV0dXJucyB0aGUgb3B0aW9uIHZhbHVlIG9yIHRoZVxuICogZ2l2ZW4gZGVmYXVsdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGRlZmF1bHRTZXR0aW5nXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3B0T3RoZXJWYWx1ZXNdXG4gKiBJZiBwcm92aWRlZCwgdGhlIG9wdGlvbiB2YWx1ZSBtdXN0IGJlIGluY2x1ZGVkIG9yIG1hdGNoIGBkZWZhdWx0U2V0dGluZ2AuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG4gIGNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uID0gKFxuICAgIG9wdGlvbk5hbWUsXG4gICAgZGVmYXVsdFNldHRpbmcsXG4gICAgb3B0T3RoZXJWYWx1ZXMgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgIHR5cGVvZiBvcHRpb25OYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZSAke3Eob3B0aW9uTmFtZSl9IG11c3QgYmUgYSBzdHJpbmcuYDtcbiAgICB0eXBlb2YgZGVmYXVsdFNldHRpbmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBkZWZhdWx0IHNldHRpbmcgJHtxKFxuICAgICAgICBkZWZhdWx0U2V0dGluZyxcbiAgICAgICl9IG11c3QgYmUgYSBzdHJpbmcuYDtcblxuICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgIGxldCBzZXR0aW5nID0gZGVmYXVsdFNldHRpbmc7XG4gICAgY29uc3QgZ2xvYmFsUHJvY2VzcyA9IGFHbG9iYWwucHJvY2VzcyB8fCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZ2xvYmFsRW52ID1cbiAgICAgICh0eXBlb2YgZ2xvYmFsUHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgZ2xvYmFsUHJvY2Vzcy5lbnYpIHx8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGdsb2JhbEVudiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChvcHRpb25OYW1lIGluIGdsb2JhbEVudikge1xuICAgICAgICBpZiAoIWRyb3BOYW1lcykge1xuICAgICAgICAgIGFycmF5UHVzaChjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsIG9wdGlvbk5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gZ2xvYmFsRW52W29wdGlvbk5hbWVdO1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbCovXG4gICAgICAgIHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lZCAke3EoXG4gICAgICAgICAgICBvcHRpb25OYW1lLFxuICAgICAgICAgICl9LCBpZiBwcmVzZW50LCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHN0cmluZyB2YWx1ZSwgZ290ICR7cShcbiAgICAgICAgICAgIG9wdGlvblZhbHVlLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgc2V0dGluZyA9IG9wdGlvblZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBvcHRPdGhlclZhbHVlcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBzZXR0aW5nID09PSBkZWZhdWx0U2V0dGluZyB8fFxuICAgICAgYXJyYXlJbmNsdWRlcyhvcHRPdGhlclZhbHVlcywgc2V0dGluZykgfHxcbiAgICAgIEZhaWxgVW5yZWNvZ25pemVkICR7cShvcHRpb25OYW1lKX0gdmFsdWUgJHtxKFxuICAgICAgICBzZXR0aW5nLFxuICAgICAgKX0uIEV4cGVjdGVkIG9uZSBvZiAke3EoW2RlZmF1bHRTZXR0aW5nLCAuLi5vcHRPdGhlclZhbHVlc10pfWA7XG4gICAgcmV0dXJuIHNldHRpbmc7XG4gIH07XG4gIGZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbik7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gW1Q9c3RyaW5nXVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbiAgY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCA9IG9wdGlvbk5hbWUgPT4ge1xuICAgIGNvbnN0IG9wdGlvbiA9IGdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsICcnKTtcbiAgICByZXR1cm4gZnJlZXplKG9wdGlvbiA9PT0gJycgPyBbXSA6IHN0cmluZ1NwbGl0KG9wdGlvbiwgJywnKSk7XG4gIH07XG4gIGZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBbVD1zdHJpbmddXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICogQHBhcmFtIHtUfSBlbGVtZW50XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzID0gKG9wdGlvbk5hbWUsIGVsZW1lbnQpID0+XG4gICAgYXJyYXlJbmNsdWRlcyhnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KG9wdGlvbk5hbWUpLCBlbGVtZW50KTtcblxuICBjb25zdCBnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIGZyZWV6ZShbLi4uY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzXSk7XG4gIH07XG4gIGZyZWV6ZShnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMpO1xuXG4gIHJldHVybiBmcmVlemUoe1xuICAgIGdldEVudmlyb25tZW50T3B0aW9uLFxuICAgIGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG4gICAgZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyxcbiAgICBnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUVudmlyb25tZW50Q2FwdG9yKG1ha2VFbnZpcm9ubWVudENhcHRvcik7XG5mcmVlemUobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcblxuLyoqXG4gKiBGb3IgdGhlIHNpbXBsZSBjYXNlLCB3aGVyZSB0aGUgZ2xvYmFsIGluIHF1ZXN0aW9uIGlzIGBnbG9iYWxUaGlzYCBhbmQgbm9cbiAqIHJlcG9ydGluZyBvZiBvcHRpb24gbmFtZXMgaXMgZGVzaXJlZC5cbiAqL1xuICAgICAgIGNvbnN0IHtcbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gIGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG4gIGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG59ID0gbWFrZUVudmlyb25tZW50Q2FwdG9yKGxvY2FsVGhpcywgdHJ1ZSk7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uKGdldEVudmlyb25tZW50T3B0aW9uKTskaM2PX29uY2UuZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdChnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTskaM2PX29uY2UuZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyhlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbnZpcm9ubWVudENhcHRvciI6WyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwiZ2V0RW52aXJvbm1lbnRPcHRpb24iOlsiZ2V0RW52aXJvbm1lbnRPcHRpb24iXSwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCI6WyJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0Il0sImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABqZnbiZA0AAGQNAAAdAAAAQGVuZG8vZXJyb3JzLXYxLjIuMTMvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkZhaWwiLCJYIiwiYW5ub3RhdGVFcnJvciIsImFzc2VydCIsImIiLCJiYXJlIiwibWFrZUVycm9yIiwibm90ZSIsInEiLCJxdW90ZSIsInJlZGFjdGVkIiwidGhyb3dSZWRhY3RlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogVGhpcyBtb2R1bGUgYXNzdW1lcyB0aGUgZXhpc3RlbmNlIG9mIGEgbm9uLXN0YW5kYXJkIGBhc3NlcnRgIGhvc3Qgb2JqZWN0LiovXG4vKiBTRVMgdmVyc2lvbiAwLjExLjAgaW50cm9kdWNlcyB0aGlzIGdsb2JhbCBvYmplY3QgYW5kIGVudGFuZ2xlcyBpdCovXG4vKiB3aXRoIHRoZSBgY29uc29sZWAgaG9zdCBvYmplY3QgaW4gc2NvcGUgd2hlbiBpdCBpbml0aWFsaXplcywqL1xuLyogYWxsb3dpbmcgZXJyb3JzLCBwYXJ0aWN1bGFybHkgYXNzZXJ0aW9uIGVycm9ycywgdG8gaGlkZSB0aGVpciBcImRldGFpbHNcIiovXG4vKiBmcm9tIGNhbGxlcnMgdGhhdCBtaWdodCBjYXRjaCB0aG9zZSBlcnJvcnMsIHRoZW4gcmV2ZWFsIHRoZW0gdG8gdGhlKi9cbi8qIHVuZGVybHlpbmcgY29uc29sZS4qL1xuLyogVG8gdGhlIGV4dGVudCB0aGF0IHRoaXMgYGNvbnNvbGVgIGlzIGNvbnNpZGVyZWQgYSByZXNvdXJjZSwqL1xuLyogdGhpcyBtb2R1bGUgbXVzdCBiZSBjb25zaWRlcmVkIGEgcmVzb3VyY2UgbW9kdWxlLiovXG5cbi8qIFRoZSBhc3NlcnRpb25zIHJlLWV4cG9ydGVkIGhlcmUgYXJlIGRlZmluZWQgaW4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvSEVBRC9wYWNrYWdlcy9zZXMvc3JjL2Vycm9yL2Fzc2VydC5qcyovXG5cbmNvbnN0IGdsb2JhbEFzc2VydCA9IGdsb2JhbFRoaXMuYXNzZXJ0O1xuXG5pZiAoZ2xvYmFsQXNzZXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgdGhyb3cgRXJyb3IoXG4gICAgYENhbm5vdCBpbml0aWFsaXplIEBlbmRvL2Vycm9ycywgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCwgaW1wb3J0ICdzZXMnIGJlZm9yZSAnQGVuZG8vZXJyb3JzJ2AsXG4gICk7XG59XG5cbmNvbnN0IG1pc3NpbmcgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoW1xuICAndHlwZW9mJyxcbiAgJ2Vycm9yJyxcbiAgJ2ZhaWwnLFxuICAnZXF1YWwnLFxuICAnc3RyaW5nJyxcbiAgJ25vdGUnLFxuICAnZGV0YWlscycsXG4gICdGYWlsJyxcbiAgJ3F1b3RlJyxcbiAgLyogQXMgb2YgMjAyNC0wMiwgdGhlIEFnb3JpYyBjaGFpbidzIGJvb3RzdHJhcCB2YXQgcnVucyB3aXRoIGEgdmVyc2lvbiBvZiBTRVMgdGhhdCovXG4gIC8qIHByZWRhdGVzIGFkZGl0aW9uIG9mIHRoZSAnYmFyZScgbWV0aG9kLCBzbyB3ZSBtdXN0IHRvbGVyYXRlIGl0cyBhYnNlbmNlIGFuZCBmYWxsKi9cbiAgLyogYmFjayB0byBxdW90ZSBiZWhhdmlvciBpbiB0aGF0IGVudmlyb25tZW50IChzZWUgYmVsb3cpLiovXG4gIC8qICdiYXJlJywqL1xuICAnbWFrZUFzc2VydCcsXG5dKS5maWx0ZXIobmFtZSA9PiBnbG9iYWxBc3NlcnRbbmFtZV0gPT09IHVuZGVmaW5lZCk7XG5pZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbiAgICAgICcsICcsXG4gICAgKX1gLFxuICApO1xufVxuXG4vKiBUaGUgZ2xvYmFsIGFzc2VydCBtaXhlZCBhc3NlcnRpb25zIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucy4qL1xuLyogVGhpcyBtb2R1bGUgc3BsaXRzIHRoZW0gYXBhcnQqL1xuLyogYW5kIGFsc28gdXBkYXRlcyB0aGUgbmFtZXMgb2YgdGhlIHV0aWxpdHkgZnVuY3Rpb25zLiovXG5jb25zdCB7XG4gIGJhcmUsXG4gIGRldGFpbHM6IHJlZGFjdGVkLFxuICBlcnJvcjogbWFrZUVycm9yLFxuICBGYWlsOiB0aHJvd1JlZGFjdGVkLFxuICBtYWtlQXNzZXJ0OiBfb21pdHRlZE1ha2VBc3NlcnQsXG4gIG5vdGUsXG4gIHF1b3RlLFxuICAuLi5hc3NlcnRpb25zXG59ID0gZ2xvYmFsQXNzZXJ0O1xuLyoqIEB0eXBlIHtJTVBPUlQoXCJzZXNcIikuQXNzZXJ0aW9uRnVuY3Rpb25zIH0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgbWlzc2luZyBwcm9wZXJ0aWVzIGFzc2lnbmVkIG5leHQqLyRozY9fb25jZS5yZWRhY3RlZChyZWRhY3RlZCk7JGjNj19vbmNlLm1ha2VFcnJvcihtYWtlRXJyb3IpOyRozY9fb25jZS50aHJvd1JlZGFjdGVkKHRocm93UmVkYWN0ZWQpOyRozY9fb25jZS5ub3RlKG5vdGUpOyRozY9fb25jZS5xdW90ZShxdW90ZSk7XG5jb25zdCBhc3NlcnQgPSAodmFsdWUsIG9wdERldGFpbHMsIGVyckNvbnRydWN0b3IsIG9wdGlvbnMpID0+XG4gIGdsb2JhbEFzc2VydCh2YWx1ZSwgb3B0RGV0YWlscywgZXJyQ29udHJ1Y3Rvciwgb3B0aW9ucyk7JGjNj19vbmNlLmFzc2VydChhc3NlcnQpO1xuT2JqZWN0LmFzc2lnbihhc3NlcnQsIGFzc2VydGlvbnMpO1xuXG4vKiBBcyBvZiAyMDI0LTAyLCB0aGUgQWdvcmljIGNoYWluJ3MgYm9vdHN0cmFwIHZhdCBydW5zIHdpdGggYSB2ZXJzaW9uIG9mIFNFUyovXG4vKiB0aGF0IHByZWRhdGVzIHRoZSBhZGRpdGlvbiBvZiB0aGUgJ2JhcmUnIG1ldGhvZCwgc28gd2UgbXVzdCBmYWxsIGJhY2sgdG8qL1xuLyogcXVvdGUgYmVoYXZpb3IgZm9yIHRoYXQgZW52aXJvbm1lbnQuKi9cbmNvbnN0IGJhcmVPclF1b3RlID0gYmFyZSB8fCBxdW90ZTtcblxuLyogWFhYIG1vZHVsZSBleHBvcnRzIGZhaWwgaWYgdGhlc2UgYXJlbid0IGluIHNjb3BlKi9cbi8qKiBAaW1wb3J0IHtBc3NlcnRNYWtlRXJyb3JPcHRpb25zLCBEZXRhaWxzLCBHZW5lcmljRXJyb3JDb25zdHJ1Y3Rvcn0gZnJvbSAnc2VzJyAqLyRozY9fb25jZS5iYXJlT3JRdW90ZShiYXJlT3JRdW90ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWRhY3RlZCI6WyJyZWRhY3RlZCJdLCJYIjpbInJlZGFjdGVkIl0sIm1ha2VFcnJvciI6WyJtYWtlRXJyb3IiXSwidGhyb3dSZWRhY3RlZCI6WyJ0aHJvd1JlZGFjdGVkIl0sIkZhaWwiOlsidGhyb3dSZWRhY3RlZCJdLCJub3RlIjpbIm5vdGUiXSwiYW5ub3RhdGVFcnJvciI6WyJub3RlIl0sInF1b3RlIjpbInF1b3RlIl0sInEiOlsicXVvdGUiXSwiYXNzZXJ0IjpbImFzc2VydCJdLCJiYXJlIjpbImJhcmVPclF1b3RlIl0sImIiOlsiYmFyZU9yUXVvdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0+lGCBBHAAAQRwAAIwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9FLmpzeyJpbXBvcnRzIjpbIi4vdHJhY2stdHVybnMuanMiLCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgdHJhY2tUdXJucyxtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsWyRozY9fYSA9PiAodHJhY2tUdXJucyA9ICRozY9fYSldXV1dLFtcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsWyRozY9fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5jb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxLCBGYWlsLCBlcnJvcjogbWFrZUVycm9yIH0gPSBhc3NlcnQ7XG5jb25zdCB7IGFzc2lnbiwgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQGltcG9ydCB7IEhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3IsIFJlbW90YWJsZUJyYW5kLCBDYWxsYWJsZSwgU2V0dGxlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IG9uU2VuZCA9IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcignRU5ET19TRU5EX0JSRUFLUE9JTlRTJyk7XG5cbi8qKiBAdHlwZSB7UHJveHlIYW5kbGVyPGFueT59ICovXG5jb25zdCBiYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyID0ge1xuICBzZXQoX3RhcmdldCwgX3Byb3AsIF92YWx1ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgaXNFeHRlbnNpYmxlKF90YXJnZXQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHNldFByb3RvdHlwZU9mKF90YXJnZXQsIF92YWx1ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZGVsZXRlUHJvcGVydHkoX3RhcmdldCwgX3Byb3ApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG59O1xuXG4vKiBFIFByb3h5IGhhbmRsZXJzIHByZXRlbmQgdGhhdCBhbnkgcHJvcGVydHkgZXhpc3RzIG9uIHRoZSB0YXJnZXQgYW5kIHJldHVybnMqL1xuLyogYSBmdW5jdGlvbiBmb3IgdGhlaXIgdmFsdWUuIFdoaWxlIHRoaXMgZnVuY3Rpb24gaXMgXCJib3VuZFwiIGJ5IGNvbnRleHQsIGl0IGlzKi9cbi8qIG1lYW50IHRvIGJlIGNhbGxlZCBhcyBhIG1ldGhvZC4gRm9yIHRoYXQgcmVhc29uLCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24qL1xuLyogaW5jbHVkZXMgYSBjaGVjayB0aGF0IHRoZSBgdGhpc2AgYXJndW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIGluaXRpYWwqL1xuLyogcmVjZWl2ZXIgd2hlbiB0aGUgZnVuY3Rpb24gd2FzIHJldHJpZXZlZC4qL1xuLyogRSBQcm94eSBoYW5kbGVycyBhbHNvIGZvcndhcmQgZGlyZWN0IGNhbGxzIHRvIHRoZSB0YXJnZXQgaW4gY2FzZSB0aGUgcmVtb3RlKi9cbi8qIGlzIGEgZnVuY3Rpb24gaW5zdGVhZCBvZiBhbiBvYmplY3QuIE5vIHN1Y2ggcmVjZWl2ZXIgY2hlY2tzIGFyZSBuZWNlc3NhcnkgaW4qL1xuLyogdGhhdCBjYXNlLiovXG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFKHgpLlxuICpcbiAqIEBwYXJhbSB7YW55fSByZWNpcGllbnQgQW55IHZhbHVlIHBhc3NlZCB0byBFKHgpXG4gKiBAcGFyYW0ge0hhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyPHVua25vd24+fSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5jb25zdCBtYWtlRVByb3h5SGFuZGxlciA9IChyZWNpcGllbnQsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcGVydHlLZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKFxuICAgICAgICB7XG4gICAgICAgICAgLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuICAgICAgICAgIC8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4gICAgICAgICAgLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbiAgICAgICAgICAvKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG4gICAgICAgICAgLyoqIEB0eXBlIHsoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8dW5rbm93bj59ICovXG4gICAgICAgICAgW3Byb3BlcnR5S2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAodGhpcyAhPT0gcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgLyogUmVqZWN0IHRoZSBhc3luYyBmdW5jdGlvbiBjYWxsKi9cbiAgICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbiAgICAgICAgICAgICAgICBtYWtlRXJyb3IoXG4gICAgICAgICAgICAgICAgICBYYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKHByb3BlcnR5S2V5KX1cIiBtZXRob2Qgb2YgRSgke3EoXG4gICAgICAgICAgICAgICAgICAgIHJlY2lwaWVudCxcbiAgICAgICAgICAgICAgICAgICl9KWAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuICAgICAgICAgICAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgbWV0aG9kLWNhbGwqL1xuICAgICAgICAgICAgICAvKiBtZXNzYWdlLCovXG4gICAgICAgICAgICAgIC8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4gICAgICAgICAgICAgIC8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZChyZWNpcGllbnQsIHByb3BlcnR5S2V5LCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki9cbiAgICAgICAgfVtwcm9wZXJ0eUtleV0sXG4gICAgICApO1xuICAgIH0sXG4gICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJnQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbiAgICAgICAgZGVidWdnZXI7IC8qIExPT0sgVVAgVEhFIFNUQUNLKi9cbiAgICAgICAgLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gZXZlbnR1YWwtc2VuZCBvZiBhIGZ1bmN0aW9uLWNhbGwgbWVzc2FnZSwqL1xuICAgICAgICAvKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuICAgICAgICAvKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gICAgICB9XG4gICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvbihyZWNpcGllbnQsIGFyZ0FycmF5KTtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvKiBXZSBqdXN0IHByZXRlbmQgZXZlcnl0aGluZyBleGlzdHMuKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH0pO1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHthbnl9IHJlY2lwaWVudCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUuc2VuZE9ubHkoeClcbiAqIEBwYXJhbSB7SGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXI8dW5rbm93bj59IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbiAgICAgICAgICAvKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuICAgICAgICAgIC8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4gICAgICAgICAgLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuICAgICAgICAgIC8qKiBAdHlwZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiB1bmRlZmluZWR9ICovXG4gICAgICAgICAgW3Byb3BlcnR5S2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICAvKiBUaHJvdyBzaW5jZSB0aGUgZnVuY3Rpb24gcmV0dXJucyBub3RoaW5nKi9cbiAgICAgICAgICAgIHRoaXMgPT09IHJlY2VpdmVyIHx8XG4gICAgICAgICAgICAgIEZhaWxgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EoXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgICAgICl9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKHJlY2lwaWVudCl9KWA7XG4gICAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgICAgICAgICAgIGRlYnVnZ2VyOyAvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4gICAgICAgICAgICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBtZXRob2QtY2FsbCovXG4gICAgICAgICAgICAgIC8qIG1lc3NhZ2UsKi9cbiAgICAgICAgICAgICAgLyogc28gdGhhdCB5b3UgY2FuIHdhbGsgYmFjayBvbiB0aGUgc3RhY2sgdG8gc2VlIGhvdyB3ZSBjYW1lIHRvKi9cbiAgICAgICAgICAgICAgLyogbWFrZSB0aGlzIGV2ZW50dWFsLXNlbmQqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2RTZW5kT25seShyZWNpcGllbnQsIHByb3BlcnR5S2V5LCBhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovXG4gICAgICAgIH1bcHJvcGVydHlLZXldLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIGFyZ3NBcnJheSA9IFtdKSA9PiB7XG4gICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgICAgICBkZWJ1Z2dlcjsgLyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuICAgICAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgZnVuY3Rpb24tY2FsbCBtZXNzYWdlLCovXG4gICAgICAgIC8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4gICAgICAgIC8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiAgICAgIH1cbiAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seShyZWNpcGllbnQsIGFyZ3NBcnJheSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgaGFzOiAoX3RhcmdldCwgX3ApID0+IHtcbiAgICAgIC8qIFdlIGp1c3QgcHJldGVuZCB0aGF0IGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUuZ2V0KHgpXG4gKiBJdCBpcyBhIHZhcmlhbnQgb24gdGhlIEUoeCkgUHJveHkgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0ge2FueX0geCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUuZ2V0KHgpXG4gKiBAcGFyYW0ge0hhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyPHVua25vd24+fSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5jb25zdCBtYWtlRUdldFByb3h5SGFuZGxlciA9ICh4LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGhhczogKF90YXJnZXQsIF9wcm9wKSA9PiB0cnVlLFxuICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IEhhbmRsZWRQcm9taXNlLmdldCh4LCBwcm9wKSxcbiAgfSk7XG5cbi8qKlxuICogYGZyZWV6ZWAgYnV0IG5vdCBgaGFyZGVuYCB0aGUgcHJveHkgdGFyZ2V0IHNvIGl0IHJlbWFpbnMgdHJhcHBpbmcuXG4gKiBUaHVzLCBpdCBzaG91bGQgbm90IGJlIHNoYXJlZCBvdXRzaWRlIHRoaXMgbW9kdWxlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3Nlcy9kb2NzL3ByZXBhcmluZy1mb3Itc3RhYmlsaXplLm1kXG4gKi9cbmNvbnN0IGZ1bmNUYXJnZXQgPSBmcmVlemUoKCkgPT4ge30pO1xuXG4vKipcbi8qKlxuICogYGZyZWV6ZWAgYnV0IG5vdCBgaGFyZGVuYCB0aGUgcHJveHkgdGFyZ2V0IHNvIGl0IHJlbWFpbnMgdHJhcHBpbmcuXG4gKiBUaHVzLCBpdCBzaG91bGQgbm90IGJlIHNoYXJlZCBvdXRzaWRlIHRoaXMgbW9kdWxlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3Nlcy9kb2NzL3ByZXBhcmluZy1mb3Itc3RhYmlsaXplLm1kXG4gKi9cbmNvbnN0IG9ialRhcmdldCA9IGZyZWV6ZSh7IF9fcHJvdG9fXzogbnVsbCB9KTtcblxuLyoqXG4gKiBAcGFyYW0ge0hhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKi9cbmNvbnN0IG1ha2VFID0gSGFuZGxlZFByb21pc2UgPT4ge1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGFzc2lnbihcbiAgICAgIC8qKlxuICogRSh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBjYWxsIGFyYml0cmFyeSBtZXRob2RzLiBFYWNoIG9mIHRoZXNlXG4gKiBtZXRob2QgY2FsbHMgcmV0dXJucyBhIHByb21pc2UuIFRoZSBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIG9uIHdoYXRldmVyXG4gKiAneCcgZGVzaWduYXRlcyAob3IgcmVzb2x2ZXMgdG8pIGluIGEgZnV0dXJlIHR1cm4sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBBbiBleGFtcGxlIGNhbGwgd291bGQgYmVcbiAqXG4gKiBFKHpvZSkuaW5zdGFsbChidW5kbGUpXG4gKiAgIC50aGVuKGluc3RhbGxhdGlvbkhhbmRsZSA9PiB7IC4uLiB9KVxuICogICAuY2F0Y2goZXJyID0+IHsgLi4uIH0pO1xuICpcbiAqICBTZWUgaHR0cHM6Ly9lbmRvanMuZ2l0aHViLmlvL2VuZG8vZnVuY3Rpb25zL19lbmRvX2Zhci5FLmh0bWwgZm9yIGRldGFpbHMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB0YXJnZXQgZm9yIG1ldGhvZC9mdW5jdGlvbiBjYWxsXG4gKiBAcmV0dXJucyB7RUNhbGxhYmxlT3JNZXRob2RzPFJlbW90ZUZ1bmN0aW9uczxUPj59IG1ldGhvZC9mdW5jdGlvbiBjYWxsIHByb3h5XG4gKi9cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIHR5cGVkZWYqL1xuICAgICAgeCA9PiBuZXcgUHJveHkoZnVuY1RhcmdldCwgbWFrZUVQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcbiAgICAgIHtcbiAgICAgICAgLyoqXG4gKiBFLmdldCh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBnZXQgYXJiaXRyYXJ5IHByb3BlcnRpZXMuXG4gKiBFYWNoIG9mIHRoZXNlIHByb3BlcnRpZXMgcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSBwcm9wZXJ0eS4gIFRoZSBwcm9taXNlXG4gKiB2YWx1ZSB3aWxsIGJlIHRoZSBwcm9wZXJ0eSBmZXRjaGVkIGZyb20gd2hhdGV2ZXIgJ3gnIGRlc2lnbmF0ZXMgKG9yXG4gKiByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBwcm9wZXJ0eSBnZXRcbiAqIEByZXR1cm5zIHtFR2V0dGVyczxMb2NhbFJlY29yZDxUPj59IHByb3BlcnR5IGdldCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggdHlwZWRlZiovXG4gICAgICAgIGdldDogeCA9PiBuZXcgUHJveHkob2JqVGFyZ2V0LCBtYWtlRUdldFByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuXG4gICAgICAgIC8qKlxuICogRS5yZXNvbHZlKHgpIGNvbnZlcnRzIHggdG8gYSBoYW5kbGVkIHByb21pc2UuIEl0IGlzXG4gKiBzaG9ydGhhbmQgZm9yIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeClcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBoYW5kbGVkIHByb21pc2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBoYW5kbGVkIHByb21pc2UgZm9yIHhcbiAqIEByZWFkb25seVxuICovXG4gICAgICAgIHJlc29sdmU6IEhhbmRsZWRQcm9taXNlLnJlc29sdmUsXG5cbiAgICAgICAgLyoqXG4gKiBFLnNlbmRPbmx5IHJldHVybnMgYSBwcm94eSBzaW1pbGFyIHRvIEUsIGJ1dCBmb3Igd2hpY2ggdGhlIHJlc3VsdHNcbiAqIGFyZSBpZ25vcmVkICh1bmRlZmluZWQgaXMgcmV0dXJuZWQpLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBtZXRob2QvZnVuY3Rpb24gY2FsbFxuICogQHJldHVybnMge0VTZW5kT25seUNhbGxhYmxlT3JNZXRob2RzPFJlbW90ZUZ1bmN0aW9uczxUPj59IG1ldGhvZC9mdW5jdGlvbiBjYWxsIHByb3h5XG4gKiBAcmVhZG9ubHlcbiAqL1xuICAgICAgICBzZW5kT25seTogeCA9PlxuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIHR5cGVkZWYqL1xuICAgICAgICAgIG5ldyBQcm94eShmdW5jVGFyZ2V0LCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG5cbiAgICAgICAgLyoqXG4gKiBFLndoZW4oeCwgcmVzLCByZWopIGlzIGVxdWl2YWxlbnQgdG9cbiAqIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihyZXMsIHJlailcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtVID0gVF1cbiAqIEBwYXJhbSB7VHxQcm9taXNlTGlrZTxUPn0geCB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgaGFuZGxlZCBwcm9taXNlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gRVJlZjxVPn0gW29uZnVsZmlsbGVkXVxuICogQHBhcmFtIHsocmVhc29uOiBhbnkpID0+IEVSZWY8VT59IFtvbnJlamVjdGVkXVxuICogQHJldHVybnMge1Byb21pc2U8VT59XG4gKiBAcmVhZG9ubHlcbiAqL1xuICAgICAgICB3aGVuOiAoeCwgb25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpID0+XG4gICAgICAgICAgSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKFxuICAgICAgICAgICAgLi4udHJhY2tUdXJucyhbb25mdWxmaWxsZWQsIG9ucmVqZWN0ZWRdKSxcbiAgICAgICAgICApLFxuICAgICAgfSxcbiAgICApLFxuICApO1xufTtcblxuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0Om1ha2VFfTtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPG1ha2VFPn0gRVByb3h5ICovXG5cbi8qKlxuICogRGVjbGFyZSBhbiBvYmplY3QgdGhhdCBpcyBwb3RlbnRpYWxseSBhIGZhciByZWZlcmVuY2Ugb2YgdHlwZSBQcmltYXJ5IHdob3NlXG4gKiBhdXhpbGxpYXJ5IGRhdGEgaGFzIHR5cGUgTG9jYWwuICBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIGNvbnN1bWVycyBvZlxuICogRmFyIG9iamVjdHMgaW4gYXJndW1lbnRzIGFuZCBkZWNsYXJhdGlvbnM7IHRoZSBvbmx5IGNyZWF0b3JzIG9mIEZhciBvYmplY3RzXG4gKiBhcmUgZGlzdHJpYnV0ZWQgb2JqZWN0IGNyZWF0b3IgY29tcG9uZW50cyBsaWtlIHRoZSBgRmFyYCBvciBgUmVtb3RhYmxlYFxuICogZnVuY3Rpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBQcmltYXJ5IFRoZSB0eXBlIG9mIHRoZSBwcmltYXJ5IHJlZmVyZW5jZS5cbiAqIEB0ZW1wbGF0ZSBbTG9jYWw9RGF0YU9ubHk8UHJpbWFyeT5dIFRoZSBsb2NhbCBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QuXG4gKiBAdHlwZWRlZiB7RVJlZjxMb2NhbCAmIFJlbW90YWJsZUJyYW5kPExvY2FsLCBQcmltYXJ5Pj59IEZhclJlZlxuICovXG5cbi8qKlxuICogYERhdGFPbmx5PFQ+YCBtZWFucyB0byByZXR1cm4gYSByZWNvcmQgdHlwZSBgVDJgIGNvbnNpc3Rpbmcgb25seSBvZlxuICogcHJvcGVydGllcyB0aGF0IGFyZSAqbm90KiBmdW5jdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgdG8gYmUgZmlsdGVyZWQuXG4gKiBAdHlwZWRlZiB7T21pdDxULCBGaWx0ZXJlZEtleXM8VCwgQ2FsbGFibGU+Pn0gRGF0YU9ubHlcbiAqL1xuXG4vKipcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzEzOTR9XG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1Byb21pc2VMaWtlPFQ+IHwgVH0gRVJlZlxuICogRGVjbGFyZSB0aGF0IGBUYCBtYXkgb3IgbWF5IG5vdCBiZSBhIFByb21pc2UuICBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yXG4gKiBjb25zdW1lcnMgb2YgYXJndW1lbnRzIGFuZCBkZWNsYXJhdGlvbnM7IHJldHVybiB2YWx1ZXMgc2hvdWxkIHNwZWNpZmljYWxseSBiZVxuICogYFByb21pc2U8VD5gIG9yIGBUYCBpdHNlbGYuXG4gKi9cblxuLyoqXG4gKiBUaGUgYXdhaXRlZCByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uLlxuICogRm9yIHRoZSBldmVudHVhbCByZXN1bHQgb2YgYW4gRSBjYWxsLCBAc2VlIHtFUmVzdWx0fSBvciBAc2VlIHtFQ2FsbGFibGVSZXR1cm59XG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGluZmVyIFIgPyBBd2FpdGVkPFI+IDogbmV2ZXJ9IEVSZXR1cm5cbiAqL1xuXG4vKipcbiAqIEFuIGV2ZW50dWFsIHZhbHVlIHdoZXJlIHJlbW90YWJsZSBvYmplY3RzIGFyZSByZWN1cnNpdmVseSBtYXBwZWQgdG8gUmVtb3RlIHR5cGVzXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtBd2FpdGVkPFQ+fSBFUmVzdWx0XG4gKi9cblxuLyoqXG4gKiBFeHBlcmltZW50YWwgdHlwZSBtYXBwaW5nIHJlbW90YWJsZSBvYmplY3RzIHRvIFJlbW90ZSB0eXBlc1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICAwIGV4dGVuZHMgKDEgJiBUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBUIGlzIGFueVxuICogICAgID8gVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wYWdhdGUgdGhlIGFueSB0eXBlIHRocm91Z2ggdGhlIHJlc3VsdFxuICogICAgIDogVCBleHRlbmRzIFJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFA+ICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgUmVtb3RhYmxlXG4gKiAgICAgICA/IChQIHwgUmVtb3RhYmxlQnJhbmQ8TCwgUD4pICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcCBpdCB0byBpdHMgXCJtYXliZSByZW1vdGVcIiBmb3JtIChwcmltYXJ5IGJlaGF2aW9yIG9yIHJlbW90YWJsZSBwcmVzZW5jZSlcbiAqICAgICAgIDogVCBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+ICAgICAgICAgICAgICAgICAgICAgLy8gSWYgVCBpcyBhIHByb21pc2VcbiAqICAgICAgICAgPyBQcm9taXNlPEVBd2FpdGVkUmVzdWx0PEF3YWl0ZWQ8VD4+PiAgICAgICAgICAgICAgLy8gbWFwIGl0cyByZXNvbHV0aW9uXG4gKiAgICAgICAgIDogVCBleHRlbmRzIChudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHN5bWJvbCB8IGJpZ2ludCB8IENhbGxhYmxlKSAvLyBJbnRlcnNlY3Rpb25zIG9mIHRoZXNlIHR5cGVzIHdpdGggb2JqZWN0cyBhcmUgbm90IG1hcHBlZFxuICogICAgICAgICAgID8gVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmltaXRpdmVzIGFuZCBub24tcmVtb3RhYmxlIGZ1bmN0aW9ucyBhcmUgcGFzc2VkLXRocm91Z2hcbiAqICAgICAgICAgICA6IFQgZXh0ZW5kcyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAqICAgICAgICAgICAgID8geyBbUCBpbiBrZXlvZiBUXTogRUF3YWl0ZWRSZXN1bHQ8VFtQXT47IH0gICAgLy8gb3RoZXIgb2JqZWN0cyBhcmUgY29uc2lkZXJlZCBjb3B5IGRhdGEgYW5kIHByb3BlcnRpZXMgbWFwcGVkXG4gKiAgICAgICAgICAgICA6IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2UgYW55dGhpbmcgd2Fzbid0IGNvdmVyZWQsIGZhbGxiYWNrIHRvIHBhc3MtdGhyb3VnaFxuICogKX0gRUF3YWl0ZWRSZXN1bHRcbiAqL1xuXG4vKipcbiAqIFRoZSBAc2VlIHtFUmVzdWx0fSByZXR1cm4gdHlwZSBvZiBhIHJlbW90ZSBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICAwIGV4dGVuZHMgKDEgJiBUKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgVCBpcyBhbnlcbiAqICAgICA/IGFueSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSB0aGUgYW55IHR5cGUgdGhyb3VnaCB0aGUgcmVzdWx0XG4gKiAgICAgOiBUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBpbmZlciBSICAvLyBFbHNlIGluZmVyIHRoZSByZXR1cm4gdHlwZVxuICogICAgICAgPyBFUmVzdWx0PFI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhlIGZ1dHVyZSwgbWFwIHRoZSBldmVudHVhbCByZXN1bHRcbiAqICAgICAgIDogbmV2ZXJcbiAqICl9IEVDYWxsYWJsZVJldHVyblxuICovXG5cbi8qIFRPRE86IEZpZ3VyZSBvdXQgYSB3YXkgdG8gbWFwIGdlbmVyaWMgY2FsbGFibGUgcmV0dXJuIHR5cGVzLCBvciBhdCBsZWFzdCBiZXR0ZXIgZGV0ZWN0IHRoZW0uKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzYxODM4LiBXaXRob3V0IHRoYXQsIGBFKHN0YXJ0R292ZXJuZWRVcGdyYWRhYmxlKWAqL1xuLyogaW4gYWdvcmljLXNkayBkb2Vzbid0IHByb3BhZ2F0ZSB0aGUgc3RhcnQgZnVuY3Rpb24gdHlwZS4qL1xuLyoqXG4gKiBNYXBzIGEgY2FsbGFibGUgdG8gaXRzIHJlbW90ZWx5IGNhbGxlZCB0eXBlXG4gKlxuICogQHRlbXBsYXRlIHtDYWxsYWJsZX0gVFxuICogQHR5cGVkZWYgeyhcbiAqICAgIFJldHVyblR5cGU8VD4gZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPiAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGNhbGxhYmxlIHJldHVybnMgYSBwcm9taXNlXG4gKiAgICAgID8gVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCeXBhc3MgbWFwcGluZyB0byBtYWludGFpbiBhbnkgZ2VuZXJpY1xuICogICAgICA6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBQcm9taXNlPEVDYWxsYWJsZVJldHVybjxUPj4gLy8gTWFwIGl0IGFueXdheSB0byBlbnN1cmUgcHJvbWlzZSByZXR1cm4gdHlwZVxuICogKX0gRUNhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gRUNhbGxhYmxlPFRbUF0+XG4gKiAgICAgOiBuZXZlcjtcbiAqIH19IEVNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPlxuICogICAgID8gVFtQXVxuICogICAgIDogUHJvbWlzZTxBd2FpdGVkPFRbUF0+PjtcbiAqIH19IEVHZXR0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NhbGxhYmxlfSBUXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFByb21pc2U8dm9pZD59IEVTZW5kT25seUNhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gRVNlbmRPbmx5Q2FsbGFibGU8VFtQXT5cbiAqICAgICA6IG5ldmVyO1xuICogfX0gRVNlbmRPbmx5TWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gRVNlbmRPbmx5Q2FsbGFibGU8VD4gJiBFU2VuZE9ubHlNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogICAgIDogMCBleHRlbmRzICgxICYgVClcbiAqICAgICAgID8gbmV2ZXJcbiAqICAgICAgIDogRVNlbmRPbmx5TWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICl9IEVTZW5kT25seUNhbGxhYmxlT3JNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyBFQ2FsbGFibGU8VD4gJiBFTWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICAgICA6IDAgZXh0ZW5kcyAoMSAmIFQpXG4gKiAgICAgICA/IG5ldmVyXG4gKiAgICAgICA6IEVNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogKX0gRUNhbGxhYmxlT3JNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gYSB1bmlvbiBvZiBwcm9wZXJ0eSBuYW1lcy9zeW1ib2xzL251bWJlcnMgUCBmb3Igd2hpY2ggdGhlIHJlY29yZCBlbGVtZW50IFRbUF0ncyB0eXBlIGV4dGVuZHMgVS5cbiAqXG4gKiBHaXZlbiBjb25zdCB4ID0geyBhOiAxMjMsIGI6ICdoZWxsbycsIGM6IDQyLCA0OTogKCkgPT4ge30sIDUzOiA2NyB9LFxuICpcbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgbnVtYmVyPiBpcyB0aGUgdHlwZSAnYScgfCAnYycgfCA1My5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgc3RyaW5nPiBpcyB0aGUgdHlwZSAnYicuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIDQyIHwgNjc+IGlzIHRoZSB0eXBlICdjJyB8IDUzLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBib29sZWFuPiBpcyB0aGUgdHlwZSBuZXZlci5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFVcbiAqIEB0eXBlZGVmIHt7IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgVSA/IFAgOiBuZXZlcjsgfVtrZXlvZiBUXX0gRmlsdGVyZWRLZXlzXG4gKi9cblxuLyoqXG4gKiBgUGlja0NhbGxhYmxlPFQ+YCBtZWFucyB0byByZXR1cm4gYSBzaW5nbGUgcm9vdCBjYWxsYWJsZSBvciBhIHJlY29yZCB0eXBlXG4gKiBjb25zaXN0aW5nIG9ubHkgb2YgcHJvcGVydGllcyB0aGF0IGFyZSBmdW5jdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFJldHVyblR5cGU8VD4gICAgICAgICAgICAgICAgICAgICAvLyBhIHJvb3QgY2FsbGFibGUsIG5vIG1ldGhvZHNcbiAqICAgICA6IFBpY2s8VCwgRmlsdGVyZWRLZXlzPFQsIENhbGxhYmxlPj4gICAgICAgICAgLy8gYW55IGNhbGxhYmxlIG1ldGhvZHNcbiAqICl9IFBpY2tDYWxsYWJsZVxuICovXG5cbi8qKlxuICogYFJlbW90ZUZ1bmN0aW9uczxUPmAgbWVhbnMgdG8gcmV0dXJuIHRoZSBmdW5jdGlvbnMgYW5kIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVtb3RlbHkgY2FsbGFibGUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBSZW1vdGFibGVCcmFuZDxpbmZlciBMLCBpbmZlciBSPiAgIC8vIGlmIGEgZ2l2ZW4gVCBpcyBzb21lIHJlbW90ZSBpbnRlcmZhY2UgUlxuICogICAgID8gUGlja0NhbGxhYmxlPFI+ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHJldHVybiB0aGUgY2FsbGFibGUgcHJvcGVydGllcyBvZiBSXG4gKiAgICAgOiBUIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT4gICAgICAgICAgIC8vIG90aGVyd2lzZSwgaWYgVCBpcyBhIHByb21pc2VcbiAqICAgICAgID8gUmVtb3RlRnVuY3Rpb25zPFU+ICAgICAgICAgICAgICAgICAgICAgLy8gcmVjdXJzZSBvbiB0aGUgcmVzb2x2ZWQgdmFsdWUgb2YgVFxuICogICAgICAgOiBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHJldHVybiBUXG4gKiApfSBSZW1vdGVGdW5jdGlvbnNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj5cbiAqICAgICA/IExcbiAqICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPlxuICogICAgID8gTG9jYWxSZWNvcmQ8VT5cbiAqICAgICA6IFRcbiAqICl9IExvY2FsUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1IgPSB1bmtub3duXVxuICogQHR5cGVkZWYge3tcbiAqICAgcHJvbWlzZTogUHJvbWlzZTxSPjtcbiAqICAgc2V0dGxlcjogU2V0dGxlcjxSPjtcbiAqIH19IEVQcm9taXNlS2l0XG4gKi9cblxuLyoqXG4gKiBEZWNsYXJlIGEgbmVhciBvYmplY3QgdGhhdCBtdXN0IG9ubHkgYmUgaW52b2tlZCB3aXRoIEUsIGV2ZW4gbG9jYWxseS4gIEl0XG4gKiBzdXBwb3J0cyB0aGUgYFRgIGludGVyZmFjZSBidXQgYWRkaXRpb25hbGx5IHBlcm1pdHMgYFRgJ3MgbWV0aG9kcyB0byByZXR1cm5cbiAqIGBQcm9taXNlTGlrZWBzIGV2ZW4gaWYgYFRgIGRlY2xhcmVzIHRoZW0gYXMgb25seSBzeW5jaHJvbm91cy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gRVJlZjxBd2FpdGVkPEVPbmx5PFJldHVyblR5cGU8VD4+Pj5cbiAqICAgICA6IFQgZXh0ZW5kcyBSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlPlxuICogICAgID8ge1xuICogICAgICAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgICAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUW0tdPikgPT4gRVJlZjxBd2FpdGVkPEVPbmx5PFJldHVyblR5cGU8VFtLXT4+Pj5cbiAqICAgICAgICAgICA6IFRbS107XG4gKiAgICAgICB9XG4gKiAgICAgOiBUXG4gKiApfSBFT25seVxuICovJGjNj19vbmNlLmRlZmF1bHQoJGPNj19kZWZhdWx0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAc5UxUnIUAAByFAAAJwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9sb2NhbC5qc3siaW1wb3J0cyI6WyIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJnZXRNZXRob2ROYW1lcyIsImxvY2FsQXBwbHlGdW5jdGlvbiIsImxvY2FsQXBwbHlNZXRob2QiLCJsb2NhbEdldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcjskaM2PX2ltcG9ydHMoW1tcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsWyRozY9fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSwgRmFpbCB9ID0gYXNzZXJ0O1xuXG5jb25zdCB7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGdldFByb3RvdHlwZU9mLCBmcmVlemUgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHksIG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbmNvbnN0IG50eXBlb2YgPSBzcGVjaW1lbiA9PiAoc3BlY2ltZW4gPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2Ygc3BlY2ltZW4pO1xuXG5jb25zdCBvbkRlbGl2ZXJ5ID0gbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX0RFTElWRVJZX0JSRUFLUE9JTlRTJyk7XG5cbi8qKlxuICogVE9ETyBDb25zb2xpZGF0ZSB3aXRoIGBpc1ByaW1pdGl2ZWAgdGhhdCdzIGN1cnJlbnRseSBpbiBgQGVuZG8vcGFzcy1zdHlsZWAuXG4gKiBMYXllcmluZyBjb25zdHJhaW50cyBtYWtlIHRoaXMgdHJpY2t5LCB3aGljaCBpcyB3aHkgd2UgaGF2ZW4ndCB5ZXQgZmlndXJlZFxuICogb3V0IGhvdyB0byBkbyB0aGlzLlxuICpcbiAqIEB0eXBlIHsodmFsOiB1bmtub3duKSA9PiB2YWwgaXMgKHVuZGVmaW5lZFxuICogfCBudWxsXG4gKiB8IGJvb2xlYW5cbiAqIHwgbnVtYmVyXG4gKiB8IGJpZ2ludFxuICogfCBzdHJpbmdcbiAqIHwgc3ltYm9sKX1cbiAqL1xuY29uc3QgaXNQcmltaXRpdmUgPSB2YWwgPT5cbiAgIXZhbCB8fCAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJyk7XG5cbi8qKlxuICogUHJpb3JpdGl6ZSBzeW1ib2xzIGFzIGVhcmxpZXIgdGhhbiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYVxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkID0gKGEsIGIpID0+IHtcbiAgaWYgKHR5cGVvZiBhID09PSB0eXBlb2YgYikge1xuICAgIGNvbnN0IGxlZnQgPSBTdHJpbmcoYSk7XG4gICAgY29uc3QgcmlnaHQgPSBTdHJpbmcoYik7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbiAgICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbiAgfVxuICBpZiAodHlwZW9mIGEgPT09ICdzeW1ib2wnKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiID09PSAnc3RyaW5nJyk7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGFzc2VydCh0eXBlb2YgYSA9PT0gJ3N0cmluZycpO1xuICBhc3NlcnQodHlwZW9mIGIgPT09ICdzeW1ib2wnKTtcbiAgcmV0dXJuIDE7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHsoc3RyaW5nfHN5bWJvbClbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldE1ldGhvZE5hbWVzID0gdmFsID0+IHtcbiAgbGV0IGxheWVyID0gdmFsO1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKTsgLyogU2V0IHRvIGRlZHVwbGljYXRlKi9cbiAgd2hpbGUgKGxheWVyICE9PSBudWxsICYmIGxheWVyICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgLyogYmUgdG9sZXJhbnQgb2Ygbm9uLW9iamVjdHMqL1xuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG93bktleXMoZGVzY3MpKSB7XG4gICAgICAvKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4gICAgICAvKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuICAgICAgaWYgKHR5cGVvZiB2YWxbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNQcmltaXRpdmUodmFsKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxheWVyID0gZ2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuICB9XG4gIHJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xufTtcbi8qIFRoZSB0b3AgbGV2ZWwgb2YgdGhlIGV2ZW50dWFsIHNlbmQgbW9kdWxlcyBjYW4gYmUgZXZhbHVhdGVkIGJlZm9yZSovXG4vKiBzZXMgY3JlYXRlcyBgaGFyZGVuYCwgYW5kIHNvIGNhbm5vdCByZWx5IG9uIGBoYXJkZW5gIGF0IHRvcCBsZXZlbC4qLyRozY9fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7XG5mcmVlemUoZ2V0TWV0aG9kTmFtZXMpO1xuXG4gICAgICAgY29uc3QgbG9jYWxBcHBseUZ1bmN0aW9uID0gKHJlY2lwaWVudCwgYXJncykgPT4ge1xuICB0eXBlb2YgcmVjaXBpZW50ID09PSAnZnVuY3Rpb24nIHx8XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYENhbm5vdCBpbnZva2UgdGFyZ2V0IGFzIGEgZnVuY3Rpb247IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxuICAgICAgICBudHlwZW9mKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgaWYgKG9uRGVsaXZlcnkgJiYgb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgZGVidWdnZXI7IC8qIFNURVAgSU5UTyBBUFBMWSovXG4gICAgLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gdGhpcyBkZWxpdmVyeSBvZiBhbiBldmVudHVhbCBmdW5jdGlvbiBjYWxsKi9cbiAgICAvKiBzbyB0aGF0IHlvdSBjYW4gc3RlcCAqaW50byogdGhlIGZvbGxvd2luZyBgYXBwbHlgIGluIG9yZGVyIHRvIHNlZSB0aGUqL1xuICAgIC8qIGZ1bmN0aW9uIGNhbGwgYXMgaXQgaGFwcGVucy4gT3Igc3RlcCAqb3ZlciogdG8gc2VlIHdoYXQgaGFwcGVucyovXG4gICAgLyogYWZ0ZXIgdGhlIGZ1bmN0aW9uIGNhbGwgcmV0dXJucy4qL1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGFwcGx5KHJlY2lwaWVudCwgdW5kZWZpbmVkLCBhcmdzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmxvY2FsQXBwbHlGdW5jdGlvbihsb2NhbEFwcGx5RnVuY3Rpb24pO1xuXG4gICAgICAgY29uc3QgbG9jYWxBcHBseU1ldGhvZCA9IChyZWNpcGllbnQsIG1ldGhvZE5hbWUsIGFyZ3MpID0+IHtcbiAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fCBtZXRob2ROYW1lID09PSBudWxsKSB7XG4gICAgLyogQmFzZSBjYXNlOyBib3R0b20gb3V0IHRvIGFwcGx5IGZ1bmN0aW9ucy4qL1xuICAgIHJldHVybiBsb2NhbEFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LCBhcmdzKTtcbiAgfVxuICBpZiAocmVjaXBpZW50ID09PSB1bmRlZmluZWQgfHwgcmVjaXBpZW50ID09PSBudWxsKSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYENhbm5vdCBkZWxpdmVyICR7cShtZXRob2ROYW1lKX0gdG8gdGFyZ2V0OyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZm4gPSByZWNpcGllbnRbbWV0aG9kTmFtZV07XG4gIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYHRhcmdldCBoYXMgbm8gbWV0aG9kICR7cShtZXRob2ROYW1lKX0sIGhhcyAke3EoXG4gICAgICAgIGdldE1ldGhvZE5hbWVzKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmdHlwZSA9IG50eXBlb2YoZm4pO1xuICB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgfHxcbiAgICBGYWlsYGludm9rZWQgbWV0aG9kICR7cShtZXRob2ROYW1lKX0gaXMgbm90IGEgZnVuY3Rpb247IGl0IGlzIGEgJHtxKFxuICAgICAgZnR5cGUsXG4gICAgKX1gO1xuICBpZiAob25EZWxpdmVyeSAmJiBvbkRlbGl2ZXJ5LnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCBtZXRob2ROYW1lKSkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgZGVidWdnZXI7IC8qIFNURVAgSU5UTyBBUFBMWSovXG4gICAgLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gdGhpcyBkZWxpdmVyeSBvZiBhbiBldmVudHVhbCBtZXRob2QgY2FsbCovXG4gICAgLyogc28gdGhhdCB5b3UgY2FuIHN0ZXAgKmludG8qIHRoZSBmb2xsb3dpbmcgYGFwcGx5YCBpbiBvcmRlciB0byBzZWUgdGhlKi9cbiAgICAvKiBtZXRob2QgY2FsbCBhcyBpdCBoYXBwZW5zLiBPciBzdGVwICpvdmVyKiB0byBzZWUgd2hhdCBoYXBwZW5zKi9cbiAgICAvKiBhZnRlciB0aGUgbWV0aG9kIGNhbGwgcmV0dXJucy4qL1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGFwcGx5KGZuLCByZWNpcGllbnQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseU1ldGhvZChsb2NhbEFwcGx5TWV0aG9kKTtcblxuICAgICAgIGNvbnN0IGxvY2FsR2V0ID0gKHQsIGtleSkgPT4gdFtrZXldOyRozY9fb25jZS5sb2NhbEdldChsb2NhbEdldCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJsb2NhbEFwcGx5RnVuY3Rpb24iOlsibG9jYWxBcHBseUZ1bmN0aW9uIl0sImxvY2FsQXBwbHlNZXRob2QiOlsibG9jYWxBcHBseU1ldGhvZCJdLCJsb2NhbEdldCI6WyJsb2NhbEdldCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACHeIi59BgAAPQYAAA1AAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiXSwiZXhwb3J0cyI6WyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBxdW90ZTogcSwgRmFpbCB9ID0gYXNzZXJ0O1xuXG5jb25zdCB7IGhhc093biwgZnJlZXplLCBlbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZyB8ICcqJ30gTWF0Y2hTdHJpbmdUYWdcbiAqICAgQSBzdGFyIGAnKidgIG1hdGNoZXMgYW55IHJlY2lwaWVudC4gT3RoZXJ3aXNlLCB0aGUgc3RyaW5nIGlzXG4gKiAgIG1hdGNoZWQgYWdhaW5zdCB0aGUgdmFsdWUgb2YgYSByZWNpcGllbnQncyBgQEB0b1N0cmluZ1RhZ2BcbiAqICAgYWZ0ZXIgc3RyaXBwaW5nIG91dCBhbnkgbGVhZGluZyBgJ0FsbGVnZWQ6ICdgIG9yIGAnRGVidWdOYW1lOiAnYFxuICogICBwcmVmaXguIEZvciBvYmplY3RzIGRlZmluZWQgd2l0aCBgRmFyYCB0aGlzIGlzIHRoZSBmaXJzdCBhcmd1bWVudCxcbiAqICAga25vd24gYXMgdGhlIGBmYXJOYW1lYC4gRm9yIGV4b3MsIHRoaXMgaXMgdGhlIHRhZy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgJyonfSBNYXRjaE1ldGhvZE5hbWVcbiAqICAgQSBzdGFyIGAnKidgIG1hdGNoZXMgYW55IG1ldGhvZCBuYW1lLiBPdGhlcndpc2UsIHRoZSBzdHJpbmcgaXNcbiAqICAgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBtZXRob2QgbmFtZS4gQ3VycmVudGx5LCB0aGlzIGlzIG9ubHkgYW4gZXhhY3QgbWF0Y2guXG4gKiAgIEhvd2V2ZXIsIGJld2FyZSB0aGF0IHdlIG1heSBpbnRyb2R1Y2UgYSBzdHJpbmcgc3ludGF4IGZvclxuICogICBzeW1ib2wgbWV0aG9kIG5hbWVzLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtudW1iZXIgfCAnKid9IE1hdGNoQ291bnRkb3duXG4gKiAgIEEgc3RhciBgJyonYCB3aWxsIGFsd2F5cyBicmVha3BvaW50LiBPdGhlcndpc2UsIHRoZSBzdHJpbmdcbiAqICAgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLiBPbmNlIHRoYXQgaXMgemVybywgYWx3YXlzIGJyZWFrcG9pbnQuXG4gKiAgIE90aGVyd2lzZSBkZWNyZW1lbnQgYnkgb25lIGVhY2ggdGltZSBpdCBtYXRjaGVzIHVudGlsIGl0IHJlYWNoZXMgemVyby5cbiAqICAgSW4gb3RoZXIgd29yZHMsIHRoZSBjb3VudGRvd24gcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mXG4gKiAgIGJyZWFrcG9pbnQgb2NjdXJyZW5jZXMgdG8gc2tpcCBiZWZvcmUgYWN0dWFsbHkgYnJlYWtwb2ludGluZy5cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGV4dGVybmFsIEpTT04gcmVwcmVzZW50YXRpb24sIGluIHdoaWNoXG4gKiAtIHRoZSBvdXRlciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBjbGFzcy1saWtlIHRhZyBvciAnKicsXG4gKiAtIHRoZSBpbm5lciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBtZXRob2QgbmFtZSBvciAnKicsXG4gKiAtIHRoZSB2YWx1ZSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGNvdW50ZG93biBvciAnKicuXG4gKlxuICogQHR5cGVkZWYge1JlY29yZDxNYXRjaFN0cmluZ1RhZywgUmVjb3JkPE1hdGNoTWV0aG9kTmFtZSwgTWF0Y2hDb3VudGRvd24+Pn0gTWVzc2FnZUJyZWFrcG9pbnRzXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBpbnRlcm5hbCBKU09OIHJlcHJlc2VudGF0aW9uLCBpbiB3aGljaFxuICogLSB0aGUgb3V0ZXIgcHJvcGVydHkgbmFtZSBpcyB0aGUgbWV0aG9kIG5hbWUgb3IgJyonLFxuICogLSB0aGUgaW5uZXIgcHJvcGVydHkgbmFtZSBpcyB0aGUgY2xhc3MtbGlrZSB0YWcgb3IgJyonLFxuICogLSB0aGUgdmFsdWUgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciBjb3VudGRvd24gb3IgJyonLlxuICpcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8TWF0Y2hNZXRob2ROYW1lLCBSZWNvcmQ8TWF0Y2hTdHJpbmdUYWcsIE1hdGNoQ291bnRkb3duPj59IEJyZWFrcG9pbnRUYWJsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWVzc2FnZUJyZWFrcG9pbnRzfSBnZXRCcmVha3BvaW50c1xuICogQHByb3BlcnR5IHsobmV3QnJlYWtwb2ludHM/OiBNZXNzYWdlQnJlYWtwb2ludHMpID0+IHZvaWR9IHNldEJyZWFrcG9pbnRzXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVjaXBpZW50OiBvYmplY3QsXG4gKiAgIG1ldGhvZE5hbWU6IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZFxuICogKSA9PiBib29sZWFufSBzaG91bGRCcmVha3BvaW50XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7dmFsIGlzIFJlY29yZDxzdHJpbmcsIGFueT59XG4gKi9cbmNvbnN0IGlzSlNPTlJlY29yZCA9IHZhbCA9PlxuICB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcblxuLyoqXG4gKiBSZXR1cm4gYHRhZ2AgYWZ0ZXIgc3RyaXBwaW5nIG9mZiBhbnkgYCdBbGxlZ2VkOiAnYCBvciBgJ0RlYnVnTmFtZTogJ2BcbiAqIHByZWZpeCBpZiBwcmVzZW50LlxuICogYGBganNcbiAqIHNpbXBsaWZ5VGFnKCdBbGxlZ2VkOiBtb29sYSBpc3N1ZXInKSA9PT0gJ21vb2xhIGlzc3VlcidcbiAqIGBgYFxuICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIHN1Y2ggcHJlZml4ZXMsIG9ubHkgdGhlIG91dGVyIG9uZSBpcyByZW1vdmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHNpbXBsaWZ5VGFnID0gdGFnID0+IHtcbiAgZm9yIChjb25zdCBwcmVmaXggb2YgWydBbGxlZ2VkOiAnLCAnRGVidWdOYW1lOiAnXSkge1xuICAgIGlmICh0YWcuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICByZXR1cm4gdGFnLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFnO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICogQHJldHVybnMge01lc3NhZ2VCcmVha3BvaW50VGVzdGVyIHwgdW5kZWZpbmVkfVxuICovXG4gICAgICAgY29uc3QgbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gb3B0aW9uTmFtZSA9PiB7XG4gIGxldCBicmVha3BvaW50cyA9IEpTT04ucGFyc2UoZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwgJ251bGwnKSk7XG5cbiAgaWYgKGJyZWFrcG9pbnRzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBAdHlwZSB7QnJlYWtwb2ludFRhYmxlfSAqL1xuICBsZXQgYnJlYWtwb2ludHNUYWJsZTtcblxuICBjb25zdCBnZXRCcmVha3BvaW50cyA9ICgpID0+IGJyZWFrcG9pbnRzO1xuICBmcmVlemUoZ2V0QnJlYWtwb2ludHMpO1xuXG4gIGNvbnN0IHNldEJyZWFrcG9pbnRzID0gKG5ld0JyZWFrcG9pbnRzID0gYnJlYWtwb2ludHMpID0+IHtcbiAgICBpc0pTT05SZWNvcmQobmV3QnJlYWtwb2ludHMpIHx8XG4gICAgICBGYWlsYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uIHRvIGJlIGEgSlNPTiBicmVha3BvaW50cyByZWNvcmRgO1xuXG4gICAgLyoqIEB0eXBlIHtCcmVha3BvaW50VGFibGV9ICovXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjb25mdXNlZCBieSBfX3Byb3RvX18qL1xuICAgIGNvbnN0IG5ld0JyZWFrcG9pbnRzVGFibGUgPSB7IF9fcHJvdG9fXzogbnVsbCB9O1xuXG4gICAgZm9yIChjb25zdCBbdGFnLCBtZXRob2RCUHNdIG9mIGVudHJpZXMobmV3QnJlYWtwb2ludHMpKSB7XG4gICAgICB0YWcgPT09IHNpbXBsaWZ5VGFnKHRhZykgfHxcbiAgICAgICAgRmFpbGBKdXN0IHVzZSBzaW1wbGUgdGFnICR7cShzaW1wbGlmeVRhZyh0YWcpKX0gcmF0aGVyIHRoYW4gJHtxKHRhZyl9YDtcbiAgICAgIGlzSlNPTlJlY29yZChtZXRob2RCUHMpIHx8XG4gICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EoXG4gICAgICAgICAgdGFnLFxuICAgICAgICApfSB0byBiZSBhIEpTT04gbWV0aG9kcyBicmVha3BvaW50cyByZWNvcmRgO1xuICAgICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgY291bnRdIG9mIGVudHJpZXMobWV0aG9kQlBzKSkge1xuICAgICAgICBjb3VudCA9PT0gJyonIHx8XG4gICAgICAgICAgKHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKGNvdW50KSAmJlxuICAgICAgICAgICAgY291bnQgPj0gMCkgfHxcbiAgICAgICAgICBGYWlsYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uJ3MgJHtxKHRhZyl9LiR7cShcbiAgICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgKX0gdG8gYmUgXCIqXCIgb3IgYSBub24tbmVnYXRpdmUgaW50ZWdlcmA7XG5cbiAgICAgICAgY29uc3QgY2xhc3NCUHMgPSBoYXNPd24obmV3QnJlYWtwb2ludHNUYWJsZSwgbWV0aG9kTmFtZSlcbiAgICAgICAgICA/IG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV1cbiAgICAgICAgICA6IChuZXdCcmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdID0ge1xuICAgICAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNvbmZ1c2VkIGJ5IF9fcHJvdG9fXyovXG4gICAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjbGFzc0JQc1t0YWddID0gY291bnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGJyZWFrcG9pbnRzID0gbmV3QnJlYWtwb2ludHM7XG4gICAgYnJlYWtwb2ludHNUYWJsZSA9IG5ld0JyZWFrcG9pbnRzVGFibGU7XG4gIH07XG4gIGZyZWV6ZShzZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2hvdWxkQnJlYWtwb2ludCA9IChyZWNpcGllbnQsIG1ldGhvZE5hbWUpID0+IHtcbiAgICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGhvZE5hbWUgPT09IG51bGwpIHtcbiAgICAgIC8qIFRPRE8gZW5hYmxlIGZ1bmN0aW9uIGJyZWFrcG9pbnRpbmcqL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc0JQcyA9IGJyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gfHwgYnJlYWtwb2ludHNUYWJsZVsnKiddO1xuICAgIGlmIChjbGFzc0JQcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCB0YWcgPSBzaW1wbGlmeVRhZyhyZWNpcGllbnRbU3ltYm9sLnRvU3RyaW5nVGFnXSk7XG4gICAgbGV0IGNvdW50ID0gY2xhc3NCUHNbdGFnXTtcbiAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFnID0gJyonO1xuICAgICAgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY291bnQgPT09ICcqJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGFzc2VydCh0eXBlb2YgY291bnQgPT09ICdudW1iZXInICYmIGNvdW50ID49IDEpO1xuICAgIGNsYXNzQlBzW3RhZ10gPSBjb3VudCAtIDE7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICBmcmVlemUoc2hvdWxkQnJlYWtwb2ludCk7XG5cbiAgY29uc3QgYnJlYWtwb2ludFRlc3RlciA9IGZyZWV6ZSh7XG4gICAgZ2V0QnJlYWtwb2ludHMsXG4gICAgc2V0QnJlYWtwb2ludHMsXG4gICAgc2hvdWxkQnJlYWtwb2ludCxcbiAgfSk7XG4gIGJyZWFrcG9pbnRUZXN0ZXIuc2V0QnJlYWtwb2ludHMoKTtcbiAgcmV0dXJuIGJyZWFrcG9pbnRUZXN0ZXI7XG59OyRozY9fb25jZS5tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbmZyZWV6ZShtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAApE1XZ1gUAANYFAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlRTskaM2PX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKG1ha2VFID0gJGjNj19hKV1dXV0sW1wiLi9leHBvcnRzLmpzXCIsIFtdXV0pO1xuXG4vKiBYWFggbW9kdWxlIGV4cG9ydHMgZm9yIEhhbmRsZWRQcm9taXNlIGZhaWwgaWYgdGhlc2UgYXJlbid0IGluIHNjb3BlKi9cbi8qKiBAaW1wb3J0IHtIYW5kbGVyLCBIYW5kbGVkRXhlY3V0b3J9IGZyb20gJy4vaGFuZGxlZC1wcm9taXNlLmpzJyAqL1xuLyoqIEBpbXBvcnQge0VDYWxsYWJsZU9yTWV0aG9kcywgRUdldHRlcnMsIEVSZWYsIEVSZW1vdGVGdW5jdGlvbnMsIEVTZW5kT25seUNhbGxhYmxlT3JNZXRob2RzLCBMb2NhbFJlY29yZCwgUmVtb3RlRnVuY3Rpb25zfSBmcm9tICcuL0UuanMnICovXG5cbmNvbnN0IGhwID0gSGFuZGxlZFByb21pc2U7XG5cbi8qKlxuICogRSh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBjYWxsIGFyYml0cmFyeSBtZXRob2RzLiBFYWNoIG9mIHRoZXNlIG1ldGhvZCBjYWxscyByZXR1cm5zIGEgcHJvbWlzZS5cbiAqIFRoZSBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIG9uIHdoYXRldmVyICd4JyBkZXNpZ25hdGVzIChvciByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEUuZ2V0KHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGdldCBhcmJpdHJhcnkgcHJvcGVydGllcy4gRWFjaCBvZiB0aGVzZSBwcm9wZXJ0aWVzIHJldHVybnMgYVxuICogcHJvbWlzZSBmb3IgdGhlIHByb3BlcnR5LiAgVGhlIHByb21pc2UgdmFsdWUgd2lsbCBiZSB0aGUgcHJvcGVydHkgZmV0Y2hlZCBmcm9tIHdoYXRldmVyICd4JyBkZXNpZ25hdGVzIChvclxuICogcmVzb2x2ZXMgdG8pIGluIGEgZnV0dXJlIHR1cm4sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBFLndoZW4oeCwgcmVzLCByZWopIGlzIGVxdWl2YWxlbnQgdG8gSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKHJlcywgcmVqKVxuICovJGjNj19vbmNlLmhwKGhwKTtcbiAgICAgICBjb25zdCBFID0gbWFrZUUoaHApOyRozY9fb25jZS5FKEUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiSGFuZGxlZFByb21pc2UiOlsiaHAiXSwiRSI6WyJFIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADMopI5XEgAAVxIAAC0AAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiXSwiZXhwb3J0cyI6WyJ0cmFja1R1cm5zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb24sZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dLFtcImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXNcIixbJGjNj19hID0+IChlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKiBOT1RFOiBXZSBjYW4ndCBpbXBvcnQgdGhlc2UgYmVjYXVzZSB0aGV5J3JlIG5vdCBpbiBzY29wZSBiZWZvcmUgbG9ja2Rvd24uKi9cbi8qIFdlIGFsc28gY2Fubm90IGN1cnJlbnRseSBpbXBvcnQgdGhlbSBiZWNhdXNlIGl0IHdvdWxkIGNyZWF0ZSBhIGN5Y2xpYyovXG4vKiBkZXBlbmRlbmN5LCB0aG91Z2ggdGhpcyBpcyBtb3JlIGVhc2lseSBmaXhlZC4qL1xuLyogaW1wb3J0IHsgYXNzZXJ0LCBYLCBGYWlsIH0gZnJvbSAnQGVuZG8vZXJyb3JzJzsqL1xuLyogU2VlIGFsc28gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85NTE1Ki9cblxuLyogV0FSTklORzogR2xvYmFsIE11dGFibGUgU3RhdGUhKi9cbi8qIFRoaXMgc3RhdGUgaXMgY29tbXVuaWNhdGVkIHRvIGBhc3NlcnRgIHRoYXQgbWFrZXMgaXQgYXZhaWxhYmxlIHRvIHRoZSovXG4vKiBjYXVzYWwgY29uc29sZSwgd2hpY2ggYWZmZWN0cyB0aGUgY29uc29sZSBsb2cgb3V0cHV0LiBOb3JtYWxseSB3ZSovXG4vKiByZWdhcmQgdGhlIGFiaWxpdHkgdG8gc2VlIGNvbnNvbGUgbG9nIG91dHB1dCBhcyBhIG1ldGEtbGV2ZWwgcHJpdmlsZWdlKi9cbi8qIGFuYWxvZ291cyB0byB0aGUgYWJpbGl0eSB0byBkZWJ1Zy4gQXNpZGUgZnJvbSB0aGF0LCB0aGlzIG1vZHVsZSBzaG91bGQqL1xuLyogbm90IGhhdmUgYW55IG9ic2VydmFibHkgbXV0YWJsZSBzdGF0ZS4qL1xuXG5sZXQgaGlkZGVuUHJpb3JFcnJvcjtcbmxldCBoaWRkZW5DdXJyZW50VHVybiA9IDA7XG5sZXQgaGlkZGVuQ3VycmVudEV2ZW50ID0gMDtcblxuLyogVHVybiBvbiBpZiB5b3Ugc2VlbSB0byBiZSBsb3NpbmcgZXJyb3IgbG9nZ2luZyBhdCB0aGUgdG9wIG9mIHRoZSBldmVudCBsb29wKi9cbmNvbnN0IFZFUkJPU0UgPSBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKCdERUJVRycsICd0cmFjay10dXJucycpO1xuXG4vKiBUcmFjay10dXJucyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGFuZCBjYW4gYmUgZW5hYmxlZCBieSBhbiBlbnZpcm9ubWVudCovXG4vKiBvcHRpb24uKi9cbmNvbnN0IEVOQUJMRUQgPVxuICAvKiogQHR5cGUgeydkaXNhYmxlZCcgfCAnZW5hYmxlZCd9ICovXG4gIChnZXRFbnZpcm9ubWVudE9wdGlvbignVFJBQ0tfVFVSTlMnLCAnZGlzYWJsZWQnLCBbJ2VuYWJsZWQnXSkpID09PSAnZW5hYmxlZCc7XG5cbi8qIFdlIGhvaXN0IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG91dCBvZiB0cmFja1R1cm5zKCkgdG8gZGlzY291cmFnZSB0aGUqL1xuLyogY2xvc3VyZXMgZnJvbSBob2xkaW5nIG9udG8gJ2FyZ3MnIG9yICdmdW5jJyBsb25nZXIgdGhhbiBuZWNlc3NhcnksKi9cbi8qIHdoaWNoIHdlJ3ZlIHNlZW4gY2F1c2UgSGFuZGxlZFByb21pc2UgYXJndW1lbnRzIHRvIGJlIHJldGFpbmVkIGZvciovXG4vKiBhIHN1cnByaXNpbmdseSBsb25nIHRpbWUuKi9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZSA9IGRldGFpbHNOb3RlID0+IHJlYXNvbiA9PiB7XG4gIGlmIChyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGdsb2JhbFRoaXMuYXNzZXJ0Lm5vdGUocmVhc29uLCBkZXRhaWxzTm90ZSk7XG4gIH1cbiAgaWYgKFZFUkJPU0UpIHtcbiAgICBjb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLCByZWFzb24pO1xuICB9XG59O1xuXG5jb25zdCB3cmFwRnVuY3Rpb24gPVxuICAoZnVuYywgc2VuZGluZ0Vycm9yLCBYKSA9PlxuICAoLi4uYXJncykgPT4ge1xuICAgIGhpZGRlblByaW9yRXJyb3IgPSBzZW5kaW5nRXJyb3I7XG4gICAgaGlkZGVuQ3VycmVudFR1cm4gKz0gMTtcbiAgICBoaWRkZW5DdXJyZW50RXZlbnQgPSAwO1xuICAgIHRyeSB7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZnVuYyguLi5hcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgWGBUaHJvd24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFZFUkJPU0UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICAvKiBNdXN0IGNhcHR1cmUgdGhpcyBub3csIG5vdCB3aGVuIHRoZSBjYXRjaCB0cmlnZ2Vycy4qL1xuICAgICAgY29uc3QgZGV0YWlsc05vdGUgPSBYYFJlamVjdGlvbiBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWA7XG4gICAgICBQcm9taXNlLnJlc29sdmUocmVzdWx0KS5jYXRjaChhZGRSZWplY3Rpb25Ob3RlKGRldGFpbHNOb3RlKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBoaWRkZW5QcmlvckVycm9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHRlbXBsYXRlIHtUdXJuU3RhcnRlckZuW119IFRcbiAqIEBwYXJhbSB7VH0gZnVuY3NcbiAqIEByZXR1cm5zIHtUfVxuICovXG4gICAgICAgY29uc3QgdHJhY2tUdXJucyA9IGZ1bmNzID0+IHtcbiAgaWYgKCFFTkFCTEVEIHx8IHR5cGVvZiBnbG9iYWxUaGlzID09PSAndW5kZWZpbmVkJyB8fCAhZ2xvYmFsVGhpcy5hc3NlcnQpIHtcbiAgICByZXR1cm4gZnVuY3M7XG4gIH1cbiAgY29uc3QgeyBkZXRhaWxzOiBYLCBub3RlOiBhbm5vdGF0ZUVycm9yIH0gPSBnbG9iYWxUaGlzLmFzc2VydDtcblxuICBoaWRkZW5DdXJyZW50RXZlbnQgKz0gMTtcbiAgY29uc3Qgc2VuZGluZ0Vycm9yID0gRXJyb3IoXG4gICAgYEV2ZW50OiAke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gLFxuICApO1xuICBpZiAoaGlkZGVuUHJpb3JFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYW5ub3RhdGVFcnJvcihzZW5kaW5nRXJyb3IsIFhgQ2F1c2VkIGJ5OiAke2hpZGRlblByaW9yRXJyb3J9YCk7XG4gIH1cblxuICByZXR1cm4gLyoqIEB0eXBlIHtUfSAqLyAoXG4gICAgZnVuY3MubWFwKGZ1bmMgPT4gZnVuYyAmJiB3cmFwRnVuY3Rpb24oZnVuYywgc2VuZGluZ0Vycm9yLCBYKSlcbiAgKTtcbn07XG5cbi8qKlxuICogQW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBpcyBub3QgdGhpcy1zZW5zaXRpdmUsIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBhdFxuICogYm90dG9tIG9mIHN0YWNrIHRvIHN0YXJ0IGEgbmV3IHR1cm4uXG4gKlxuICogQHR5cGVkZWYgeygoLi4uYXJnczogYW55W10pID0+IGFueSkgfCB1bmRlZmluZWR9IFR1cm5TdGFydGVyRm5cbiAqLyRozY9fb25jZS50cmFja1R1cm5zKHRyYWNrVHVybnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHuhoEdkAgAAZAIAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC91dGlscy5qc3siaW1wb3J0cyI6WyIuL3NyYy9sb2NhbC5qcyIsIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2xvY2FsLmpzXCIsIFtdXSxbXCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvbG9jYWwuanMiOltbImdldE1ldGhvZE5hbWVzIiwiZ2V0TWV0aG9kTmFtZXMiXV0sIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiOltbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciIsIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3EXZo2ACAABgAgAAGgAAAEBlbmRvL2V4by12MS41LjEyL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2V4by1tYWtlcnMuanMiLCIuL3NyYy90eXBlcy5qcyIsIi4vc3JjL2dldC1pbnRlcmZhY2UuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZXhvLW1ha2Vycy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2V4by1tYWtlcnMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyI6W1siR0VUX0lOVEVSRkFDRV9HVUFSRCIsIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALGTEP8QIAAAECAAACMAAABAZW5kby9leG8tdjEuNS4xMi9zcmMvZXhvLW1ha2Vycy5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIiwiLi9leG8tdG9vbHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzS2l0IiwiaW5pdEVtcHR5IiwibWFrZUV4byJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG9iamVjdE1hcCxlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLEZhaWwscSxkZWZlbmRQcm90b3R5cGUsZGVmZW5kUHJvdG90eXBlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsWyRozY9fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL2V4by10b29scy5qc1wiLCBbW1wiZGVmZW5kUHJvdG90eXBlXCIsWyRozY9fYSA9PiAoZGVmZW5kUHJvdG90eXBlID0gJGjNj19hKV1dLFtcImRlZmVuZFByb3RvdHlwZUtpdFwiLFskaM2PX2EgPT4gKGRlZmVuZFByb3RvdHlwZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtBbXBsaWZ5LCBFeG9DbGFzc0tpdE1ldGhvZHMsIEV4b0NsYXNzTWV0aG9kcywgRmFyQ2xhc3NPcHRpb25zLCBHdWFyZGVkLCBHdWFyZGVkS2l0LCBFeG9DbGFzc0ludGVyZmFjZUd1YXJkS2l0LCBJc0luc3RhbmNlLCBLaXRDb250ZXh0LCBFeG9DbGFzc0ludGVyZmFjZUd1YXJkLCBNZXRob2RzLCBGYWNldE5hbWV9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHsgY3JlYXRlLCBzZWFsLCBmcmVlemUsIGRlZmluZVByb3BlcnR5LCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLyogVHVybiBvbiB0byBnaXZlIGVhY2ggZXhvIGluc3RhbmNlIGl0cyBvd24gdG9TdHJpbmdUYWcgdmFsdWUuKi9cbmNvbnN0IExBQkVMX0lOU1RBTkNFUyA9IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywgJ2xhYmVsLWluc3RhbmNlcycpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEBwYXJhbSB7VH0gcHJvdG9cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUNvdW50XG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgbWFrZVNlbGYgPSAocHJvdG8sIGluc3RhbmNlQ291bnQpID0+IHtcbiAgY29uc3Qgc2VsZiA9IGNyZWF0ZShwcm90byk7XG4gIGlmIChMQUJFTF9JTlNUQU5DRVMpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShzZWxmLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcbiAgICAgIHZhbHVlOiBgJHtwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddfSMke2luc3RhbmNlQ291bnR9YCxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKHNlbGYpO1xufTtcblxuY29uc3QgZW1wdHlSZWNvcmQgPSBoYXJkZW4oe30pO1xuXG4vKipcbiAqIFdoZW4gY2FsbGluZyBgZGVmaW5lRHVyYWJsZUtpbmRgIGFuZFxuICogaXRzIHNpYmxpbmdzLCB1c2VkIGFzIHRoZSBgaW5pdGAgZnVuY3Rpb24gYXJndW1lbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGVcbiAqIHN0YXRlIHJlY29yZCBvZiB0aGUgKHZpcnR1YWwvZHVyYWJsZSkgaW5zdGFuY2VzIG9mIHRoZSBraW5kL2V4b0NsYXNzXG4gKiBzaG91bGQgYmUgZW1wdHksIGFuZCB0aGF0IHRoZSByZXR1cm5lZCBtYWtlciBmdW5jdGlvbiBzaG91bGQgaGF2ZSB6ZXJvXG4gKiBwYXJhbWV0ZXJzLlxuICpcbiAqIEByZXR1cm5zIHt7fX1cbiAqL1xuICAgICAgIGNvbnN0IGluaXRFbXB0eSA9ICgpID0+IGVtcHR5UmVjb3JkO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEkgaW5pdCBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7RXhvQ2xhc3NJbnRlcmZhY2VHdWFyZDxNPiB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtFeG9DbGFzc01ldGhvZHM8TSwgST59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RmFyQ2xhc3NPcHRpb25zPElNUE9SVCgnLi90eXBlcy5qcycpLkNsYXNzQ29udGV4dDxSZXR1cm5UeXBlPEk+LCBNPj59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiBHdWFyZGVkPE0+fVxuICovJGjNj19vbmNlLmluaXRFbXB0eShpbml0RW1wdHkpO1xuICAgICAgIGNvbnN0IGRlZmluZUV4b0NsYXNzID0gKFxuICB0YWcsXG4gIGludGVyZmFjZUd1YXJkLFxuICBpbml0LFxuICBtZXRob2RzLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgaGFyZGVuKG1ldGhvZHMpO1xuICBjb25zdCB7XG4gICAgZmluaXNoID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVBbXBsaWZpZXIgPSB1bmRlZmluZWQsXG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyID0gdW5kZWZpbmVkLFxuICB9ID0gb3B0aW9ucztcbiAgcmVjZWl2ZUFtcGxpZmllciA9PT0gdW5kZWZpbmVkIHx8XG4gICAgRmFpbGBPbmx5IGZhY2V0cyBvZiBhbiBleG8gY2xhc3Mga2l0IGNhbiBiZSBhbXBsaWZpZWQgJHtxKHRhZyl9YDtcblxuICAvKiogQHR5cGUge1dlYWtNYXA8TSwgSU1QT1JUKCcuL3R5cGVzLmpzJykuQ2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sIE0+Pn0gKi9cbiAgY29uc3QgY29udGV4dE1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IHByb3RvID0gZGVmZW5kUHJvdG90eXBlKFxuICAgIHRhZyxcbiAgICBzZWxmID0+IC8qKiBAdHlwZSB7YW55fSAqLyAoY29udGV4dE1hcC5nZXQoc2VsZikpLFxuICAgIG1ldGhvZHMsXG4gICAgdHJ1ZSxcbiAgICBpbnRlcmZhY2VHdWFyZCxcbiAgKTtcbiAgbGV0IGluc3RhbmNlQ291bnQgPSAwO1xuICAvKipcbiAqIEBwYXJhbSAge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqL1xuICBjb25zdCBtYWtlSW5zdGFuY2UgPSAoLi4uYXJncykgPT4ge1xuICAgIC8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbiAgICBjb25zdCBzdGF0ZSA9IHNlYWwoaW5pdCguLi5hcmdzKSk7XG4gICAgaW5zdGFuY2VDb3VudCArPSAxO1xuICAgIGNvbnN0IHNlbGYgPSBtYWtlU2VsZihwcm90bywgaW5zdGFuY2VDb3VudCk7XG5cbiAgICAvKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG4gICAgLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5DbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPixNPn0gKi9cbiAgICBjb25zdCBjb250ZXh0ID0gZnJlZXplKHsgc3RhdGUsIHNlbGYgfSk7XG4gICAgY29udGV4dE1hcC5zZXQoc2VsZiwgY29udGV4dCk7XG4gICAgaWYgKGZpbmlzaCkge1xuICAgICAgZmluaXNoKGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICBpZiAocmVjZWl2ZUluc3RhbmNlVGVzdGVyKSB7XG4gICAgLyoqIEB0eXBlIHtJc0luc3RhbmNlfSAqL1xuICAgIGNvbnN0IGlzSW5zdGFuY2UgPSAoZXhvLCBmYWNldE5hbWUgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGZhY2V0TmFtZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgZmFjZXROYW1lIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBhbiBleG8gY2xhc3Mga2l0OiAke3EoXG4gICAgICAgICAgdGFnLFxuICAgICAgICApfSBoYXMgbm8gZmFjZXQgJHtxKGZhY2V0TmFtZSl9YDtcbiAgICAgIHJldHVybiBjb250ZXh0TWFwLmhhcyhleG8pO1xuICAgIH07XG4gICAgaGFyZGVuKGlzSW5zdGFuY2UpO1xuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3Rlcihpc0luc3RhbmNlKTtcbiAgfVxuXG4gIHJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlKTtcbn07JGjNj19vbmNlLmRlZmluZUV4b0NsYXNzKGRlZmluZUV4b0NsYXNzKTtcbmhhcmRlbihkZWZpbmVFeG9DbGFzcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSSBpbml0IGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxGYWNldE5hbWUsIE1ldGhvZHM+fSBGIGZhY2V0IG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7RXhvQ2xhc3NJbnRlcmZhY2VHdWFyZEtpdDxGPiB8IHVuZGVmaW5lZCB9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7RXhvQ2xhc3NLaXRNZXRob2RzPEYsIEk+fSBtZXRob2RzS2l0XG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxcbiAqICAgS2l0Q29udGV4dDxSZXR1cm5UeXBlPEk+LCBHdWFyZGVkS2l0PEY+PixcbiAqICAgR3VhcmRlZEtpdDxGPlxuICogPn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWRLaXQ8Rj59XG4gKi9cbiAgICAgICBjb25zdCBkZWZpbmVFeG9DbGFzc0tpdCA9IChcbiAgdGFnLFxuICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgaW5pdCxcbiAgbWV0aG9kc0tpdCxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGhhcmRlbihtZXRob2RzS2l0KTtcbiAgY29uc3Qge1xuICAgIGZpbmlzaCA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlQW1wbGlmaWVyID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3RlciA9IHVuZGVmaW5lZCxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNvbnRleHRNYXBLaXQgPSBvYmplY3RNYXAobWV0aG9kc0tpdCwgKCkgPT4gbmV3IFdlYWtNYXAoKSk7XG4gIGNvbnN0IGdldENvbnRleHRLaXQgPSBvYmplY3RNYXAoXG4gICAgY29udGV4dE1hcEtpdCxcbiAgICBjb250ZXh0TWFwID0+IGZhY2V0ID0+IGNvbnRleHRNYXAuZ2V0KGZhY2V0KSxcbiAgKTtcbiAgY29uc3QgcHJvdG90eXBlS2l0ID0gZGVmZW5kUHJvdG90eXBlS2l0KFxuICAgIHRhZyxcbiAgICBnZXRDb250ZXh0S2l0LFxuICAgIG1ldGhvZHNLaXQsXG4gICAgdHJ1ZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgKTtcbiAgbGV0IGluc3RhbmNlQ291bnQgPSAwO1xuICAvKipcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICovXG4gIGNvbnN0IG1ha2VJbnN0YW5jZUtpdCA9ICguLi5hcmdzKSA9PiB7XG4gICAgLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuICAgIGNvbnN0IHN0YXRlID0gc2VhbChpbml0KC4uLmFyZ3MpKTtcbiAgICAvKiBEb24ndCBmcmVlemUgY29udGV4dCB1bnRpbCB3ZSBhZGQgZmFjZXRzKi9cbiAgICAvKiogQHR5cGUge3sgc3RhdGU6IFJldHVyblR5cGU8ST4sIGZhY2V0czogYW55IH19ICovXG4gICAgY29uc3QgY29udGV4dCA9IHsgc3RhdGUsIGZhY2V0czogbnVsbCB9O1xuICAgIGluc3RhbmNlQ291bnQgKz0gMTtcbiAgICBjb25zdCBmYWNldHMgPSBvYmplY3RNYXAocHJvdG90eXBlS2l0LCAocHJvdG8sIGZhY2V0TmFtZSkgPT4ge1xuICAgICAgY29uc3Qgc2VsZiA9IG1ha2VTZWxmKHByb3RvLCBpbnN0YW5jZUNvdW50KTtcbiAgICAgIGNvbnRleHRNYXBLaXRbZmFjZXROYW1lXS5zZXQoc2VsZiwgY29udGV4dCk7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9KTtcbiAgICBjb250ZXh0LmZhY2V0cyA9IGZhY2V0cztcbiAgICAvKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG4gICAgZnJlZXplKGNvbnRleHQpO1xuICAgIGlmIChmaW5pc2gpIHtcbiAgICAgIGZpbmlzaChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7R3VhcmRlZEtpdDxGPn0gKi8gKGNvbnRleHQuZmFjZXRzKTtcbiAgfTtcblxuICBpZiAocmVjZWl2ZUFtcGxpZmllcikge1xuICAgIC8qKiBAdHlwZSB7QW1wbGlmeX0gKi9cbiAgICBjb25zdCBhbXBsaWZ5ID0gZXhvRmFjZXQgPT4ge1xuICAgICAgZm9yIChjb25zdCBjb250ZXh0TWFwIG9mIHZhbHVlcyhjb250ZXh0TWFwS2l0KSkge1xuICAgICAgICBpZiAoY29udGV4dE1hcC5oYXMoZXhvRmFjZXQpKSB7XG4gICAgICAgICAgY29uc3QgeyBmYWNldHMgfSA9IGNvbnRleHRNYXAuZ2V0KGV4b0ZhY2V0KTtcbiAgICAgICAgICByZXR1cm4gZmFjZXRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBGYWlsYE11c3QgYmUgYSBmYWNldCBvZiAke3EodGFnKX06ICR7ZXhvRmFjZXR9YDtcbiAgICB9O1xuICAgIGhhcmRlbihhbXBsaWZ5KTtcbiAgICByZWNlaXZlQW1wbGlmaWVyKGFtcGxpZnkpO1xuICB9XG5cbiAgaWYgKHJlY2VpdmVJbnN0YW5jZVRlc3Rlcikge1xuICAgIC8qKiBAdHlwZSB7SXNJbnN0YW5jZX0gKi9cbiAgICBjb25zdCBpc0luc3RhbmNlID0gKGV4b0ZhY2V0LCBmYWNldE5hbWUgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChmYWNldE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdmFsdWVzKGNvbnRleHRNYXBLaXQpLnNvbWUoY29udGV4dE1hcCA9PlxuICAgICAgICAgIGNvbnRleHRNYXAuaGFzKGV4b0ZhY2V0KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydC50eXBlb2YoZmFjZXROYW1lLCAnc3RyaW5nJyk7XG4gICAgICBjb25zdCBjb250ZXh0TWFwID0gY29udGV4dE1hcEtpdFtmYWNldE5hbWVdO1xuICAgICAgY29udGV4dE1hcCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgZXhvIGNsYXNzIGtpdCAke3EodGFnKX0gaGFzIG5vIGZhY2V0IG5hbWVkICR7cShmYWNldE5hbWUpfWA7XG4gICAgICByZXR1cm4gY29udGV4dE1hcC5oYXMoZXhvRmFjZXQpO1xuICAgIH07XG4gICAgaGFyZGVuKGlzSW5zdGFuY2UpO1xuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3Rlcihpc0luc3RhbmNlKTtcbiAgfVxuXG4gIHJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlS2l0KTtcbn07JGjNj19vbmNlLmRlZmluZUV4b0NsYXNzS2l0KGRlZmluZUV4b0NsYXNzS2l0KTtcbmhhcmRlbihkZWZpbmVFeG9DbGFzc0tpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0lNUE9SVCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZDx7XG4gKiAgIFtNIGluIGtleW9mIFRdOiBJTVBPUlQoJ0BlbmRvL3BhdHRlcm5zJykuTWV0aG9kR3VhcmRcbiAqIH0+IHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZCBDQVZFQVQ6IHN0YXRpYyB0eXBpbmcgZG9lcyBub3QgeWV0IHN1cHBvcnQgYGNhbGxXaGVuYCB0cmFuc2Zvcm1hdGlvblxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxJTVBPUlQoJy4vdHlwZXMuanMnKS5DbGFzc0NvbnRleHQ8e30sVD4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtHdWFyZGVkPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUV4byA9ICh0YWcsIGludGVyZmFjZUd1YXJkLCBtZXRob2RzLCBvcHRpb25zID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNvbnN0IG1ha2VJbnN0YW5jZSA9IGRlZmluZUV4b0NsYXNzKFxuICAgIHRhZyxcbiAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICBpbml0RW1wdHksXG4gICAgbWV0aG9kcyxcbiAgICBvcHRpb25zLFxuICApO1xuICByZXR1cm4gbWFrZUluc3RhbmNlKCk7XG59OyRozY9fb25jZS5tYWtlRXhvKG1ha2VFeG8pO1xuaGFyZGVuKG1ha2VFeG8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaW5pdEVtcHR5IjpbImluaXRFbXB0eSJdLCJkZWZpbmVFeG9DbGFzcyI6WyJkZWZpbmVFeG9DbGFzcyJdLCJkZWZpbmVFeG9DbGFzc0tpdCI6WyJkZWZpbmVFeG9DbGFzc0tpdCJdLCJtYWtlRXhvIjpbIm1ha2VFeG8iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFaP+6y5GAAAuRgAAIgAAAEBlbmRvL2V4by12MS41LjEyL3NyYy9leG8tdG9vbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wYXR0ZXJucyIsIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIkBlbmRvL2Vycm9ycyIsIi4vZ2V0LWludGVyZmFjZS5qcyJdLCJleHBvcnRzIjpbImRlZmVuZFByb3RvdHlwZSIsImRlZmVuZFByb3RvdHlwZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMsdG9UaHJvd2FibGUsRmFyLG11c3RNYXRjaCxNLGlzQXdhaXRBcmdHdWFyZCxpc1Jhd0d1YXJkLGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkLGdldE1ldGhvZEd1YXJkUGF5bG9hZCxnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQsZ2V0Q29weU1hcEVudHJpZXMsbGlzdERpZmZlcmVuY2Usb2JqZWN0TWFwLHEsRmFpbCxHRVRfSU5URVJGQUNFX0dVQVJEOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRSZW1vdGFibGVNZXRob2ROYW1lc1wiLFskaM2PX2EgPT4gKGdldFJlbW90YWJsZU1ldGhvZE5hbWVzID0gJGjNj19hKV1dLFtcInRvVGhyb3dhYmxlXCIsWyRozY9fYSA9PiAodG9UaHJvd2FibGUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJpc0F3YWl0QXJnR3VhcmRcIixbJGjNj19hID0+IChpc0F3YWl0QXJnR3VhcmQgPSAkaM2PX2EpXV0sW1wiaXNSYXdHdWFyZFwiLFskaM2PX2EgPT4gKGlzUmF3R3VhcmQgPSAkaM2PX2EpXV0sW1wiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCA9ICRozY9fYSldXSxbXCJnZXRNZXRob2RHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRNZXRob2RHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dLFtcImdldENvcHlNYXBFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzXCIsIFtbXCJsaXN0RGlmZmVyZW5jZVwiLFskaM2PX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2dldC1pbnRlcmZhY2UuanNcIiwgW1tcIkdFVF9JTlRFUkZBQ0VfR1VBUkRcIixbJGjNj19hID0+IChHRVRfSU5URVJGQUNFX0dVQVJEID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZW1vdGFibGVNZXRob2ROYW1lfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0ludGVyZmFjZUd1YXJkLCBNZXRob2QsIE1ldGhvZEd1YXJkLCBNZXRob2RHdWFyZFBheWxvYWQsIERlZmF1bHRHdWFyZFR5cGV9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJ1xuICogQGltcG9ydCB7Q2xhc3NDb250ZXh0LCBDb250ZXh0UHJvdmlkZXIsIEZhY2V0TmFtZSwgS2l0Q29udGV4dCwgS2l0Q29udGV4dFByb3ZpZGVyLCBNYXRjaENvbmZpZywgTWV0aG9kc30gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge0dldEludGVyZmFjZUd1YXJkfSBmcm9tICcuL2dldC1pbnRlcmZhY2UuanMnO1xuICovXG5cbmNvbnN0IHsgYXBwbHksIG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGRlZmluZVByb3BlcnRpZXMsIGZyb21FbnRyaWVzLCBoYXNPd24gfSA9IE9iamVjdDtcblxuLyoqXG4gKiBBIG1ldGhvZCBndWFyZCwgZm9yIGluY2x1c2lvbiBpbiBhbiBpbnRlcmZhY2UgZ3VhcmQsIHRoYXQgZG9lcyBub3RcbiAqIGVuZm9yY2UgYW55IGNvbnN0cmFpbnRzIG9mIGluY29taW5nIGFyZ3VtZW50cyBvciByZXR1cm4gcmVzdWx0cy5cbiAqL1xuY29uc3QgUmF3TWV0aG9kR3VhcmQgPSBNLmNhbGwoKS5yZXN0KE0ucmF3KCkpLnJldHVybnMoTS5yYXcoKSk7XG5cbmNvbnN0IFJFREFDVEVEX1JBV19BUkcgPSAnPHJlZGFjdGVkIHJhdyBhcmc+JztcblxuLyoqXG4gKiBBIG1ldGhvZCBndWFyZCwgZm9yIGluY2x1c2lvbiBpbiBhbiBpbnRlcmZhY2UgZ3VhcmQsIHRoYXQgZW5mb3JjZXMgb25seSB0aGF0XG4gKiBhbGwgYXJndW1lbnRzIGFyZSBwYXNzYWJsZSBhbmQgdGhhdCB0aGUgcmVzdWx0IGlzIHBhc3NhYmxlLiAoSW4gZmFyIGNsYXNzZXMsXG4gKiBcImFueVwiIG1lYW5zIGFueSAqcGFzc2FibGUqLikgVGhpcyBpcyB0aGUgbGVhc3QgcG9zc2libGUgbm9uLXJhd1xuICogZW5mb3JjZW1lbnQgZm9yIGEgbWV0aG9kIGd1YXJkLCBhbmQgaXMgaW1wbGllZCBieSBhbGwgb3RoZXJcbiAqIG5vbi1yYXcgbWV0aG9kIGd1YXJkcy5cbiAqL1xuY29uc3QgUGFzc2FibGVNZXRob2RHdWFyZCA9IE0uY2FsbCgpLnJlc3QoTS5hbnkoKSkucmV0dXJucyhNLmFueSgpKTtcblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlW119IHN5bmNBcmdzXG4gKiBAcGFyYW0ge01hdGNoQ29uZmlnfSBtYXRjaENvbmZpZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZVtdfSBSZXR1cm5zIHRoZSBhcmdzIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgcmF3IG1ldGhvZC5cbiAqL1xuY29uc3QgZGVmZW5kU3luY0FyZ3MgPSAoc3luY0FyZ3MsIG1hdGNoQ29uZmlnLCBsYWJlbCA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCB7XG4gICAgZGVjbGFyZWRMZW4sXG4gICAgaGFzUmVzdEFyZ0d1YXJkLFxuICAgIHJlc3RBcmdHdWFyZElzUmF3LFxuICAgIHBhcmFtc1BhdHRlcm4sXG4gICAgcmVkYWN0ZWRJbmRpY2VzLFxuICB9ID0gbWF0Y2hDb25maWc7XG5cbiAgLyogVXNlIHN5bmNBcmdzIGlmIHBvc3NpYmxlLCBidXQgY29weSBpdCB3aGVuIG5lY2Vzc2FyeSB0byBpbXBsZW1lbnQqL1xuICAvKiByZWRhY3Rpb25zLiovXG4gIGxldCBtYXRjaGFibGVBcmdzID0gc3luY0FyZ3M7XG4gIGlmIChyZXN0QXJnR3VhcmRJc1JhdyAmJiBzeW5jQXJncy5sZW5ndGggPiBkZWNsYXJlZExlbikge1xuICAgIGNvbnN0IHJlc3RMZW4gPSBzeW5jQXJncy5sZW5ndGggLSBkZWNsYXJlZExlbjtcbiAgICBjb25zdCByZWRhY3RlZFJlc3QgPSBBcnJheShyZXN0TGVuKS5maWxsKFJFREFDVEVEX1JBV19BUkcpO1xuICAgIG1hdGNoYWJsZUFyZ3MgPSBbLi4uc3luY0FyZ3Muc2xpY2UoMCwgZGVjbGFyZWRMZW4pLCAuLi5yZWRhY3RlZFJlc3RdO1xuICB9IGVsc2UgaWYgKFxuICAgIHJlZGFjdGVkSW5kaWNlcy5sZW5ndGggPiAwICYmXG4gICAgcmVkYWN0ZWRJbmRpY2VzWzBdIDwgc3luY0FyZ3MubGVuZ3RoXG4gICkge1xuICAgIC8qIENvcHkgdGhlIGFyZ3VtZW50cyBhcnJheSwgYXZvaWRpbmcgaGFyZGVuaW5nIHRoZSByZWRhY3RlZCBvbmVzICh3aGljaCBhcmUqL1xuICAgIC8qIHRyaXZpYWxseSBtYXRjaGVkIHVzaW5nIFJFREFDVEVEX1JBV19BUkcgYXMgYSBzZW50aW5lbCB2YWx1ZSkuKi9cbiAgICBtYXRjaGFibGVBcmdzID0gWy4uLnN5bmNBcmdzXTtcbiAgfVxuXG4gIGZvciAoY29uc3QgaSBvZiByZWRhY3RlZEluZGljZXMpIHtcbiAgICBpZiAoaSA+PSBtYXRjaGFibGVBcmdzLmxlbmd0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG1hdGNoYWJsZUFyZ3NbaV0gPSBSRURBQ1RFRF9SQVdfQVJHO1xuICB9XG5cbiAgbXVzdE1hdGNoKGhhcmRlbihtYXRjaGFibGVBcmdzKSwgcGFyYW1zUGF0dGVybiwgbGFiZWwpO1xuXG4gIGlmIChoYXNSZXN0QXJnR3VhcmQpIHtcbiAgICByZXR1cm4gc3luY0FyZ3M7XG4gIH1cbiAgc3luY0FyZ3MubGVuZ3RoIDw9IGRlY2xhcmVkTGVuIHx8XG4gICAgRmFpbGAke3EobGFiZWwpfSBhY2NlcHRzIGF0IG1vc3QgJHtxKGRlY2xhcmVkTGVuKX0gYXJndW1lbnRzLCBub3QgJHtxKFxuICAgICAgc3luY0FyZ3MubGVuZ3RoLFxuICAgICl9OiAke3N5bmNBcmdzfWA7XG4gIHJldHVybiBzeW5jQXJncztcbn07XG5cbi8qKlxuICogQ29udmVydCBhIG1ldGhvZCBndWFyZCB0byBhIG1hdGNoIGNvbmZpZyBmb3IgbW9yZSBlZmZpY2llbnQgcGVyLWNhbGxcbiAqIGV4ZWN1dGlvbi4gIFRoaXMgaXMgYSBvbmUtdGltZSBjb252ZXJzaW9uLCBzbyBpdCdzIE9LIHRvIGJlIHNsb3cuXG4gKlxuICogTW9zdCBvZiB0aGUgd29yayBpcyBkb25lIHRvIGRldGVjdCBgTS5yYXcoKWAgc28gdGhhdCB3ZSBidWlsZCBhIG1hdGNoIHBhdHRlcm5cbiAqIGFuZCBtZXRhZGF0YSBpbnN0ZWFkIG9mIGRvaW5nIHRoaXMgaW4gdGhlIGhvdCBwYXRoLlxuICogQHBhcmFtIHtNZXRob2RHdWFyZFBheWxvYWR9IG1ldGhvZEd1YXJkUGF5bG9hZFxuICogQHJldHVybnMge01hdGNoQ29uZmlnfVxuICovXG5jb25zdCBidWlsZE1hdGNoQ29uZmlnID0gbWV0aG9kR3VhcmRQYXlsb2FkID0+IHtcbiAgY29uc3Qge1xuICAgIGFyZ0d1YXJkcyxcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyA9IFtdLFxuICAgIHJlc3RBcmdHdWFyZCxcbiAgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcblxuICBjb25zdCBtYXRjaGFibGVBcmdHdWFyZHMgPSBbLi4uYXJnR3VhcmRzLCAuLi5vcHRpb25hbEFyZ0d1YXJkc107XG5cbiAgY29uc3QgcmVkYWN0ZWRJbmRpY2VzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2hhYmxlQXJnR3VhcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGlzUmF3R3VhcmQobWF0Y2hhYmxlQXJnR3VhcmRzW2ldKSkge1xuICAgICAgbWF0Y2hhYmxlQXJnR3VhcmRzW2ldID0gUkVEQUNURURfUkFXX0FSRztcbiAgICAgIHJlZGFjdGVkSW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIC8qIFBhc3MgdGhyb3VnaCByYXcgcmVzdCBhcmd1bWVudHMgd2l0aG91dCBtYXRjaGluZy4qL1xuICBsZXQgbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkID0gcmVzdEFyZ0d1YXJkO1xuICBpZiAoaXNSYXdHdWFyZChtYXRjaGFibGVSZXN0QXJnR3VhcmQpKSB7XG4gICAgbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkID0gTS5hcnJheU9mKFJFREFDVEVEX1JBV19BUkcpO1xuICB9XG4gIGNvbnN0IG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZCA9IGhhcmRlbih7XG4gICAgLi4ubWV0aG9kR3VhcmRQYXlsb2FkLFxuICAgIGFyZ0d1YXJkczogbWF0Y2hhYmxlQXJnR3VhcmRzLnNsaWNlKDAsIGFyZ0d1YXJkcy5sZW5ndGgpLFxuICAgIG9wdGlvbmFsQXJnR3VhcmRzOiBtYXRjaGFibGVBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCksXG4gICAgcmVzdEFyZ0d1YXJkOiBtYXRjaGFibGVSZXN0QXJnR3VhcmQsXG4gIH0pO1xuXG4gIGNvbnN0IHBhcmFtc1BhdHRlcm4gPSBNLnNwbGl0QXJyYXkoXG4gICAgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLmFyZ0d1YXJkcyxcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQub3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLnJlc3RBcmdHdWFyZCxcbiAgKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBkZWNsYXJlZExlbjogbWF0Y2hhYmxlQXJnR3VhcmRzLmxlbmd0aCxcbiAgICBoYXNSZXN0QXJnR3VhcmQ6IHJlc3RBcmdHdWFyZCAhPT0gdW5kZWZpbmVkLFxuICAgIHJlc3RBcmdHdWFyZElzUmF3OiByZXN0QXJnR3VhcmQgIT09IG1hdGNoYWJsZVJlc3RBcmdHdWFyZCxcbiAgICBwYXJhbXNQYXR0ZXJuLFxuICAgIHJlZGFjdGVkSW5kaWNlcyxcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAcGFyYW0geyhyZXByZXNlbnRhdGl2ZTogYW55KSA9PiBDbGFzc0NvbnRleHQgfCBLaXRDb250ZXh0fSBnZXRDb250ZXh0XG4gKiBAcGFyYW0ge0NhbGxhYmxlRnVuY3Rpb259IGJlaGF2aW9yTWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkUGF5bG9hZH0gbWV0aG9kR3VhcmRQYXlsb2FkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEByZXR1cm5zIHtNZXRob2R9XG4gKi9cbmNvbnN0IGRlZmVuZFN5bmNNZXRob2QgPSAoXG4gIGdldENvbnRleHQsXG4gIGJlaGF2aW9yTWV0aG9kLFxuICBtZXRob2RHdWFyZFBheWxvYWQsXG4gIGxhYmVsLFxuKSA9PiB7XG4gIGNvbnN0IHsgcmV0dXJuR3VhcmQgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgY29uc3QgaXNSYXdSZXR1cm4gPSBpc1Jhd0d1YXJkKHJldHVybkd1YXJkKTtcbiAgY29uc3QgbWF0Y2hDb25maWcgPSBidWlsZE1hdGNoQ29uZmlnKG1ldGhvZEd1YXJkUGF5bG9hZCk7XG4gIGNvbnN0IHsgc3luY01ldGhvZCB9ID0ge1xuICAgIC8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuICAgIHN5bmNNZXRob2QoLi4uc3luY0FyZ3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0KHRoaXMpO1xuICAgICAgICAvKiBPbmx5IGhhcmRlbiBhcmdzIGFuZCByZXR1cm4gdmFsdWUgaWYgbm90IGRlYWxpbmcgd2l0aCBhIHJhdyB2YWx1ZSBndWFyZC4qL1xuICAgICAgICBjb25zdCByZWFsQXJncyA9IGRlZmVuZFN5bmNBcmdzKHN5bmNBcmdzLCBtYXRjaENvbmZpZywgbGFiZWwpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhcHBseShiZWhhdmlvck1ldGhvZCwgY29udGV4dCwgcmVhbEFyZ3MpO1xuICAgICAgICBpZiAoIWlzUmF3UmV0dXJuKSB7XG4gICAgICAgICAgbXVzdE1hdGNoKGhhcmRlbihyZXN1bHQpLCByZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBjYXRjaCAodGhyb3duVGhpbmcpIHtcbiAgICAgICAgdGhyb3cgdG9UaHJvd2FibGUodGhyb3duVGhpbmcpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG4gIHJldHVybiBzeW5jTWV0aG9kO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkUGF5bG9hZH0gbWV0aG9kR3VhcmRQYXlsb2FkXG4gKi9cbmNvbnN0IGRlc3luYyA9IG1ldGhvZEd1YXJkUGF5bG9hZCA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcmdHdWFyZHMsXG4gICAgb3B0aW9uYWxBcmdHdWFyZHMgPSBbXSxcbiAgICByZXN0QXJnR3VhcmQsXG4gIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG4gICFpc0F3YWl0QXJnR3VhcmQocmVzdEFyZ0d1YXJkKSB8fFxuICAgIEZhaWxgUmVzdCBhcmdzIG1heSBub3QgYmUgYXdhaXRlZDogJHtyZXN0QXJnR3VhcmR9YDtcbiAgY29uc3QgcmF3QXJnR3VhcmRzID0gWy4uLmFyZ0d1YXJkcywgLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG4gIGNvbnN0IGF3YWl0SW5kZXhlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0FyZ0d1YXJkcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGFyZ0d1YXJkID0gcmF3QXJnR3VhcmRzW2ldO1xuICAgIGlmIChpc0F3YWl0QXJnR3VhcmQoYXJnR3VhcmQpKSB7XG4gICAgICByYXdBcmdHdWFyZHNbaV0gPSBnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZChhcmdHdWFyZCkuYXJnR3VhcmQ7XG4gICAgICBhd2FpdEluZGV4ZXMucHVzaChpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhd2FpdEluZGV4ZXMsXG4gICAgcmF3TWV0aG9kR3VhcmRQYXlsb2FkOiB7XG4gICAgICAuLi5tZXRob2RHdWFyZFBheWxvYWQsXG4gICAgICBhcmdHdWFyZHM6IHJhd0FyZ0d1YXJkcy5zbGljZSgwLCBhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICAgIG9wdGlvbmFsQXJnR3VhcmRzOiByYXdBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCksXG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHsocmVwcmVzZW50YXRpdmU6IGFueSkgPT4gQ2xhc3NDb250ZXh0IHwgS2l0Q29udGV4dH0gZ2V0Q29udGV4dFxuICogQHBhcmFtIHtDYWxsYWJsZUZ1bmN0aW9ufSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZFBheWxvYWR9IG1ldGhvZEd1YXJkUGF5bG9hZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKi9cbmNvbnN0IGRlZmVuZEFzeW5jTWV0aG9kID0gKFxuICBnZXRDb250ZXh0LFxuICBiZWhhdmlvck1ldGhvZCxcbiAgbWV0aG9kR3VhcmRQYXlsb2FkLFxuICBsYWJlbCxcbikgPT4ge1xuICBjb25zdCB7IHJldHVybkd1YXJkIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG4gIGNvbnN0IGlzUmF3UmV0dXJuID0gaXNSYXdHdWFyZChyZXR1cm5HdWFyZCk7XG5cbiAgY29uc3QgeyBhd2FpdEluZGV4ZXMsIHJhd01ldGhvZEd1YXJkUGF5bG9hZCB9ID0gZGVzeW5jKG1ldGhvZEd1YXJkUGF5bG9hZCk7XG4gIGNvbnN0IG1hdGNoQ29uZmlnID0gYnVpbGRNYXRjaENvbmZpZyhyYXdNZXRob2RHdWFyZFBheWxvYWQpO1xuXG4gIGNvbnN0IHsgYXN5bmNNZXRob2QgfSA9IHtcbiAgICAvKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbiAgICBhc3luY01ldGhvZCguLi5hcmdzKSB7XG4gICAgICBjb25zdCBhd2FpdExpc3QgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgaSBvZiBhd2FpdEluZGV4ZXMpIHtcbiAgICAgICAgaWYgKGkgPj0gYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBhd2FpdExpc3QucHVzaChhcmdzW2ldKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHAgPSBQcm9taXNlLmFsbChhd2FpdExpc3QpO1xuICAgICAgY29uc3Qgc3luY0FyZ3MgPSBbLi4uYXJnc107XG4gICAgICBjb25zdCByZXN1bHRQID0gRS53aGVuKFxuICAgICAgICBwLFxuICAgICAgICAvKiogQHBhcmFtIHthbnlbXX0gYXdhaXRlZEFyZ3MgKi8gYXdhaXRlZEFyZ3MgPT4ge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXdhaXRlZEFyZ3MubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgIHN5bmNBcmdzW2F3YWl0SW5kZXhlc1tqXV0gPSBhd2FpdGVkQXJnc1tqXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogR2V0IHRoZSBjb250ZXh0IGFmdGVyIGFsbCB3YWl0aW5nIGluIGNhc2Ugd2UgZXZlciBkbyByZXZvY2F0aW9uKi9cbiAgICAgICAgICAvKiBieSByZW1vdmluZyB0aGUgY29udGV4dCBlbnRyeS4gQXZvaWQgVE9DVFRPVSEqL1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0KHRoaXMpO1xuICAgICAgICAgIGNvbnN0IHJlYWxBcmdzID0gZGVmZW5kU3luY0FyZ3Moc3luY0FyZ3MsIG1hdGNoQ29uZmlnLCBsYWJlbCk7XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLCBjb250ZXh0LCByZWFsQXJncyk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIEUud2hlbihyZXN1bHRQLCBmdWxmaWxsbWVudCA9PiB7XG4gICAgICAgIGlmICghaXNSYXdSZXR1cm4pIHtcbiAgICAgICAgICBtdXN0TWF0Y2goaGFyZGVuKGZ1bGZpbGxtZW50KSwgcmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bGZpbGxtZW50O1xuICAgICAgfSkuY2F0Y2gocmVhc29uID0+XG4gICAgICAgIC8qIERvbmUgaXMgYSBjaGFpbmVkIGAuY2F0Y2hgIHJhdGhlciB0aGFuIGFuIG9uUmVqZWN0ZWQgY2xhdXNlIG9mIHRoZSovXG4gICAgICAgIC8qIGBFLndoZW5gIGFib3ZlIGluIGNhc2UgdGhlIGBtdXN0TWF0Y2hgIHRocm93cy4qL1xuICAgICAgICBQcm9taXNlLnJlamVjdCh0b1Rocm93YWJsZShyZWFzb24pKSxcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIGFzeW5jTWV0aG9kO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHsocmVwcmVzZW50YXRpdmU6IGFueSkgPT4gQ2xhc3NDb250ZXh0IHwgS2l0Q29udGV4dH0gZ2V0Q29udGV4dFxuICogQHBhcmFtIHtDYWxsYWJsZUZ1bmN0aW9ufSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICovXG5jb25zdCBkZWZlbmRNZXRob2QgPSAoZ2V0Q29udGV4dCwgYmVoYXZpb3JNZXRob2QsIG1ldGhvZEd1YXJkLCBsYWJlbCkgPT4ge1xuICBjb25zdCBtZXRob2RHdWFyZFBheWxvYWQgPSBnZXRNZXRob2RHdWFyZFBheWxvYWQobWV0aG9kR3VhcmQpO1xuICBjb25zdCB7IGNhbGxLaW5kIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG4gIGlmIChjYWxsS2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgcmV0dXJuIGRlZmVuZFN5bmNNZXRob2QoXG4gICAgICBnZXRDb250ZXh0LFxuICAgICAgYmVoYXZpb3JNZXRob2QsXG4gICAgICBtZXRob2RHdWFyZFBheWxvYWQsXG4gICAgICBsYWJlbCxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGFzc2VydChjYWxsS2luZCA9PT0gJ2FzeW5jJyk7XG4gICAgcmV0dXJuIGRlZmVuZEFzeW5jTWV0aG9kKFxuICAgICAgZ2V0Q29udGV4dCxcbiAgICAgIGJlaGF2aW9yTWV0aG9kLFxuICAgICAgbWV0aG9kR3VhcmRQYXlsb2FkLFxuICAgICAgbGFiZWwsXG4gICAgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kVGFnXG4gKiBAcGFyYW0ge0NvbnRleHRQcm92aWRlcn0gY29udGV4dFByb3ZpZGVyXG4gKiBAcGFyYW0ge0NhbGxhYmxlRnVuY3Rpb259IGJlaGF2aW9yTWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICovXG5jb25zdCBiaW5kTWV0aG9kID0gKFxuICBtZXRob2RUYWcsXG4gIGNvbnRleHRQcm92aWRlcixcbiAgYmVoYXZpb3JNZXRob2QsXG4gIG1ldGhvZEd1YXJkLFxuKSA9PiB7XG4gIGFzc2VydC50eXBlb2YoYmVoYXZpb3JNZXRob2QsICdmdW5jdGlvbicpO1xuXG4gIC8qKlxuICogQHBhcmFtIHthbnl9IHJlcHJlc2VudGF0aXZlXG4gKiBAcmV0dXJucyB7Q2xhc3NDb250ZXh0IHwgS2l0Q29udGV4dH1cbiAqL1xuICBjb25zdCBnZXRDb250ZXh0ID0gcmVwcmVzZW50YXRpdmUgPT4ge1xuICAgIHJlcHJlc2VudGF0aXZlIHx8XG4gICAgICAvKiBzZXBhcmF0ZSBsaW5lIHRvIGVhc2UgYnJlYWtwb2ludGluZyovXG4gICAgICBGYWlsYE1ldGhvZCAke21ldGhvZFRhZ30gY2FsbGVkIHdpdGhvdXQgJ3RoaXMnIG9iamVjdGA7XG4gICAgY29uc3QgY29udGV4dCA9IGNvbnRleHRQcm92aWRlcihyZXByZXNlbnRhdGl2ZSk7XG4gICAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRmFpbGAke3EoXG4gICAgICAgIG1ldGhvZFRhZyxcbiAgICAgICl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtyZXByZXNlbnRhdGl2ZX1gO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbiAgfTtcblxuICBjb25zdCBtZXRob2QgPSBkZWZlbmRNZXRob2QoXG4gICAgZ2V0Q29udGV4dCxcbiAgICBiZWhhdmlvck1ldGhvZCxcbiAgICBtZXRob2RHdWFyZCxcbiAgICBtZXRob2RUYWcsXG4gICk7XG5cbiAgZGVmaW5lUHJvcGVydGllcyhtZXRob2QsIHtcbiAgICBuYW1lOiB7IHZhbHVlOiBtZXRob2RUYWcgfSxcbiAgICBsZW5ndGg6IHsgdmFsdWU6IGJlaGF2aW9yTWV0aG9kLmxlbmd0aCB9LFxuICB9KTtcbiAgcmV0dXJuIG1ldGhvZDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UmVtb3RhYmxlTWV0aG9kTmFtZSwgQ2FsbGFibGVGdW5jdGlvbj59IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7Q29udGV4dFByb3ZpZGVyfSBjb250ZXh0UHJvdmlkZXJcbiAqIEBwYXJhbSB7VH0gYmVoYXZpb3JNZXRob2RzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQ8eyBbTSBpbiBrZXlvZiBUXTogTWV0aG9kR3VhcmQgfT59IFtpbnRlcmZhY2VHdWFyZF1cbiAqL1xuICAgICAgIGNvbnN0IGRlZmVuZFByb3RvdHlwZSA9IChcbiAgdGFnLFxuICBjb250ZXh0UHJvdmlkZXIsXG4gIGJlaGF2aW9yTWV0aG9kcyxcbiAgdGhpc2Z1bE1ldGhvZHMgPSBmYWxzZSxcbiAgaW50ZXJmYWNlR3VhcmQgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgY29uc3QgcHJvdG90eXBlID0ge307XG4gIGNvbnN0IG1ldGhvZE5hbWVzID0gZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMoYmVoYXZpb3JNZXRob2RzKS5maWx0ZXIoXG4gICAgLyogQnkgaWdub3JpbmcgYW55IG1ldGhvZCB0aGF0IHNlZW1zIHRvIGJlIGEgY29uc3RydWN0b3IsIHdlIGNhbiB1c2UgYSovXG4gICAgLyogY2xhc3MucHJvdG90eXBlIGFzIGEgYmVoYXZpb3JNZXRob2RzLiovXG4gICAga2V5ID0+IHtcbiAgICAgIGlmIChrZXkgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IGJlaGF2aW9yTWV0aG9kcy5jb25zdHJ1Y3RvcjtcbiAgICAgIHJldHVybiAhKFxuICAgICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiZcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID09PSBjb25zdHJ1Y3RvclxuICAgICAgKTtcbiAgICB9LFxuICApO1xuICAvKiogQHR5cGUge1JlY29yZDxSZW1vdGFibGVNZXRob2ROYW1lLCBNZXRob2RHdWFyZD4gfCB1bmRlZmluZWR9ICovXG4gIGxldCBtZXRob2RHdWFyZHM7XG4gIC8qKiBAdHlwZSB7RGVmYXVsdEd1YXJkVHlwZX0gKi9cbiAgbGV0IGRlZmF1bHRHdWFyZHM7XG4gIGlmIChpbnRlcmZhY2VHdWFyZCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVyZmFjZU5hbWUsXG4gICAgICBtZXRob2RHdWFyZHM6IG1nLFxuICAgICAgc3ltYm9sTWV0aG9kR3VhcmRzLFxuICAgICAgc2xvcHB5LFxuICAgICAgZGVmYXVsdEd1YXJkczogZGcgPSBzbG9wcHkgPyAncGFzc2FibGUnIDogZGVmYXVsdEd1YXJkcyxcbiAgICB9ID0gZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKGludGVyZmFjZUd1YXJkKTtcbiAgICBtZXRob2RHdWFyZHMgPSBoYXJkZW4oe1xuICAgICAgLi4ubWcsXG4gICAgICAuLi4oc3ltYm9sTWV0aG9kR3VhcmRzICYmXG4gICAgICAgIGZyb21FbnRyaWVzKGdldENvcHlNYXBFbnRyaWVzKHN5bWJvbE1ldGhvZEd1YXJkcykpKSxcbiAgICB9KTtcbiAgICBkZWZhdWx0R3VhcmRzID0gZGc7XG4gICAge1xuICAgICAgY29uc3QgbWV0aG9kR3VhcmROYW1lcyA9IG93bktleXMobWV0aG9kR3VhcmRzKTtcbiAgICAgIGNvbnN0IHVuaW1wbGVtZW50ZWQgPSBsaXN0RGlmZmVyZW5jZShtZXRob2RHdWFyZE5hbWVzLCBtZXRob2ROYW1lcyk7XG4gICAgICB1bmltcGxlbWVudGVkLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICBGYWlsYG1ldGhvZHMgJHtxKHVuaW1wbGVtZW50ZWQpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbiAgICAgIGlmIChkZWZhdWx0R3VhcmRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdW5ndWFyZGVkID0gbGlzdERpZmZlcmVuY2UobWV0aG9kTmFtZXMsIG1ldGhvZEd1YXJkTmFtZXMpO1xuICAgICAgICB1bmd1YXJkZWQubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgRmFpbGBtZXRob2RzICR7cSh1bmd1YXJkZWQpfSBub3QgZ3VhcmRlZCBieSAke3EoaW50ZXJmYWNlTmFtZSl9YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3Agb2YgbWV0aG9kTmFtZXMpIHtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGJlaGF2aW9yTWV0aG9kc1twcm9wXTtcbiAgICBjb25zdCB7IHNoaWZ0ZWRNZXRob2QgfSA9IHtcbiAgICAgIHNoaWZ0ZWRNZXRob2QoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QodGhpcywgLi4uYXJncyk7XG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgYmVoYXZpb3JNZXRob2QgPSB0aGlzZnVsTWV0aG9kcyA/IG9yaWdpbmFsTWV0aG9kIDogc2hpZnRlZE1ldGhvZDtcbiAgICAvKiBUT0RPIHNvbWUgdG9vbCBkb2VzIG5vdCB5ZXQgdW5kZXJzdGFuZCB0aGUgYD8uW2Agc3ludGF4Ki9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMjI0NyNkaXNjdXNzaW9uX3IxNTgzNzI0NDI0Ki9cbiAgICBsZXQgbWV0aG9kR3VhcmQgPSBtZXRob2RHdWFyZHMgJiYgbWV0aG9kR3VhcmRzW3Byb3BdO1xuICAgIGlmICghbWV0aG9kR3VhcmQpIHtcbiAgICAgIHN3aXRjaCAoZGVmYXVsdEd1YXJkcykge1xuICAgICAgICBjYXNlIHVuZGVmaW5lZDoge1xuICAgICAgICAgIGlmICh0aGlzZnVsTWV0aG9kcykge1xuICAgICAgICAgICAgbWV0aG9kR3VhcmQgPSBQYXNzYWJsZU1ldGhvZEd1YXJkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXRob2RHdWFyZCA9IFJhd01ldGhvZEd1YXJkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdwYXNzYWJsZSc6IHtcbiAgICAgICAgICBtZXRob2RHdWFyZCA9IFBhc3NhYmxlTWV0aG9kR3VhcmQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncmF3Jzoge1xuICAgICAgICAgIG1ldGhvZEd1YXJkID0gUmF3TWV0aG9kR3VhcmQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIGRlZmF1bHRHdWFyZHMgJHtxKGRlZmF1bHRHdWFyZHMpfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJvdG90eXBlW3Byb3BdID0gYmluZE1ldGhvZChcbiAgICAgIGBJbiAke3EocHJvcCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG4gICAgICBjb250ZXh0UHJvdmlkZXIsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkLFxuICAgICk7XG4gIH1cblxuICBpZiAoIWhhc093bihwcm90b3R5cGUsIEdFVF9JTlRFUkZBQ0VfR1VBUkQpKSB7XG4gICAgY29uc3QgZ2V0SW50ZXJmYWNlR3VhcmRNZXRob2QgPSB7XG4gICAgICBbR0VUX0lOVEVSRkFDRV9HVUFSRF0oKSB7XG4gICAgICAgIC8qIE5vdGU6IE1heSBiZSBgdW5kZWZpbmVkYCovXG4gICAgICAgIHJldHVybiBpbnRlcmZhY2VHdWFyZDtcbiAgICAgIH0sXG4gICAgfVtHRVRfSU5URVJGQUNFX0dVQVJEXTtcbiAgICBwcm90b3R5cGVbR0VUX0lOVEVSRkFDRV9HVUFSRF0gPSBiaW5kTWV0aG9kKFxuICAgICAgYEluICR7cShHRVRfSU5URVJGQUNFX0dVQVJEKX0gbWV0aG9kIG9mICgke3RhZ30pYCxcbiAgICAgIGNvbnRleHRQcm92aWRlcixcbiAgICAgIGdldEludGVyZmFjZUd1YXJkTWV0aG9kLFxuICAgICAgUGFzc2FibGVNZXRob2RHdWFyZCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIEZhcih0YWcsIC8qKiBAdHlwZSB7VCAmIEdldEludGVyZmFjZUd1YXJkPFQ+fSAqLyAocHJvdG90eXBlKSk7XG59OyRozY9fb25jZS5kZWZlbmRQcm90b3R5cGUoZGVmZW5kUHJvdG90eXBlKTtcbmhhcmRlbihkZWZlbmRQcm90b3R5cGUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPEZhY2V0TmFtZSwgTWV0aG9kcz59IEZcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7eyBbSyBpbiBrZXlvZiBGXTogS2l0Q29udGV4dFByb3ZpZGVyIH19IGNvbnRleHRQcm92aWRlcktpdFxuICogQHBhcmFtIHtGfSBiZWhhdmlvck1ldGhvZHNLaXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHt7IFtLIGluIGtleW9mIEZdOiBJbnRlcmZhY2VHdWFyZDxSZWNvcmQ8a2V5b2YgRltLXSwgTWV0aG9kR3VhcmQ+PiB9fSBbaW50ZXJmYWNlR3VhcmRLaXRdXG4gKi9cbiAgICAgICBjb25zdCBkZWZlbmRQcm90b3R5cGVLaXQgPSAoXG4gIHRhZyxcbiAgY29udGV4dFByb3ZpZGVyS2l0LFxuICBiZWhhdmlvck1ldGhvZHNLaXQsXG4gIHRoaXNmdWxNZXRob2RzID0gZmFsc2UsXG4gIGludGVyZmFjZUd1YXJkS2l0ID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGNvbnN0IGZhY2V0TmFtZXMgPSBvd25LZXlzKGJlaGF2aW9yTWV0aG9kc0tpdCkuc29ydCgpO1xuICBmYWNldE5hbWVzLmxlbmd0aCA+IDEgfHwgRmFpbGBBIG11bHRpLWZhY2V0IG9iamVjdCBtdXN0IGhhdmUgbXVsdGlwbGUgZmFjZXRzYDtcbiAgaWYgKGludGVyZmFjZUd1YXJkS2l0KSB7XG4gICAgY29uc3QgaW50ZXJmYWNlTmFtZXMgPSBvd25LZXlzKGludGVyZmFjZUd1YXJkS2l0KTtcbiAgICBjb25zdCBleHRyYUludGVyZmFjZU5hbWVzID0gbGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcywgaW50ZXJmYWNlTmFtZXMpO1xuICAgIGV4dHJhSW50ZXJmYWNlTmFtZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICBGYWlsYEludGVyZmFjZXMgJHtxKGV4dHJhSW50ZXJmYWNlTmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbiAgICBjb25zdCBleHRyYUZhY2V0TmFtZXMgPSBsaXN0RGlmZmVyZW5jZShpbnRlcmZhY2VOYW1lcywgZmFjZXROYW1lcyk7XG4gICAgZXh0cmFGYWNldE5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBub3QgZ3VhcmRlZCBieSBpbnRlcmZhY2VzYDtcbiAgfVxuICBjb25zdCBjb250ZXh0TWFwTmFtZXMgPSBvd25LZXlzKGNvbnRleHRQcm92aWRlcktpdCk7XG4gIGNvbnN0IGV4dHJhQ29udGV4dE5hbWVzID0gbGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcywgY29udGV4dE1hcE5hbWVzKTtcbiAgZXh0cmFDb250ZXh0TmFtZXMubGVuZ3RoID09PSAwIHx8XG4gICAgRmFpbGBDb250ZXh0cyAke3EoZXh0cmFDb250ZXh0TmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbiAgY29uc3QgZXh0cmFGYWNldE5hbWVzID0gbGlzdERpZmZlcmVuY2UoY29udGV4dE1hcE5hbWVzLCBmYWNldE5hbWVzKTtcbiAgZXh0cmFGYWNldE5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbWlzc2luZyBjb250ZXh0c2A7XG4gIGNvbnN0IHByb3RvS2l0ID0gb2JqZWN0TWFwKGJlaGF2aW9yTWV0aG9kc0tpdCwgKGJlaGF2aW9yTWV0aG9kcywgZmFjZXROYW1lKSA9PlxuICAgIGRlZmVuZFByb3RvdHlwZShcbiAgICAgIGAke3RhZ30gJHtTdHJpbmcoZmFjZXROYW1lKX1gLFxuICAgICAgY29udGV4dFByb3ZpZGVyS2l0W2ZhY2V0TmFtZV0sXG4gICAgICBiZWhhdmlvck1ldGhvZHMsXG4gICAgICB0aGlzZnVsTWV0aG9kcyxcbiAgICAgIGludGVyZmFjZUd1YXJkS2l0ICYmIGludGVyZmFjZUd1YXJkS2l0W2ZhY2V0TmFtZV0sXG4gICAgKSxcbiAgKTtcbiAgcmV0dXJuIHByb3RvS2l0O1xufTskaM2PX29uY2UuZGVmZW5kUHJvdG90eXBlS2l0KGRlZmVuZFByb3RvdHlwZUtpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZlbmRQcm90b3R5cGUiOlsiZGVmZW5kUHJvdG90eXBlIl0sImRlZmVuZFByb3RvdHlwZUtpdCI6WyJkZWZlbmRQcm90b3R5cGVLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAySXaNgsFAAALBQAAJgAAAEBlbmRvL2V4by12MS41LjEyL3NyYy9nZXQtaW50ZXJmYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJHRVRfSU5URVJGQUNFX0dVQVJEIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogQGltcG9ydCB7UmVtb3RhYmxlTWV0aG9kTmFtZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKi9cblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgYXV0b21hdGljYWxseSBhZGRlZCBkZWZhdWx0IG1ldGEtbWV0aG9kIGZvclxuICogb2J0YWluaW5nIGFuIGV4bydzIGludGVyZmFjZSwgaWYgaXQgaGFzIG9uZS5cbiAqXG4gKiBJbnRlbmRlZCB0byBiZSBzaW1pbGFyIHRvIGBHRVRfTUVUSE9EX05BTUVTYCBmcm9tIGBAZW5kby9wYXNzLXN0eWxlYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTgwOSNkaXNjdXNzaW9uX3IxMzg4MDUyNDU0XG4gKlxuICogQmV3YXJlIHRoYXQgYW4gZXhvJ3MgaW50ZXJmYWNlIGNhbiBjaGFuZ2UgYWNyb3NzIGFuIHVwZ3JhZGUsXG4gKiBzbyByZW1vdGVzIHRoYXQgY2FjaGUgaXQgY2FuIGJlY29tZSBzdGFsZS5cbiAqL1xuICAgICAgIGNvbnN0IEdFVF9JTlRFUkZBQ0VfR1VBUkQgPSAnX19nZXRJbnRlcmZhY2VHdWFyZF9fJztcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxSZW1vdGFibGVNZXRob2ROYW1lLCBDYWxsYWJsZUZ1bmN0aW9uPn0gTVxuICogQHR5cGVkZWYge3tcbiAqICAgW0dFVF9JTlRFUkZBQ0VfR1VBUkRdPzogKCkgPT5cbiAqICAgICBJTVBPUlQoJ0BlbmRvL3BhdHRlcm5zJykuSW50ZXJmYWNlR3VhcmQ8e1xuICogICAgICAgW0sgaW4ga2V5b2YgTV06IElNUE9SVCgnQGVuZG8vcGF0dGVybnMnKS5NZXRob2RHdWFyZFxuICogICAgIH0+IHwgdW5kZWZpbmVkXG4gKiB9fSBHZXRJbnRlcmZhY2VHdWFyZFxuICovJGjNj19vbmNlLkdFVF9JTlRFUkZBQ0VfR1VBUkQoR0VUX0lOVEVSRkFDRV9HVUFSRCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJHRVRfSU5URVJGQUNFX0dVQVJEIjpbIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAHgAAAEBlbmRvL2V4by12MS41LjEyL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAgAAAAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqSbWUJgCAACYAgAAHgAAAEBlbmRvL2Zhci12MS4xLjE0L3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZXhwb3J0cy5qcyJdLCJleHBvcnRzIjpbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dLFtcIi4vZXhwb3J0cy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBlbmRvL2V2ZW50dWFsLXNlbmQiOltbIkUiLCJFIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJGYXIiLCJGYXIiXSxbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXSxbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHVGf9kHCAAABwgAAB0AAABAZW5kby9tYXJzaGFsLXYxLjguMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVCeUNvZGVQb2ludHMiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIiwicGFzc2FibGVBc0p1c3RpbiIsInBhc3NhYmxlQXNKdXN0aW4iLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3JhbmtPcmRlci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXSxbInBhc3NhYmxlQXNKdXN0aW4iLCJwYXNzYWJsZUFzSnVzdGluIl0sWyJxcCIsInFwIl1dLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6W1sibWFrZVBhc3NhYmxlS2l0IiwibWFrZVBhc3NhYmxlS2l0Il0sWyJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiXSxbIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSJdLFsiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNFbmNvZGVkUmVtb3RhYmxlIl0sWyJ6ZXJvUGFkIiwiemVyb1BhZCJdLFsicmVjb3JkTmFtZXMiLCJyZWNvcmROYW1lcyJdLFsicmVjb3JkVmFsdWVzIiwicmVjb3JkVmFsdWVzIl1dLCIuL3NyYy9yYW5rT3JkZXIuanMiOltbImNvbXBhcmVOdW1lcmljcyIsImNvbXBhcmVOdW1lcmljcyJdLFsiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVCeUNvZGVQb2ludHMiXSxbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIl0sWyJjb21wYXJlUmFuayIsImNvbXBhcmVSYW5rIl0sWyJpc1JhbmtTb3J0ZWQiLCJpc1JhbmtTb3J0ZWQiXSxbInNvcnRCeVJhbmsiLCJzb3J0QnlSYW5rIl0sWyJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlQW50aVJhbmsiXSxbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXSxbImdldFBhc3NTdHlsZUNvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiXSxbImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sWyJ1bmlvblJhbmtDb3ZlcnMiLCJ1bmlvblJhbmtDb3ZlcnMiXV0sIkBlbmRvL3Bhc3Mtc3R5bGUiOltbImRlZXBseUZ1bGZpbGxlZCIsImRlZXBseUZ1bGZpbGxlZCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYL9qqMl9AADJfQAAKgAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVQYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZVBhc3NhYmxlS2l0IiwicGFzc1N0eWxlUHJlZml4ZXMiLCJyZWNvcmROYW1lcyIsInJlY29yZFZhbHVlcyIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixhc3NlcnRSZWNvcmQsaXNFcnJvckxpa2UsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxiLHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcImJcIixbJGjNj19hID0+IChiID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgZnJvbUVudHJpZXMsIGlzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4Ki9cbmNvbnN0IHJDMCA9IC9bXFx4MDAtXFx4MUZdLztcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHN1ZmZpeCBvZiBhIHN0cmluZyBzdGFydGluZyBhdCBhIHBhcnRpY3VsYXIgaW5kZXguXG4gKiBUaGlzIGJvdGggZXhwcmVzc2VzIGludGVudCBhbmQgcG90ZW50aWFsbHkgYXZvaWRzIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGdldFN1ZmZpeCA9IChzdHIsIGluZGV4KSA9PiAoaW5kZXggPT09IDAgPyBzdHIgOiBzdHIuc3Vic3RyaW5nKGluZGV4KSk7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQsIHdlIGhhdmUgb25seVxuICogc3RyaW5nLW5hbWVkIG93biBwcm9wZXJ0aWVzLiBgcmVjb3JkTmFtZXNgIHJldHVybnMgdGhvc2UgbmFtZSAqcmV2ZXJzZSpcbiAqIHNvcnRlZCwgYmVjYXVzZSB0aGF0J3MgaG93IHJlY29yZHMgYXJlIGNvbXBhcmVkLCBlbmNvZGVkLCBhbmQgc29ydGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbiAgICAgICBjb25zdCByZWNvcmROYW1lcyA9IHJlY29yZCA9PlxuICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjEwMDM2NTcyNDQqL1xuICAvKiBjb21wYXJlcyB0d28gd2F5cyBvZiByZXZlcnNlIHNvcnRpbmcsIGFuZCBzaG93cyB0aGF0IGAuc29ydCgpLnJldmVyc2UoKWAqL1xuICAvKiBpcyBjdXJyZW50bHkgZmFzdGVyIG9uIE1vZGRhYmxlIFhTLCB3aGlsZSB0aGUgb3RoZXIgd2F5LCovXG4gIC8qIGAuc29ydChyZXZlcnNlQ29tcGFyYXRvcilgLCBpcyBmYXN0ZXIgb24gdjguIFdlIGN1cnJlbnRseSBjYXJlIG1vcmUgYWJvdXQqL1xuICAvKiBYUyBwZXJmb3JtYW5jZSwgc28gd2UgcmV2ZXJzZSBzb3J0IHVzaW5nIGAuc29ydCgpLnJldmVyc2UoKWAuKi9cbiAgaGFyZGVuKC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChvd25LZXlzKHJlY29yZCkpLnNvcnQoKS5yZXZlcnNlKCkpOyRozY9fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5oYXJkZW4ocmVjb3JkTmFtZXMpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkIGFuZCBgbmFtZXNgIGlzIGByZWNvcmROYW1lcyhyZWNvcmQpYCxcbiAqIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG4gICAgICAgY29uc3QgcmVjb3JkVmFsdWVzID0gKHJlY29yZCwgbmFtZXMpID0+XG4gIGhhcmRlbihuYW1lcy5tYXAobmFtZSA9PiByZWNvcmRbbmFtZV0pKTskaM2PX29uY2UucmVjb3JkVmFsdWVzKHJlY29yZFZhbHVlcyk7XG5oYXJkZW4ocmVjb3JkVmFsdWVzKTtcblxuY29uc3QgemVyb2VzID0gQXJyYXkoMTYpXG4gIC5maWxsKHVuZGVmaW5lZClcbiAgLm1hcCgoXywgaSkgPT4gJzAnLnJlcGVhdChpKSk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBuXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuICAgICAgIGNvbnN0IHplcm9QYWQgPSAobiwgc2l6ZSkgPT4ge1xuICBjb25zdCBuU3RyID0gYCR7bn1gO1xuICBjb25zdCBmaWxsTGVuID0gc2l6ZSAtIG5TdHIubGVuZ3RoO1xuICBpZiAoZmlsbExlbiA9PT0gMCkgcmV0dXJuIG5TdHI7XG4gIGFzc2VydChmaWxsTGVuID4gMCAmJiBmaWxsTGVuIDwgemVyb2VzLmxlbmd0aCk7XG4gIHJldHVybiBgJHt6ZXJvZXNbZmlsbExlbl19JHtuU3RyfWA7XG59OyRozY9fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vKiBUaGlzIGlzIHRoZSBKYXZhU2NyaXB0IGFuYWxvZyB0byBhIEMgdW5pb246IGEgd2F5IHRvIG1hcCBiZXR3ZWVuIGEgZmxvYXQgYXMgYSovXG4vKiBudW1iZXIgYW5kIHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBmbG9hdCBhcyBhIGJ1ZmZlciBmdWxsIG9mIGJ5dGVzLiAgTm90ZSovXG4vKiB0aGF0IHRoZSBtdXRhdGlvbiBvZiBzdGF0aWMgc3RhdGUgaGVyZSBtYWtlcyB0aGlzIGludmFsaWQgSmVzc2llIGNvZGUsIGJ1dCovXG4vKiBkb2luZyBpdCB0aGlzIHdheSBzYXZlcyB0aGUgbnVnYXRvcnkgYW5kIGdyYXR1aXRvdXMgYWxsb2NhdGlvbnMgdGhhdCB3b3VsZCovXG4vKiBoYXBwZW4gZXZlcnkgdGltZSB5b3UgZG8gYSBjb252ZXJzaW9uIC0tIGFuZCBpbiBwcmFjdGljYWwgdGVybXMgaXQncyBzYWZlKi9cbi8qIGJlY2F1c2Ugd2UgcHV0IHRoZSB2YWx1ZSBpbiBvbmUgc2lkZSBhbmQgdGhlbiBpbW1lZGlhdGVseSB0YWtlIGl0IG91dCB0aGUqL1xuLyogb3RoZXI7IHRoZXJlIGlzIG5vIGFjdHVhbCBzdGF0ZSByZXRhaW5lZCBpbiB0aGUgY2xhc3NpYyBzZW5zZSBhbmQgdGh1cyBubyovXG4vKiByZS1lbnRyYW5jeSBpc3N1ZS4qL1xuY29uc3QgYXNOdW1iZXIgPSBuZXcgRmxvYXQ2NEFycmF5KDEpO1xuY29uc3QgYXNCaXRzID0gbmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8qIEphdmFTY3JpcHQgbnVtYmVycyBhcmUgZW5jb2RlZCBieSBvdXRwdXR0aW5nIHRoZSBiYXNlLTE2Ki9cbi8qIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgSUVFRSBmbG9hdGluZyBwb2ludCovXG4vKiByZXByZXNlbnRhdGlvbi4gIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFsbCBiaXRzIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gYXJlKi9cbi8qIGNvbXBsZW1lbnRlZCBwcmlvciB0byB0aGUgYmFzZS0xNiBjb252ZXJzaW9uLCB3aGlsZSBmb3IgcG9zaXRpdmUgdmFsdWVzLCB0aGUqL1xuLyogc2lnbiBiaXQgaXMgY29tcGxlbWVudGVkLiAgVGhpcyBlbnN1cmVzIGJvdGggdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBiZWZvcmUqL1xuLyogcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGFjY29yZGluZyB0byB0aGVpciBuZWdhdGl2ZSovXG4vKiBtYWduaXR1ZGUgcmF0aGVyIHRoYW4gdGhlaXIgcG9zaXRpdmUgbWFnbml0dWRlLiAgVGhpcyByZXN1bHRzIGluIGFuIEFTQ0lJKi9cbi8qIGVuY29kaW5nIHdob3NlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtZXJpYyBzb3J0IG9yZGVyKi9cbi8qIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMuKi9cblxuLyogVE9ETyBDaG9vc2UgdGhlIHNhbWUgY2Fub25pY2FsIE5hTiBlbmNvZGluZyB0aGF0IGNvc21XYXNtIGFuZCBld2FzbSBjaG9zZS4qL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cyA9ICdmZmY4MDAwMDAwMDAwMDAwJztcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmluYXJ5NjQgPSBuID0+IHtcbiAgLyogTm9ybWFsaXplIC0wIHRvIDAgYW5kIE5hTiB0byBhIGNhbm9uaWNhbCBlbmNvZGluZyovXG4gIGlmIChpcyhuLCAtMCkpIHtcbiAgICBuID0gMDtcbiAgfSBlbHNlIGlmIChpcyhuLCBOYU4pKSB7XG4gICAgcmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gIH1cbiAgYXNOdW1iZXJbMF0gPSBuO1xuICBsZXQgYml0cyA9IGFzQml0c1swXTtcbiAgaWYgKG4gPCAwKSB7XG4gICAgYml0cyBePSAweGZmZmZmZmZmZmZmZmZmZmZuO1xuICB9IGVsc2Uge1xuICAgIGJpdHMgXj0gMHg4MDAwMDAwMDAwMDAwMDAwbjtcbiAgfVxuICByZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksIDE2KX1gO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHBhcmFtIHtudW1iZXJ9IFtza2lwXVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlQmluYXJ5NjQgPSAoZW5jb2RlZCwgc2tpcCA9IDApID0+IHtcbiAgZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICdmJyB8fCBGYWlsYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IGJpdHMgPSBCaWdJbnQoYDB4JHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpfWApO1xuICBpZiAoZW5jb2RlZC5jaGFyQXQoc2tpcCArIDEpIDwgJzgnKSB7XG4gICAgYml0cyBePSAweGZmZmZmZmZmZmZmZmZmZmZuO1xuICB9IGVsc2Uge1xuICAgIGJpdHMgXj0gMHg4MDAwMDAwMDAwMDAwMDAwbjtcbiAgfVxuICBhc0JpdHNbMF0gPSBiaXRzO1xuICBjb25zdCByZXN1bHQgPSBhc051bWJlclswXTtcbiAgIWlzKHJlc3VsdCwgLTApIHx8XG4gICAgRmFpbGBVbmV4cGVjdGVkIG5lZ2F0aXZlIHplcm86ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEVuY29kZSBhIEphdmFTY3JpcHQgYmlnaW50IHVzaW5nIGEgdmFyaWFudCBvZiBFbGlhcyBkZWx0YSBjb2RpbmcsIHdpdGggYW5cbiAqIGluaXRpYWwgY29tcG9uZW50IGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBkaWdpdCBjb3VudCBhcyBhIHVuYXJ5IHN0cmluZywgYVxuICogc2Vjb25kIGNvbXBvbmVudCBmb3IgdGhlIGRlY2ltYWwgZGlnaXQgY291bnQsIGFuZCBhIHRoaXJkIGNvbXBvbmVudCBmb3IgdGhlXG4gKiBkZWNpbWFsIGRpZ2l0cyBwcmVjZWRlZCBieSBhIGdyYXR1aXRvdXMgc2VwYXJhdGluZyBjb2xvbi5cbiAqIFRvIGVuc3VyZSB0aGF0IHRoZSBsZXhpY29ncmFwaGljIHNvcnQgb3JkZXIgb2YgZW5jb2RlZCB2YWx1ZXMgbWF0Y2hlcyB0aGVcbiAqIG51bWVyaWMgc29ydCBvcmRlciBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLCB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5hcnlcbiAqIHByZWZpeCBhcmUgZGlmZmVyZW50IGZvciBuZWdhdGl2ZSB2YWx1ZXMgKHR5cGUgXCJuXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZlxuICogXCIjXCJzIFt3aGljaCBzb3J0IGJlZm9yZSBkZWNpbWFsIGRpZ2l0c10pIHZzLiBwb3NpdGl2ZSBhbmQgemVybyB2YWx1ZXMgKHR5cGVcbiAqIFwicFwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgXCJ+XCJzIFt3aGljaCBzb3J0IGFmdGVyIGRlY2ltYWwgZGlnaXRzXSkgYW5kXG4gKiBlYWNoIGRlY2ltYWwgZGlnaXQgb2YgdGhlIGVuY29kaW5nIGZvciBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggaXRzXG4gKiB0ZW4ncyBjb21wbGVtZW50IChzbyB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBvZiB0aGUgc2FtZSBzY2FsZSBzb3J0IGJ5XG4gKiAqZGVzY2VuZGluZyogYWJzb2x1dGUgdmFsdWUpLlxuICpcbiAqIEBwYXJhbSB7YmlnaW50fSBuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVCaWdJbnQgPSBuID0+IHtcbiAgY29uc3QgYWJzID0gbiA8IDBuID8gLW4gOiBuO1xuICBjb25zdCBuRGlnaXRzID0gYWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuICBjb25zdCBsRGlnaXRzID0gbkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbiAgaWYgKG4gPCAwbikge1xuICAgIHJldHVybiBgbiR7XG4gICAgICAvKiBBIFwiI1wiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuICAgICAgLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuICAgICAgJyMnLnJlcGVhdChsRGlnaXRzIC0gMSlcbiAgICB9JHtcbiAgICAgIC8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbiAgICAgICgxMCAqKiBsRGlnaXRzIC0gbkRpZ2l0cykudG9TdHJpbmcoKS5wYWRTdGFydChsRGlnaXRzLCAnMCcpXG4gICAgfToke1xuICAgICAgLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGRpZ2l0cy4qL1xuICAgICAgKDEwbiAqKiBCaWdJbnQobkRpZ2l0cykgKyBuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsICcwJylcbiAgICB9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYHAke1xuICAgICAgLyogQSBcIn5cIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbiAgICAgIC8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbiAgICAgICd+Jy5yZXBlYXQobERpZ2l0cyAtIDEpXG4gICAgfSR7XG4gICAgICAvKiBUaGUgY291bnQgb2YgZGlnaXRzLiovXG4gICAgICBuRGlnaXRzXG4gICAgfToke1xuICAgICAgLyogVGhlIGRpZ2l0cy4qL1xuICAgICAgblxuICAgIH1gO1xuICB9XG59O1xuXG5jb25zdCByQmlnSW50UGF5bG9hZCA9IC8oWzAtOV0rKSg6KFswLTldKyR8KXwpL3M7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmNvbnN0IGRlY29kZUJpZ0ludCA9IGVuY29kZWQgPT4ge1xuICBjb25zdCB0eXBlUHJlZml4ID0gZW5jb2RlZC5jaGFyQXQoMCk7IC8qIGZhc3RlciB0aGFuIGVuY29kZWRbMF0qL1xuICB0eXBlUHJlZml4ID09PSAncCcgfHxcbiAgICB0eXBlUHJlZml4ID09PSAnbicgfHxcbiAgICBGYWlsYEVuY29kZWQgYmlnaW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuICBjb25zdCB7XG4gICAgaW5kZXg6IGxEaWdpdHMsXG4gICAgMTogc25EaWdpdHMsXG4gICAgMjogdGFpbCxcbiAgICAzOiBkaWdpdHMsXG4gIH0gPSBlbmNvZGVkLm1hdGNoKHJCaWdJbnRQYXlsb2FkKSB8fCBGYWlsYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuICBzbkRpZ2l0cy5sZW5ndGggPT09IGxEaWdpdHMgfHxcbiAgICBGYWlsYFVuYXJ5LXByZWZpeGVkIGRlY2ltYWwgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgbkRpZ2l0cyA9IHBhcnNlSW50KHNuRGlnaXRzLCAxMCk7XG4gIGlmICh0eXBlUHJlZml4ID09PSAnbicpIHtcbiAgICAvKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4gICAgLyogbGlrZSBcIm4wOlwiIGFuZCBcIm4wMDrigKZcIiBhbmQgXCJuOTE64oCmXCIgdGhyb3VnaCBcIm45OTrigKZcIj8qL1xuICAgIG5EaWdpdHMgPSAxMCAqKiAvKiogQHR5cGUge251bWJlcn0gKi8gKGxEaWdpdHMpIC0gbkRpZ2l0cztcbiAgfVxuXG4gIHRhaWwuY2hhckF0KDApID09PSAnOicgfHwgRmFpbGBTZXBhcmF0b3IgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBkaWdpdHMubGVuZ3RoID09PSBuRGlnaXRzIHx8XG4gICAgRmFpbGBGaXhlZC1sZW5ndGggZGlnaXQgc2VxdWVuY2UgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgbiA9IEJpZ0ludChkaWdpdHMpO1xuICBpZiAodHlwZVByZWZpeCA9PT0gJ24nKSB7XG4gICAgLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuICAgIC8qIGxpa2UgXCJuOTowXCIgYW5kIFwibjg6MDBcIiBhbmQgXCJuODo5MVwiIHRocm91Z2ggXCJuODo5OVwiPyovXG4gICAgbiA9IC0oMTBuICoqIEJpZ0ludChuRGlnaXRzKSAtIG4pO1xuICB9XG5cbiAgcmV0dXJuIG47XG59O1xuXG4vKipcbiAqIEEgc3BhcnNlIGFycmF5IGZvciB3aGljaCBldmVyeSBwcmVzZW50IGluZGV4IG1hcHMgYSBjb2RlIHBvaW50IGluIHRoZSBBU0NJSVxuICogcmFuZ2UgdG8gYSBjb3JyZXNwb25kaW5nIGVzY2FwZSBzZXF1ZW5jZS5cbiAqXG4gKiBFc2NhcGVzIGFsbCBjaGFyYWN0ZXJzIGZyb20gVSswMDAwIE5VTEwgdG8gVSswMDFGIElORk9STUFUSU9OIFNFUEFSQVRPUiBPTkVcbiAqIGxpa2UgYCE8Y2hhcmFjdGVyIG9mZnNldCBieSAweDIxPmAgdG8gYXZvaWQgSlNPTi5zdHJpbmdpZnkgZXhwYW5zaW9uIGFzXG4gKiBgXFx1SEhISGAsIGFuZCBzcGVjaWFsbHkgZXNjYXBlcyBVKzAwMjAgU1BBQ0UgKHRoZSBhcnJheSBlbGVtZW50IHRlcm1pbmF0b3IpXG4gKiBhcyBgIV9gIGFuZCBVKzAwMjEgRVhDTEFNQVRJT04gTUFSSyAodGhlIGVzY2FwZSBwcmVmaXgpIGFzIGAhfGAgKGJvdGggY2hvc2VuXG4gKiBmb3IgdmlzdWFsIGFwcHJveGltYXRpb24pLlxuICogUmVsYXRpdmUgbGV4aWNvZ3JhcGhpYyBvcmRlcmluZyBpcyBwcmVzZXJ2ZWQgYnkgdGhpcyBtYXBwaW5nIG9mIGFueSBjaGFyYWN0ZXJcbiAqIGF0IG9yIGJlZm9yZSBgIWAgaW4gdGhlIGNvbnRpZ3VvdXMgcmFuZ2UgWzB4MDAuLjB4MjFdIHRvIGEgcmVzcGVjdGl2ZVxuICogY2hhcmFjdGVyIGluIFsweDIxLi4weDQwLCAweDVGLCAweDdDXSBwcmVjZWRlZCBieSBgIWAgKHdoaWNoIGlzIGl0c2VsZiBpbiB0aGVcbiAqIHJlcGxhY2VkIHJhbmdlKS5cbiAqIFNpbWlsYXJseSwgZXNjYXBlcyBgXmAgYXMgYF9AYCBhbmQgYF9gIGFzIGBfX2AgYmVjYXVzZSBgXmAgaW5kaWNhdGVzIHRoZVxuICogc3RhcnQgb2YgYW4gZW5jb2RlZCBhcnJheS5cbiAqXG4gKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAqL1xuY29uc3Qgc3RyaW5nRXNjYXBlcyA9IEFycmF5KDB4MjIpXG4gIC5maWxsKHVuZGVmaW5lZClcbiAgLm1hcCgoXywgY3ApID0+IHtcbiAgICBzd2l0Y2ggKFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApKSB7XG4gICAgICBjYXNlICcgJzpcbiAgICAgICAgcmV0dXJuICchXyc7XG4gICAgICBjYXNlICchJzpcbiAgICAgICAgcmV0dXJuICchfCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYCEke1N0cmluZy5mcm9tQ2hhckNvZGUoY3AgKyAweDIxKX1gO1xuICAgIH1cbiAgfSk7XG5zdHJpbmdFc2NhcGVzWydeJy5jaGFyQ29kZUF0KDApXSA9ICdfQCc7XG5zdHJpbmdFc2NhcGVzWydfJy5jaGFyQ29kZUF0KDApXSA9ICdfXyc7XG5cbi8qKlxuICogRW5jb2RlcyBhIHN0cmluZyB3aXRoIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIHVzZSBpbiB0aGUgXCJjb21wYWN0T3JkZXJlZFwiIGZvcm1hdC5cbiAqXG4gKiBAdHlwZSB7KHN0cjogc3RyaW5nKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RTdHJpbmdTdWZmaXggPSBzdHIgPT5cbiAgc3RyLnJlcGxhY2UoL1tcXDAtIV5fXS9nLCBjaCA9PiBzdHJpbmdFc2NhcGVzW2NoLmNoYXJDb2RlQXQoMCldKTtcblxuLyoqXG4gKiBEZWNvZGVzIGEgc3RyaW5nIGZyb20gdGhlIFwiY29tcGFjdE9yZGVyZWRcIiBmb3JtYXQuXG4gKlxuICogQHR5cGUgeyhlbmNvZGVkOiBzdHJpbmcpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCA9IGVuY29kZWQgPT4ge1xuICByZXR1cm4gZW5jb2RlZC5yZXBsYWNlKC8oW1xcMC0hX10pKC58XFxuKT8vZywgKGVzYywgcHJlZml4LCBzdWZmaXgpID0+IHtcbiAgICBzd2l0Y2ggKGVzYykge1xuICAgICAgY2FzZSAnIV8nOlxuICAgICAgICByZXR1cm4gJyAnO1xuICAgICAgY2FzZSAnIXwnOlxuICAgICAgICByZXR1cm4gJyEnO1xuICAgICAgY2FzZSAnX0AnOlxuICAgICAgICByZXR1cm4gJ14nO1xuICAgICAgY2FzZSAnX18nOlxuICAgICAgICByZXR1cm4gJ18nO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBjaCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc3VmZml4KTtcbiAgICAgICAgLyogVGhlIHJhbmdlIG9mIHZhbGlkIGAhYC1lc2NhcGUgc3VmZml4ZXMgaXMgWygweDAwKzB4MjEpLi4oMHgxRisweDIxKV0sIGkuZS4qL1xuICAgICAgICAvKiBbMHgyMS4uMHg0MF0gKFUrMDAyMSBFWENMQU1BVElPTiBNQVJLIHRvIFUrMDA0MCBDT01NRVJDSUFMIEFUKS4qL1xuICAgICAgICAocHJlZml4ID09PSAnIScgJiYgc3VmZml4ICE9PSB1bmRlZmluZWQgJiYgY2ggPj0gJyEnICYmIGNoIDw9ICdAJykgfHxcbiAgICAgICAgICBGYWlsYGludmFsaWQgc3RyaW5nIGVzY2FwZTogJHtxKGVzYyl9YDtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2guY2hhckNvZGVBdCgwKSAtIDB4MjEpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIFRyaXZpYWxseSBpZGVudGl0eS1lbmNvZGVzIGEgc3RyaW5nIGZvciB1c2UgaW4gdGhlIFwibGVnYWN5T3JkZXJlZFwiIGZvcm1hdC5cbiAqXG4gKiBAdHlwZSB7KHN0cjogc3RyaW5nKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCA9IHN0ciA9PiBzdHI7XG5cbi8qKlxuICogVHJpdmlhbGx5IGlkZW50aXR5LWRlY29kZXMgYSBzdHJpbmcgZnJvbSB0aGUgXCJsZWdhY3lPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCA9IGVuY29kZWQgPT4gZW5jb2RlZDtcblxuLyoqXG4gKiBFbmNvZGVzIGFuIGFycmF5IGludG8gYSBzZXF1ZW5jZSBvZiBlbmNvZGVkIGVsZW1lbnRzIGZvciB1c2UgaW4gdGhlIFwiY29tcGFjdE9yZGVyZWRcIlxuICogZm9ybWF0LCBlYWNoIHRlcm1pbmF0ZWQgYnkgYSBzcGFjZSAod2hpY2ggaXMgcGFydCBvZiB0aGUgZXNjYXBlZCByYW5nZSBpblxuICogXCJjb21wYWN0T3JkZXJlZFwiIGVuY29kZWQgc3RyaW5ncykuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBhcnJheVxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHN0cmluZ30gZW5jb2RlUGFzc2FibGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RBcnJheSA9IChhcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgY2hhcnMgPSBbJ14nXTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFycmF5KSB7XG4gICAgY29uc3QgZW5jID0gZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG4gICAgY2hhcnMucHVzaChlbmMsICcgJyk7XG4gIH1cbiAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX0gZGVjb2RlUGFzc2FibGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuY29uc3QgZGVjb2RlQ29tcGFjdEFycmF5ID0gKGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICBsZXQgZGVwdGggPSAwO1xuICAvKiBTY2FuIGVuY29kZWQgcmF0aGVyIHRoYW4gaXRzIHRhaWwgdG8gYXZvaWQgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy4qL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xuICBsZXQgbmV4dEluZGV4ID0gc2tpcCArIDE7XG4gIGxldCBjdXJyZW50RWxlbWVudFN0YXJ0ID0gc2tpcCArIDE7XG4gIGZvciAoY29uc3QgeyAwOiBjaCwgaW5kZXg6IGkgfSBvZiBlbmNvZGVkLm1hdGNoQWxsKC9bXFxeIF0vZykpIHtcbiAgICBjb25zdCBpbmRleCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoaSk7XG4gICAgaWYgKGluZGV4IDw9IHNraXApIHtcbiAgICAgIGlmIChpbmRleCA9PT0gc2tpcCkge1xuICAgICAgICBjaCA9PT0gJ14nIHx8IEZhaWxgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoID09PSAnXicpIHtcbiAgICAgIC8qIFRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbmVzdGVkIGFycmF5LiovXG4gICAgICAvKiBUT0RPOiBTaW5jZSB0aGUgc3ludGF4IG9mIG5lc3RlZCBhcnJheXMgbXVzdCBiZSB2YWxpZGF0ZWQgYXMgcGFydCBvZiovXG4gICAgICAvKiBkZWNvZGluZyB0aGUgb3V0ZXIgb25lLCBjb25zaWRlciBkZWNvZGluZyB0aGVtIGhlcmUgaW50byBhIHNoYXJlZCBjYWNoZSovXG4gICAgICAvKiByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIGNvbnRlbnRzIHVudGlsIHRoZSBsYXRlciovXG4gICAgICAvKiBkZWNvZGVQYXNzYWJsZS4qL1xuICAgICAgZGVwdGggKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogVGhpcyBpcyBhIHRlcm1pbmF0ZWQgZWxlbWVudC4qL1xuICAgICAgaWYgKGluZGV4ID09PSBuZXh0SW5kZXgpIHtcbiAgICAgICAgLyogQSB0ZXJtaW5hdG9yIGFmdGVyIGBbYCBvciBhbiBhbm90aGVyIHRlcm1pbmF0b3IgaW5kaWNhdGVzIHRoYXQgYW4gYXJyYXkgaXMgZG9uZS4qL1xuICAgICAgICBkZXB0aCAtPSAxO1xuICAgICAgICBkZXB0aCA+PSAwIHx8XG4gICAgICAgICAgLyogcHJldHRpZXItaWdub3JlKi9cbiAgICAgICAgICBGYWlsYHVuZXhwZWN0ZWQgYXJyYXkgZWxlbWVudCB0ZXJtaW5hdG9yOiAke2VuY29kZWQuc2xpY2Uoc2tpcCwgaW5kZXggKyAyKX1gO1xuICAgICAgfVxuICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgIC8qIFdlIGhhdmUgYSBjb21wbGV0ZSBlbGVtZW50IG9mIHRoZSB0b3Btb3N0IGFycmF5LiovXG4gICAgICAgIGVsZW1lbnRzLnB1c2goXG4gICAgICAgICAgZGVjb2RlUGFzc2FibGUoZW5jb2RlZC5zbGljZShjdXJyZW50RWxlbWVudFN0YXJ0LCBpbmRleCkpLFxuICAgICAgICApO1xuICAgICAgICBjdXJyZW50RWxlbWVudFN0YXJ0ID0gaW5kZXggKyAxO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBBZHZhbmNlIHRoZSBpbmRleC4qL1xuICAgIG5leHRJbmRleCA9IGluZGV4ICsgMTtcbiAgfVxuICBkZXB0aCA9PT0gMCB8fCBGYWlsYHVudGVybWluYXRlZCBhcnJheTogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgbmV4dEluZGV4ID09PSBlbmNvZGVkLmxlbmd0aCB8fFxuICAgIEZhaWxgdW50ZXJtaW5hdGVkIGFycmF5IGVsZW1lbnQ6ICR7Z2V0U3VmZml4KFxuICAgICAgZW5jb2RlZCxcbiAgICAgIGN1cnJlbnRFbGVtZW50U3RhcnQsXG4gICAgKX1gO1xuICByZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgdGhlIG9yaWdpbmFsIGFycmF5IGVuY29kaW5nLCB3aGljaCBlc2NhcGVzIGFsbCBlbmNvZGVkIGFycmF5XG4gKiBlbGVtZW50cyByYXRoZXIgdGhhbiBqdXN0IHN0cmluZ3MgKGBcXHUwMDAwYCBhcyB0aGUgZWxlbWVudCB0ZXJtaW5hdG9yIGFuZFxuICogYFxcdTAwMDFgIGFzIHRoZSBlc2NhcGUgcHJlZml4IGZvciBgXFx1MDAwMGAgb3IgYFxcdTAwMDFgKS5cbiAqIFRoaXMgbmVjZXNzaXRhdGVkIGFuIHVuZGVzaXJhYmxlIGFtb3VudCBvZiBpdGVyYXRpb24gYW5kIGV4cGFuc2lvbjsgc2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjk2MDM2OTgyNlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gYXJyYXlcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBzdHJpbmd9IGVuY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lBcnJheSA9IChhcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgY2hhcnMgPSBbJ1snXTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFycmF5KSB7XG4gICAgY29uc3QgZW5jID0gZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG4gICAgZm9yIChjb25zdCBjIG9mIGVuYykge1xuICAgICAgaWYgKGMgPT09ICdcXHUwMDAwJyB8fCBjID09PSAnXFx1MDAwMScpIHtcbiAgICAgICAgY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuICAgICAgfVxuICAgICAgY2hhcnMucHVzaChjKTtcbiAgICB9XG4gICAgY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9IGRlY29kZVBhc3NhYmxlXG4gKiBAcGFyYW0ge251bWJlcn0gW3NraXBdXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeUFycmF5ID0gKGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICBjb25zdCBlbGVtQ2hhcnMgPSBbXTtcbiAgLyogVXNlIGEgc3RyaW5nIGl0ZXJhdG9yIHRvIGF2b2lkIHNsb3cgaW5kZXhlZCBhY2Nlc3MgaW4gWFMuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbiAgbGV0IHN0aWxsVG9Ta2lwID0gc2tpcCArIDE7XG4gIGxldCBpbkVzY2FwZSA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGMgb2YgZW5jb2RlZCkge1xuICAgIGlmIChzdGlsbFRvU2tpcCA+IDApIHtcbiAgICAgIHN0aWxsVG9Ta2lwIC09IDE7XG4gICAgICBpZiAoc3RpbGxUb1NraXAgPT09IDApIHtcbiAgICAgICAgYyA9PT0gJ1snIHx8IEZhaWxgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluRXNjYXBlKSB7XG4gICAgICBjID09PSAnXFx1MDAwMCcgfHxcbiAgICAgICAgYyA9PT0gJ1xcdTAwMDEnIHx8XG4gICAgICAgIEZhaWxgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2N9YDtcbiAgICAgIGVsZW1DaGFycy5wdXNoKGMpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICBjb25zdCBlbmNvZGVkRWxlbWVudCA9IGVsZW1DaGFycy5qb2luKCcnKTtcbiAgICAgIGVsZW1DaGFycy5sZW5ndGggPSAwO1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRlY29kZVBhc3NhYmxlKGVuY29kZWRFbGVtZW50KTtcbiAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChjID09PSAnXFx1MDAwMScpIHtcbiAgICAgIGluRXNjYXBlID0gdHJ1ZTtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZSovXG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbUNoYXJzLnB1c2goYyk7XG4gICAgfVxuICAgIGluRXNjYXBlID0gZmFsc2U7XG4gIH1cbiAgIWluRXNjYXBlIHx8IEZhaWxgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgZWxlbUNoYXJzLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgZW5jb2RpbmcgdGVybWluYXRlZCBlYXJseTogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7Qnl0ZUFycmF5fSBieXRlQXJyYXlcbiAqIEBwYXJhbSB7KGJ5dGVBcnJheTogQnl0ZUFycmF5KSA9PiBzdHJpbmd9IF9lbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQnl0ZUFycmF5ID0gKGJ5dGVBcnJheSwgX2VuY29kZVBhc3NhYmxlKSA9PiB7XG4gIC8qIFRPRE8gaW1wbGVtZW50Ki9cbiAgRmFpbGBlbmNvZGVQYXNzYWJsZShieXRlQXJyYXkpIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7Ynl0ZUFycmF5fWA7XG4gIHJldHVybiAnJzsgLyogSnVzdCBmb3IgdGhlIHR5cGUqL1xufTtcblxuY29uc3QgZW5jb2RlUmVjb3JkID0gKHJlY29yZCwgZW5jb2RlQXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IG5hbWVzID0gcmVjb3JkTmFtZXMocmVjb3JkKTtcbiAgY29uc3QgdmFsdWVzID0gcmVjb3JkVmFsdWVzKHJlY29yZCwgbmFtZXMpO1xuICByZXR1cm4gYCgke2VuY29kZUFycmF5KGhhcmRlbihbbmFtZXMsIHZhbHVlc10pLCBlbmNvZGVQYXNzYWJsZSl9YDtcbn07XG5cbmNvbnN0IGRlY29kZVJlY29yZCA9IChlbmNvZGVkLCBkZWNvZGVBcnJheSwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJygnKTtcbiAgLyogU2tpcCB0aGUgXCIoXCIgaW5zaWRlIGBkZWNvZGVBcnJheWAgdG8gYXZvaWQgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy4qL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xuICBjb25zdCB1bnppcHBlZEVudHJpZXMgPSBkZWNvZGVBcnJheShlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCArIDEpO1xuICB1bnppcHBlZEVudHJpZXMubGVuZ3RoID09PSAyIHx8XG4gICAgRmFpbGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBba2V5cywgdmFsc10gPSB1bnppcHBlZEVudHJpZXM7XG5cbiAgKHBhc3NTdHlsZU9mKGtleXMpID09PSAnY29weUFycmF5JyAmJlxuICAgIHBhc3NTdHlsZU9mKHZhbHMpID09PSAnY29weUFycmF5JyAmJlxuICAgIGtleXMubGVuZ3RoID09PSB2YWxzLmxlbmd0aCAmJlxuICAgIGtleXMuZXZlcnkoa2V5ID0+IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSkgfHxcbiAgICBGYWlsYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgbWFwRW50cmllcyA9IGtleXMubWFwKChrZXksIGkpID0+IFtrZXksIHZhbHNbaV1dKTtcbiAgY29uc3QgcmVjb3JkID0gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbiAgYXNzZXJ0UmVjb3JkKHJlY29yZCwgJ2RlY29kZWQgcmVjb3JkJyk7XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQgPSAodGFnZ2VkLCBlbmNvZGVBcnJheSwgZW5jb2RlUGFzc2FibGUpID0+XG4gIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLCB0YWdnZWQucGF5bG9hZF0pLCBlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkID0gKGVuY29kZWQsIGRlY29kZUFycmF5LCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApID09PSAnOicpO1xuICAvKiBTa2lwIHRoZSBcIjpcIiBpbnNpZGUgYGRlY29kZUFycmF5YCB0byBhdm9pZCBzbG93IGBzdWJzdHJpbmdgIGluIFhTLiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG4gIGNvbnN0IHRhZ2dlZFBheWxvYWQgPSBkZWNvZGVBcnJheShlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCArIDEpO1xuICB0YWdnZWRQYXlsb2FkLmxlbmd0aCA9PT0gMiB8fFxuICAgIEZhaWxgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgW3RhZywgcGF5bG9hZF0gPSB0YWdnZWRQYXlsb2FkO1xuICBwYXNzU3R5bGVPZih0YWcpID09PSAnc3RyaW5nJyB8fFxuICAgIEZhaWxgbm90IGEgdmFsaWQgdGFnZ2VkIGVuY29kaW5nOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICByZXR1cm4gbWFrZVRhZ2dlZCh0YWcsIHBheWxvYWQpO1xufTtcblxuY29uc3QgbWFrZUVuY29kZVJlbW90YWJsZSA9ICh1bnNhZmVFbmNvZGVSZW1vdGFibGUsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZVJlbW90YWJsZSA9IChyLCBpbm5lckVuY29kZSkgPT4ge1xuICAgIGNvbnN0IGVuY29kaW5nID0gdW5zYWZlRW5jb2RlUmVtb3RhYmxlKHIsIGlubmVyRW5jb2RlKTtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiBlbmNvZGluZy5jaGFyQXQoMCkgPT09ICdyJykgfHxcbiAgICAgIEZhaWxgUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcInJcIjogJHtlbmNvZGluZ31gO1xuICAgIHZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCAnUmVtb3RhYmxlJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlUmVtb3RhYmxlO1xufTtcblxuY29uc3QgbWFrZUVuY29kZVByb21pc2UgPSAodW5zYWZlRW5jb2RlUHJvbWlzZSwgdmVyaWZ5RW5jb2RpbmcpID0+IHtcbiAgY29uc3QgZW5jb2RlUHJvbWlzZSA9IChwLCBpbm5lckVuY29kZSkgPT4ge1xuICAgIGNvbnN0IGVuY29kaW5nID0gdW5zYWZlRW5jb2RlUHJvbWlzZShwLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAnPycpIHx8XG4gICAgICBGYWlsYFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiP1wiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdQcm9taXNlJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlUHJvbWlzZTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVFcnJvciA9ICh1bnNhZmVFbmNvZGVFcnJvciwgdmVyaWZ5RW5jb2RpbmcpID0+IHtcbiAgY29uc3QgZW5jb2RlRXJyb3IgPSAoZXJyLCBpbm5lckVuY29kZSkgPT4ge1xuICAgIGNvbnN0IGVuY29kaW5nID0gdW5zYWZlRW5jb2RlRXJyb3IoZXJyLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAnIScpIHx8XG4gICAgICBGYWlsYEVycm9yIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiFcIjogJHtlbmNvZGluZ31gO1xuICAgIHZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCAnRXJyb3InKTtcbiAgICByZXR1cm4gZW5jb2Rpbmc7XG4gIH07XG4gIHJldHVybiBlbmNvZGVFcnJvcjtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlT2JqZWN0LFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZUVycm9yXVxuICogQHByb3BlcnR5IHsnbGVnYWN5T3JkZXJlZCcgfCAnY29tcGFjdE9yZGVyZWQnfSBbZm9ybWF0XVxuICovXG5cbi8qKlxuICogQHBhcmFtIHsoc3RyOiBzdHJpbmcpID0+IHN0cmluZ30gZW5jb2RlU3RyaW5nU3VmZml4XG4gKiBAcGFyYW0geyhhcnI6IHVua25vd25bXSwgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nKSA9PiBzdHJpbmd9IGVuY29kZUFycmF5XG4gKiBAcGFyYW0ge1JlcXVpcmVkPEVuY29kZU9wdGlvbnM+ICYge3ZlcmlmeUVuY29kaW5nPzogKGVuY29kZWQ6IHN0cmluZywgbGFiZWw6IHN0cmluZykgPT4gdm9pZH19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHsocDogUGFzc2FibGUpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgbWFrZUlubmVyRW5jb2RlID0gKGVuY29kZVN0cmluZ1N1ZmZpeCwgZW5jb2RlQXJyYXksIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZTogdW5zYWZlRW5jb2RlUmVtb3RhYmxlLFxuICAgIGVuY29kZVByb21pc2U6IHVuc2FmZUVuY29kZVByb21pc2UsXG4gICAgZW5jb2RlRXJyb3I6IHVuc2FmZUVuY29kZUVycm9yLFxuICAgIHZlcmlmeUVuY29kaW5nID0gKCkgPT4ge30sXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBlbmNvZGVSZW1vdGFibGUgPSBtYWtlRW5jb2RlUmVtb3RhYmxlKFxuICAgIHVuc2FmZUVuY29kZVJlbW90YWJsZSxcbiAgICB2ZXJpZnlFbmNvZGluZyxcbiAgKTtcbiAgY29uc3QgZW5jb2RlUHJvbWlzZSA9IG1ha2VFbmNvZGVQcm9taXNlKHVuc2FmZUVuY29kZVByb21pc2UsIHZlcmlmeUVuY29kaW5nKTtcbiAgY29uc3QgZW5jb2RlRXJyb3IgPSBtYWtlRW5jb2RlRXJyb3IodW5zYWZlRW5jb2RlRXJyb3IsIHZlcmlmeUVuY29kaW5nKTtcblxuICBjb25zdCBpbm5lckVuY29kZSA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbiAgICAgIC8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4gICAgICAvKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuICAgICAgLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4gICAgICAvKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4gICAgICAvKiovXG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbiAgICAgIC8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbiAgICAgIC8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuICAgICAgLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuICAgICAgcmV0dXJuIGVuY29kZUVycm9yKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgfVxuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6IHtcbiAgICAgICAgcmV0dXJuICd2JztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgcmV0dXJuICd6JztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUJpbmFyeTY0KHBhc3NhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgcmV0dXJuIGBzJHtlbmNvZGVTdHJpbmdTdWZmaXgocGFzc2FibGUpfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdib29sZWFuJzoge1xuICAgICAgICByZXR1cm4gYGIke3Bhc3NhYmxlfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVCaWdJbnQocGFzc2FibGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlUmVtb3RhYmxlKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUVycm9yKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlUHJvbWlzZShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAvKiBTdHJpbmdzIGFuZCBzeW1ib2xzIHNoYXJlIGVuY29kaW5nIGxvZ2ljLiovXG4gICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgcmV0dXJuIGB5JHtlbmNvZGVTdHJpbmdTdWZmaXgobmFtZSl9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVCeXRlQXJyYXkocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBpbm5lckVuY29kZTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZU9iamVjdH0gW2RlY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yXVxuICovXG5cbmNvbnN0IGxpYmVyYWxEZWNvZGVycyA9IC8qKiBAdHlwZSB7UmVxdWlyZWQ8RGVjb2RlT3B0aW9ucz59ICovIChcbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoe1xuICAgIGRlY29kZVJlbW90YWJsZTogKF9lbmNvZGluZywgX2lubmVyRGVjb2RlKSA9PiB1bmRlZmluZWQsXG4gICAgZGVjb2RlUHJvbWlzZTogKF9lbmNvZGluZywgX2lubmVyRGVjb2RlKSA9PiB1bmRlZmluZWQsXG4gICAgZGVjb2RlRXJyb3I6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICB9KVxuKTtcblxuLyoqXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IHN0cmluZ30gZGVjb2RlU3RyaW5nU3VmZml4XG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcsIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZSwgc2tpcD86IG51bWJlcikgPT4gdW5rbm93bltdfSBkZWNvZGVBcnJheVxuICogQHBhcmFtIHtSZXF1aXJlZDxEZWNvZGVPcHRpb25zPn0gb3B0aW9uc1xuICogQHJldHVybnMgeyhlbmNvZGVkOiBzdHJpbmcsIHNraXA/OiBudW1iZXIpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCBtYWtlSW5uZXJEZWNvZGUgPSAoZGVjb2RlU3RyaW5nU3VmZml4LCBkZWNvZGVBcnJheSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlY29kZVJlbW90YWJsZSwgZGVjb2RlUHJvbWlzZSwgZGVjb2RlRXJyb3IgfSA9IG9wdGlvbnM7XG4gIC8qKiBAdHlwZSB7KGVuY29kZWQ6IHN0cmluZywgc2tpcD86IG51bWJlcikgPT4gUGFzc2FibGV9ICovXG4gIGNvbnN0IGlubmVyRGVjb2RlID0gKGVuY29kZWQsIHNraXAgPSAwKSA9PiB7XG4gICAgc3dpdGNoIChlbmNvZGVkLmNoYXJBdChza2lwKSkge1xuICAgICAgY2FzZSAndic6IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjYXNlICd6Jzoge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY2FzZSAnZic6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZUJpbmFyeTY0KGVuY29kZWQsIHNraXApO1xuICAgICAgfVxuICAgICAgY2FzZSAncyc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVN0cmluZ1N1ZmZpeChnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2InOiB7XG4gICAgICAgIGNvbnN0IHN1YnN0cmluZyA9IGdldFN1ZmZpeChlbmNvZGVkLCBza2lwICsgMSk7XG4gICAgICAgIGlmIChzdWJzdHJpbmcgPT09ICd0cnVlJykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YnN0cmluZyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGV4cGVjdGVkIGVuY29kZWQgYm9vbGVhbiB0byBiZSBcImJ0cnVlXCIgb3IgXCJiZmFsc2VcIjogJHtzdWJzdHJpbmd9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ24nOlxuICAgICAgY2FzZSAncCc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZUJpZ0ludChnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCkpO1xuICAgICAgfVxuICAgICAgY2FzZSAncic6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVJlbW90YWJsZShnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJz8nOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVQcm9taXNlKGdldFN1ZmZpeChlbmNvZGVkLCBza2lwKSwgaW5uZXJEZWNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnISc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZUVycm9yKGdldFN1ZmZpeChlbmNvZGVkLCBza2lwKSwgaW5uZXJEZWNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAneSc6IHtcbiAgICAgICAgLyogU3RyaW5ncyBhbmQgc3ltYm9scyBzaGFyZSBkZWNvZGluZyBsb2dpYy4qL1xuICAgICAgICBjb25zdCBuYW1lID0gZGVjb2RlU3RyaW5nU3VmZml4KGdldFN1ZmZpeChlbmNvZGVkLCBza2lwICsgMSkpO1xuICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnWyc6XG4gICAgICBjYXNlICdeJzoge1xuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFR5cGUgJ3Vua25vd25bXScgaXMgbm90IFBhc3NhYmxlKi9cbiAgICAgICAgcmV0dXJuIGRlY29kZUFycmF5KGVuY29kZWQsIGlubmVyRGVjb2RlLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJygnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVSZWNvcmQoZW5jb2RlZCwgZGVjb2RlQXJyYXksIGlubmVyRGVjb2RlLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJzonOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVUYWdnZWQoZW5jb2RlZCwgZGVjb2RlQXJyYXksIGlubmVyRGVjb2RlLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGRhdGFiYXNlIGtleTogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBpbm5lckRlY29kZTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFzc2FibGVLaXRcbiAqIEBwcm9wZXJ0eSB7UmV0dXJuVHlwZTxtYWtlSW5uZXJFbmNvZGU+fSBlbmNvZGVQYXNzYWJsZVxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPG1ha2VJbm5lckRlY29kZT59IGRlY29kZVBhc3NhYmxlXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZU9wdGlvbnMgJiBEZWNvZGVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXNzYWJsZUtpdH1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQYXNzYWJsZUtpdCA9IChvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZSA9IChyLCBfKSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3J9YCxcbiAgICBlbmNvZGVQcm9taXNlID0gKHAsIF8pID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3B9YCxcbiAgICBlbmNvZGVFcnJvciA9IChlcnIsIF8pID0+IEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YCxcbiAgICBmb3JtYXQgPSAnbGVnYWN5T3JkZXJlZCcsXG5cbiAgICBkZWNvZGVSZW1vdGFibGUgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YCxcbiAgICBkZWNvZGVQcm9taXNlID0gKGVuY29kaW5nLCBfKSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICAgIGRlY29kZUVycm9yID0gKGVuY29kaW5nLCBfKSA9PiBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YCxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgLyoqIEB0eXBlIHtQYXNzYWJsZUtpdFsnZW5jb2RlUGFzc2FibGUnXX0gKi9cbiAgbGV0IGVuY29kZVBhc3NhYmxlO1xuICBjb25zdCBlbmNvZGVPcHRpb25zID0geyBlbmNvZGVSZW1vdGFibGUsIGVuY29kZVByb21pc2UsIGVuY29kZUVycm9yLCBmb3JtYXQgfTtcbiAgaWYgKGZvcm1hdCA9PT0gJ2NvbXBhY3RPcmRlcmVkJykge1xuICAgIGNvbnN0IGxpYmVyYWxEZWNvZGUgPSBtYWtlSW5uZXJEZWNvZGUoXG4gICAgICBkZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuICAgICAgZGVjb2RlQ29tcGFjdEFycmF5LFxuICAgICAgbGliZXJhbERlY29kZXJzLFxuICAgICk7XG4gICAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgICBjb25zdCB2ZXJpZnlFbmNvZGluZyA9IChlbmNvZGluZywgbGFiZWwpID0+IHtcbiAgICAgICFlbmNvZGluZy5tYXRjaChyQzApIHx8XG4gICAgICAgIEZhaWxgJHtiKFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICApfSBlbmNvZGluZyBtdXN0IG5vdCBjb250YWluIGEgQzAgY29udHJvbCBjaGFyYWN0ZXI6ICR7ZW5jb2Rpbmd9YDtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVDb21wYWN0QXJyYXkoYF52ICR7ZW5jb2Rpbmd9IHYgYCwgbGliZXJhbERlY29kZSk7XG4gICAgICAoaXNBcnJheShkZWNvZGVkKSAmJlxuICAgICAgICBkZWNvZGVkLmxlbmd0aCA9PT0gMyAmJlxuICAgICAgICBkZWNvZGVkWzBdID09PSBudWxsICYmXG4gICAgICAgIGRlY29kZWRbMl0gPT09IG51bGwpIHx8XG4gICAgICAgIEZhaWxgJHtiKGxhYmVsKX0gZW5jb2RpbmcgbXVzdCBiZSBlbWJlZGRhYmxlOiAke2VuY29kaW5nfWA7XG4gICAgfTtcbiAgICBjb25zdCBlbmNvZGVDb21wYWN0ID0gbWFrZUlubmVyRW5jb2RlKFxuICAgICAgZW5jb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbiAgICAgIGVuY29kZUNvbXBhY3RBcnJheSxcbiAgICAgIHsgLi4uZW5jb2RlT3B0aW9ucywgdmVyaWZ5RW5jb2RpbmcgfSxcbiAgICApO1xuICAgIGVuY29kZVBhc3NhYmxlID0gcGFzc2FibGUgPT4gYH4ke2VuY29kZUNvbXBhY3QocGFzc2FibGUpfWA7XG4gIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnbGVnYWN5T3JkZXJlZCcpIHtcbiAgICBlbmNvZGVQYXNzYWJsZSA9IG1ha2VJbm5lckVuY29kZShcbiAgICAgIGVuY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCxcbiAgICAgIGVuY29kZUxlZ2FjeUFycmF5LFxuICAgICAgZW5jb2RlT3B0aW9ucyxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIGZvcm1hdDogJHtxKGZvcm1hdCl9YDtcbiAgfVxuXG4gIGNvbnN0IGRlY29kZU9wdGlvbnMgPSB7IGRlY29kZVJlbW90YWJsZSwgZGVjb2RlUHJvbWlzZSwgZGVjb2RlRXJyb3IgfTtcbiAgY29uc3QgZGVjb2RlQ29tcGFjdCA9IG1ha2VJbm5lckRlY29kZShcbiAgICBkZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuICAgIGRlY29kZUNvbXBhY3RBcnJheSxcbiAgICBkZWNvZGVPcHRpb25zLFxuICApO1xuICBjb25zdCBkZWNvZGVMZWdhY3kgPSBtYWtlSW5uZXJEZWNvZGUoXG4gICAgZGVjb2RlTGVnYWN5U3RyaW5nU3VmZml4LFxuICAgIGRlY29kZUxlZ2FjeUFycmF5LFxuICAgIGRlY29kZU9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGRlY29kZVBhc3NhYmxlID0gZW5jb2RlZCA9PiB7XG4gICAgLyogQSBsZWFkaW5nIFwiflwiIGluZGljYXRlcyB0aGUgdjIgZW5jb2RpbmcgKHdpdGggZXNjYXBpbmcgaW4gc3RyaW5ncyByYXRoZXIgdGhhbiBhcnJheXMpLiovXG4gICAgLyogU2tpcCBpdCBpbnNpZGUgYGRlY29kZUNvbXBhY3RgIHRvIGF2b2lkIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuKi9cbiAgICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xuICAgIGlmIChlbmNvZGVkLmNoYXJBdCgwKSA9PT0gJ34nKSB7XG4gICAgICByZXR1cm4gZGVjb2RlQ29tcGFjdChlbmNvZGVkLCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlY29kZUxlZ2FjeShlbmNvZGVkKTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgZW5jb2RlUGFzc2FibGUsIGRlY29kZVBhc3NhYmxlIH0pO1xufTskaM2PX29uY2UubWFrZVBhc3NhYmxlS2l0KG1ha2VQYXNzYWJsZUtpdCk7XG5oYXJkZW4obWFrZVBhc3NhYmxlS2l0KTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMge1Bhc3NhYmxlS2l0WydlbmNvZGVQYXNzYWJsZSddfVxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVBhc3NhYmxlID0gZW5jb2RlT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgZW5jb2RlUGFzc2FibGUgfSA9IG1ha2VQYXNzYWJsZUtpdChlbmNvZGVPcHRpb25zKTtcbiAgcmV0dXJuIGVuY29kZVBhc3NhYmxlO1xufTskaM2PX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMge1Bhc3NhYmxlS2l0WydkZWNvZGVQYXNzYWJsZSddfVxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZVBhc3NhYmxlID0gZGVjb2RlT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgZGVjb2RlUGFzc2FibGUgfSA9IG1ha2VQYXNzYWJsZUtpdChkZWNvZGVPcHRpb25zKTtcbiAgcmV0dXJuIGRlY29kZVBhc3NhYmxlO1xufTskaM2PX29uY2UubWFrZURlY29kZVBhc3NhYmxlKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZURlY29kZVBhc3NhYmxlKTtcblxuICAgICAgIGNvbnN0IGlzRW5jb2RlZFJlbW90YWJsZSA9IGVuY29kZWQgPT4gZW5jb2RlZC5jaGFyQXQoMCkgPT09ICdyJzskaM2PX29uY2UuaXNFbmNvZGVkUmVtb3RhYmxlKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5oYXJkZW4oaXNFbmNvZGVkUmVtb3RhYmxlKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlIHtSZWNvcmQ8UGFzc1N0eWxlLCBzdHJpbmc+fVxuICogVGhlIHNpbmdsZSBwcmVmaXggY2hhcmFjdGVycyB0byBiZSB1c2VkIGZvciBlYWNoIFBhc3NTdHlsZSBjYXRlZ29yeS5cbiAqIGBiaWdpbnRgIGlzIGEgdHdvLWNoYXJhY3RlciBzdHJpbmcgYmVjYXVzZSBlYWNoIG9mIHRob3NlIGNoYXJhY3RlcnNcbiAqIGluZGl2aWR1YWxseSBpcyBhIHZhbGlkIGJpZ2ludCBwcmVmaXggKGBuYCBmb3IgXCJuZWdhdGl2ZVwiIGFuZCBgcGAgZm9yXG4gKiBcInBvc2l0aXZlXCIpLCBhbmQgY29weUFycmF5IGlzIGEgdHdvLWNoYXJhY3RlciBzdHJpbmcgYmVjYXVzZSBvbmUgZW5jb2RpbmdcbiAqIHByZWZpeGVzIGFycmF5cyB3aXRoIGBbYCB3aGlsZSB0aGUgb3RoZXIgdXNlcyBgXmAgKHdoaWNoIGlzIHByb2hpYml0ZWQgZnJvbVxuICogYXBwZWFyaW5nIGluIGFuIGVuY29kZWQgc3RyaW5nKS5cbiAqIFRoZSBvcmRlcmluZyBvZiB0aGVzZSBwcmVmaXhlcyBpcyB0aGUgc2FtZSBhcyB0aGUgcmFua09yZGVyaW5nIG9mIHRoZWlyXG4gKiByZXNwZWN0aXZlIFBhc3NTdHlsZXMsIGFuZCByYW5rT3JkZXIuanMgaW1wb3J0cyB0aGUgdGFibGUgZm9yIHRoaXMgcHVycG9zZS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgYHxgIGlzIHRoZSByZW1vdGFibGUtPm9yZGluYWwgbWFwcGluZyBwcmVmaXg6XG4gKiBUaGlzIGlzIG5vdCB1c2VkIGluIGNvdmVycyBidXQgaXQgaXNcbiAqIHJlc2VydmVkIGZyb20gdGhlIHNhbWUgc2V0IG9mIHN0cmluZ3MuIE5vdGUgdGhhdCB0aGUgcHJlZml4IGlzID4gYW55XG4gKiBwcmVmaXggdXNlZCBieSBhbnkgY292ZXIgc28gdGhhdCBvcmRpbmFsIG1hcHBpbmcga2V5cyBhcmUgYWx3YXlzIG91dHNpZGVcbiAqIHRoZSByYW5nZSBvZiB2YWxpZCBjb2xsZWN0aW9uIGVudHJ5IGtleXMuXG4gKi9cbiAgICAgICBjb25zdCBwYXNzU3R5bGVQcmVmaXhlcyA9IHtcbiAgZXJyb3I6ICchJyxcbiAgY29weVJlY29yZDogJygnLFxuICB0YWdnZWQ6ICc6JyxcbiAgcHJvbWlzZTogJz8nLFxuICBjb3B5QXJyYXk6ICdbXicsXG4gIGJ5dGVBcnJheTogJ2EnLFxuICBib29sZWFuOiAnYicsXG4gIG51bWJlcjogJ2YnLFxuICBiaWdpbnQ6ICducCcsXG4gIHJlbW90YWJsZTogJ3InLFxuICBzdHJpbmc6ICdzJyxcbiAgbnVsbDogJ3YnLFxuICBzeW1ib2w6ICd5JyxcbiAgLyogQmVjYXVzZSBBcnJheS5wcm90b3R5cGUuc29ydCBwdXRzIHVuZGVmaW5lZCB2YWx1ZXMgYXQgdGhlIGVuZCB3aXRob3V0Ki9cbiAgLyogcGFzc2luZyB0aGVtIHRvIGEgY29tcGFyaXNvbiBmdW5jdGlvbiwgdW5kZWZpbmVkIE1VU1QgYmUgdGhlIGxhc3QqL1xuICAvKiBjYXRlZ29yeS4qL1xuICB1bmRlZmluZWQ6ICd6Jyxcbn07JGjNj19vbmNlLnBhc3NTdHlsZVByZWZpeGVzKHBhc3NTdHlsZVByZWZpeGVzKTtcbk9iamVjdC5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVQcmVmaXhlcywgbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUHJlZml4ZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVjb3JkTmFtZXMiOlsicmVjb3JkTmFtZXMiXSwicmVjb3JkVmFsdWVzIjpbInJlY29yZFZhbHVlcyJdLCJ6ZXJvUGFkIjpbInplcm9QYWQiXSwibWFrZVBhc3NhYmxlS2l0IjpbIm1ha2VQYXNzYWJsZUtpdCJdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIl0sIm1ha2VEZWNvZGVQYXNzYWJsZSI6WyJtYWtlRGVjb2RlUGFzc2FibGUiXSwiaXNFbmNvZGVkUmVtb3RhYmxlIjpbImlzRW5jb2RlZFJlbW90YWJsZSJdLCJwYXNzU3R5bGVQcmVmaXhlcyI6WyJwYXNzU3R5bGVQcmVmaXhlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADVwnO6F0QAABdEAAArAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiUUNMQVNTIiwibWFrZURlY29kZUZyb21DYXBEYXRhIiwibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsaXNQcmltaXRpdmUsZ2V0VGFnLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzYWJsZSwgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJyAqL1xuLyoqIEBpbXBvcnQge0VuY29kaW5nLCBFbmNvZGluZ1VuaW9ufSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3Qge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxuICBkZWZpbmVQcm9wZXJ0aWVzLFxuICBpcyxcbiAgZW50cmllcyxcbiAgZnJvbUVudHJpZXMsXG4gIGZyZWV6ZSxcbiAgaGFzT3duLFxufSA9IE9iamVjdDtcblxuLyoqXG4gKiBTcGVjaWFsIHByb3BlcnR5IG5hbWUgdGhhdCBpbmRpY2F0ZXMgYW4gZW5jb2RpbmcgdGhhdCBuZWVkcyBzcGVjaWFsXG4gKiBkZWNvZGluZy5cbiAqL1xuY29uc3QgUUNMQVNTID0gJ0BxY2xhc3MnOyRozY9fb25jZS5RQ0xBU1MoUUNMQVNTKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RpbmcgJiBvYmplY3R9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtlbmNvZGVkIGlzIEVuY29kaW5nVW5pb259XG4gKi9cbmNvbnN0IGhhc1FDbGFzcyA9IGVuY29kZWQgPT4gaGFzT3duKGVuY29kZWQsIFFDTEFTUyk7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHBhcmFtIHtzdHJpbmd9IHFjbGFzc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHFjbGFzc01hdGNoZXMgPSAoZW5jb2RlZCwgcWNsYXNzKSA9PlxuICAhaXNQcmltaXRpdmUoZW5jb2RlZCkgJiZcbiAgIWlzQXJyYXkoZW5jb2RlZCkgJiZcbiAgaGFzUUNsYXNzKGVuY29kZWQpICYmXG4gIGVuY29kZWRbUUNMQVNTXSA9PT0gcWNsYXNzO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvQ2FwRGF0YU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZU9iamVjdCxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gcmVtID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gcHJvbSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YSA9IGVyciA9PiBGYWlsYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9DYXBEYXRhT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlVG9DYXBEYXRhID0gKGVuY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbiAgICBlbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG4gICAgZW5jb2RlRXJyb3JUb0NhcERhdGEgPSBkb250RW5jb2RlRXJyb3JUb0NhcERhdGEsXG4gIH0gPSBlbmNvZGVPcHRpb25zO1xuXG4gIC8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRlbHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvQ2FwRGF0YWAgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb0NhcERhdGFgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG4gIGNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyID0gcGFzc2FibGUgPT4ge1xuICAgIC8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuICAgIC8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBhcyBbUUNMQVNTXSBjb21wb3NpdGVzLiovXG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGFzc2FibGUpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICAvKiBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG4gICAgICAgIHJldHVybiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICd1bmRlZmluZWQnIH07XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIC8qIFNwZWNpYWwtY2FzZSBudW1iZXJzIHdpdGggbm8gZGlnaXQtYmFzZWQgcmVwcmVzZW50YXRpb24uKi9cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihwYXNzYWJsZSkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ05hTicgfTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ0luZmluaXR5JyB9O1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJy1JbmZpbml0eScgfTtcbiAgICAgICAgfVxuICAgICAgICAvKiBQYXNzIHRocm91Z2ggZXZlcnl0aGluZyBlbHNlLCByZXBsYWNpbmcgLTAgd2l0aCAwLiovXG4gICAgICAgIHJldHVybiBpcyhwYXNzYWJsZSwgLTApID8gMCA6IHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAnYmlnaW50JyxcbiAgICAgICAgICBkaWdpdHM6IFN0cmluZyhwYXNzYWJsZSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW1FDTEFTU106ICdzeW1ib2wnLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICBpZiAoaGFzT3duKHBhc3NhYmxlLCBRQ0xBU1MpKSB7XG4gICAgICAgICAgLyogSGlsYmVydCBob3RlbCovXG4gICAgICAgICAgY29uc3QgeyBbUUNMQVNTXTogcWNsYXNzVmFsdWUsIC4uLnJlc3QgfSA9IHBhc3NhYmxlO1xuICAgICAgICAgIC8qKiBAdHlwZSB7RW5jb2Rpbmd9ICovXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgW1FDTEFTU106ICdoaWxiZXJ0JyxcbiAgICAgICAgICAgIG9yaWdpbmFsOiBlbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAob3duS2V5cyhyZXN0KS5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgLyogV2UgaGFyZGVuIHRoZSBlbnRpcmUgY2FwRGF0YSBlbmNvZGluZyBiZWZvcmUgd2UgcmV0dXJuIGl0LiovXG4gICAgICAgICAgICAvKiBgZW5jb2RlVG9DYXBEYXRhYCByZXF1aXJlcyB0aGF0IGl0cyBpbnB1dCBiZSBQYXNzYWJsZSwgYW5kKi9cbiAgICAgICAgICAgIC8qIHRoZXJlZm9yZSBoYXJkZW5lZC4qL1xuICAgICAgICAgICAgLyogVGhlIGBmcmVlemVgIGhlcmUgaXMgbmVlZGVkIGFueXdheSwgYmVjYXVzZSB0aGUgYHJlc3RgIGlzKi9cbiAgICAgICAgICAgIC8qIGZyZXNobHkgY29uc3RydWN0ZWQgYnkgdGhlIGAuLi5gIGFib3ZlLCBhbmQgd2UncmUgdXNpbmcgaXQqL1xuICAgICAgICAgICAgLyogYXMgaW1wdXQgaW4gYW5vdGhlciBjYWxsIHRvIGBlbmNvZGVUb0NhcERhdGFgLiovXG4gICAgICAgICAgICByZXN1bHQucmVzdCA9IGVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbiAgICAgICAgLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbiAgICAgICAgLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbiAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG4gICAgICAgIHJldHVybiBmcm9tRW50cmllcyhcbiAgICAgICAgICBuYW1lcy5tYXAobmFtZSA9PiBbbmFtZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYnl0ZUFycmF5Jzoge1xuICAgICAgICAvKiBUT0RPIGltcGxlbWVudCovXG4gICAgICAgIHRocm93IEZhaWxgbWFyc2FsIG9mIGJ5dGVBcnJheSBub3QgeWV0IGltcGxlbWVudGVkOiAke3Bhc3NhYmxlfWA7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW1FDTEFTU106ICd0YWdnZWQnLFxuICAgICAgICAgIHRhZzogZ2V0VGFnKHBhc3NhYmxlKSxcbiAgICAgICAgICBwYXlsb2FkOiBlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZS5wYXlsb2FkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YShcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb0NhcERhdGFSZWN1cixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwgJ3Nsb3QnKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIC8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgKX0gJHtxKCdzbG90Jyl9OiAke2VuY29kZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVQcm9taXNlVG9DYXBEYXRhKHBhc3NhYmxlLCBlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdzbG90JykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgICAnc2xvdCcsXG4gICAgICAgICl9OiAke2VuY29kZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgICAgaWYgKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwgJ2Vycm9yJykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcbiAgICAgICAgICBRQ0xBU1MsXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICBYYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG4gICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgZW5jb2RlVG9DYXBEYXRhID0gcGFzc2FibGUgPT4ge1xuICAgIGlmIChpc0Vycm9yTGlrZShwYXNzYWJsZSkpIHtcbiAgICAgIC8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuICAgICAgLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbiAgICAgIC8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4gICAgICAvKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbiAgICAgIC8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbiAgICAgIC8qKi9cbiAgICAgIC8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuICAgICAgLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuICAgICAgLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4gICAgICAvKiB0aGlzIGluZm9ybWF0aW9uLiovXG4gICAgICByZXR1cm4gaGFyZGVuKGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLCBlbmNvZGVUb0NhcERhdGFSZWN1cikpO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb0NhcERhdGEobWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5oYXJkZW4obWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGVPYmplY3QpfSBbZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGVPYmplY3QpfSBbZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEgPSBzbG90RW5jb2RpbmcgPT5cbiAgRmFpbGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGEgPSBlcnJvckVuY29kaW5nID0+XG4gIEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJvckVuY29kaW5nfWA7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaFxuICogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uXG4gKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZVxuICogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS5cbiAqXG4gKiBUaGlzIHNlZW1zIGxpa2UgdGhlIGJlc3Qgc3RhcnRpbmcgcG9pbnQgdG8gaW5jcmVtZW50YWxseSBldm9sdmUgdG8gYW5cbiAqIEFQSSB3aGVyZSB0aGVzZSBjYW4gcmVsaWFibHkgZGlmZmVyLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNFxuICpcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IEVuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9IChkZWNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhID0gZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICBkZWNvZGVFcnJvckZyb21DYXBEYXRhID0gZG9udERlY29kZUVycm9yRnJvbUNhcERhdGEsXG4gIH0gPSBkZWNvZGVPcHRpb25zO1xuXG4gIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhID09PSBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgfHxcbiAgICBGYWlsYEFuIGltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uIGZvciBub3c6IElmIGVpdGhlciBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSBvciBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lOiAke3EoXG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSxcbiAgICApfSB2cyAke3EoZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhKX1gO1xuXG4gIC8qKlxuICogYGRlY29kZUZyb21DYXBEYXRhYCBtYXkgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBqc29uRW5jb2RlZGBcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvQ2FwRGF0YWBcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbUNhcERhdGFgIGNhbm5vdCByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbUNhcERhdGFgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30ganNvbkVuY29kZWQgbXVzdCBiZSBoYXJkZW5lZFxuICovXG4gIGNvbnN0IGRlY29kZUZyb21DYXBEYXRhID0ganNvbkVuY29kZWQgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShqc29uRW5jb2RlZCkpIHtcbiAgICAgIC8qIHByaW1pdGl2ZXMgcGFzcyB0aHJvdWdoKi9cbiAgICAgIHJldHVybiBqc29uRW5jb2RlZDtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkoanNvbkVuY29kZWQpKSB7XG4gICAgICByZXR1cm4ganNvbkVuY29kZWQubWFwKGVuY29kZWRWYWwgPT4gZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCkpO1xuICAgIH0gZWxzZSBpZiAoaGFzUUNsYXNzKGpzb25FbmNvZGVkKSkge1xuICAgICAgY29uc3QgcWNsYXNzID0ganNvbkVuY29kZWRbUUNMQVNTXTtcbiAgICAgIHR5cGVvZiBxY2xhc3MgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIEZhaWxgaW52YWxpZCAke3EoUUNMQVNTKX0gdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuICAgICAgc3dpdGNoIChxY2xhc3MpIHtcbiAgICAgICAgLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbiAgICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTmFOJzoge1xuICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnSW5maW5pdHknOiB7XG4gICAgICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgICBjb25zdCB7IGRpZ2l0cyB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgdHlwZW9mIGRpZ2l0cyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xuICAgICAgICAgIHJldHVybiBCaWdJbnQoZGlnaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgLyogRGVwcmVjYXRlZCBxY2xhc3MuIFRPRE8gbWFrZSBjb25kaXRpb25hbCovXG4gICAgICAgICAgLyogb24gZW52aXJvbm1lbnQgdmFyaWFibGUuIEV2ZW50dWFsbHkgcmVtb3ZlLCBidXQgYWZ0ZXIgY29uZmlkZW50Ki9cbiAgICAgICAgICAvKiB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHN1cHBvcnRlZCBzZW5kZXJzLiovXG4gICAgICAgICAgLyoqL1xuICAgICAgICAgIHJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICAvKiBTZWUgbm90ZSBhYm92ZSBhYm91dCBob3cgdGhlIGN1cnJlbnQgZW5jb2RpbmcgY2Fubm90IHJlbGlhYmx5Ki9cbiAgICAgICAgICAvKiBkaXN0aW5ndWlzaCB3aGljaCB3ZSBzaG91bGQgY2FsbCwgc28gaW4gdGhlIG5vbi1kZWZhdWx0IGNhc2UqL1xuICAgICAgICAgIC8qIGJvdGggbXVzdCBiZSB0aGUgc2FtZSBhbmQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggd2UgY2FsbC4qL1xuICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YShcbiAgICAgICAgICAgIGpzb25FbmNvZGVkLFxuICAgICAgICAgICAgZGVjb2RlRnJvbUNhcERhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvKiBCRVdBUkU6IGNhcGRhdGEgZG9lcyBub3QgY2hlY2sgdGhhdCBgZGVjb2RlZGAgaXMqL1xuICAgICAgICAgIC8qIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZSwgc2luY2UgdGhhdCB3b3VsZCBicmVhayBzb21lKi9cbiAgICAgICAgICAvKiBjYXBkYXRhIGNsaWVudHMuIFdlIGFyZSBkZXByZWNhdGluZyBjYXBkYXRhLCBhbmQgdGhlc2UgY2xpZW50cyovXG4gICAgICAgICAgLyogd2lsbCBuZWVkIHRvIHVwZGF0ZSBiZWZvcmUgc3dpdGNoaW5nIHRvIHNtYWxsY2Fwcy4qL1xuICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVFcnJvckZyb21DYXBEYXRhKFxuICAgICAgICAgICAganNvbkVuY29kZWQsXG4gICAgICAgICAgICBkZWNvZGVGcm9tQ2FwRGF0YSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwYXNzU3R5bGVPZihkZWNvZGVkKSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbUNhcERhdGEgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke2RlY29kZWR9YDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoaWxiZXJ0Jzoge1xuICAgICAgICAgIGNvbnN0IHsgb3JpZ2luYWwsIHJlc3QgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgIGhhc093bihqc29uRW5jb2RlZCwgJ29yaWdpbmFsJykgfHxcbiAgICAgICAgICAgIEZhaWxgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7anNvbkVuY29kZWR9YDtcbiAgICAgICAgICAvKiBEb24ndCBoYXJkZW4gc2luY2Ugd2UncmUgbm90IGRvbmUgbXV0YXRpbmcgaXQqL1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgW1FDTEFTU106IGRlY29kZUZyb21DYXBEYXRhKG9yaWdpbmFsKSB9O1xuICAgICAgICAgIGlmIChoYXNPd24oanNvbkVuY29kZWQsICdyZXN0JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzTm9uRW1wdHlPYmplY3QgPVxuICAgICAgICAgICAgICB0eXBlb2YgcmVzdCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgcmVzdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA+PSAxO1xuICAgICAgICAgICAgaWYgKCFpc05vbkVtcHR5T2JqZWN0KSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN0T2JqID0gZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4gICAgICAgICAgICAvKiBUT0RPIHJlYWxseSBzaG91bGQgYXNzZXJ0IHRoYXQgYHBhc3NTdHlsZU9mKHJlc3QpYCBpcyovXG4gICAgICAgICAgICAvKiBgJ2NvcHlSZWNvcmQnYCBidXQgd2UnZCBoYXZlIHRvIGhhcmRlbiBpdCBhbmQgaXQgaXMgdG9vKi9cbiAgICAgICAgICAgIC8qIGVhcmx5IHRvIGRvIHRoYXQuKi9cbiAgICAgICAgICAgICFoYXNPd24ocmVzdE9iaiwgUUNMQVNTKSB8fFxuICAgICAgICAgICAgICBGYWlsYFJlc3QgbXVzdCBub3QgY29udGFpbiBpdHMgb3duIGRlZmluaXRpb24gb2YgJHtxKFFDTEFTUyl9YDtcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHJlc3RPYmopKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFRoaXMgaXMgdGhlIGVycm9yIGNhc2Ugd2UncmUgdGVzdGluZyBmb3IqL1xuICAgICAgICBjYXNlICdpYmlkJzoge1xuICAgICAgICAgIHRocm93IEZhaWxgVGhlIGNhcERhdGEgcHJvdG9jb2wgbm8gbG9uZ2VyIHN1cHBvcnRzICR7cShRQ0xBU1MpfSAke3EoXG4gICAgICAgICAgICBxY2xhc3MsXG4gICAgICAgICAgKX1gO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgIFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuICAgICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZCA9PT0gJ29iamVjdCcgJiYganNvbkVuY29kZWQgIT09IG51bGwpO1xuICAgICAgY29uc3QgZGVjb2RlRW50cnkgPSAoW25hbWUsIGVuY29kZWRWYWxdKSA9PiB7XG4gICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIEZhaWxgUHJvcGVydHkgJHtxKG5hbWUpfSBvZiAke2pzb25FbmNvZGVkfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgcmV0dXJuIFtuYW1lLCBkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKV07XG4gICAgICB9O1xuICAgICAgY29uc3QgZGVjb2RlZEVudHJpZXMgPSBlbnRyaWVzKGpzb25FbmNvZGVkKS5tYXAoZGVjb2RlRW50cnkpO1xuICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZGVjb2RlRnJvbUNhcERhdGEpO1xufTskaM2PX29uY2UubWFrZURlY29kZUZyb21DYXBEYXRhKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJRQ0xBU1MiOlsiUUNMQVNTIl0sIm1ha2VFbmNvZGVUb0NhcERhdGEiOlsibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiOlsibWFrZURlY29kZUZyb21DYXBEYXRhIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAA1TX470RQAA9EUAAC0AAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIiwibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxnZXRUYWcsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxYLEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzYWJsZSwgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJyAqL1xuLyogRklYTUUgZGVmaW5lIGFjdHVhbCB0eXBlcyovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IGlzLCBlbnRyaWVzLCBmcm9tRW50cmllcywgaGFzT3duIH0gPSBPYmplY3Q7XG5cbmNvbnN0IEJBTkcgPSAnIScuY2hhckNvZGVBdCgwKTtcbmNvbnN0IERBU0ggPSAnLScuY2hhckNvZGVBdCgwKTtcblxuLyoqXG4gKiBBbiBgZW5jb2RlVG9TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGEgcGFzc2FibGUgYW5kIHJldHVybnMgYVxuICogSlNPTi1yZXByZXNlbnRhYmxlIG9iamVjdCAoaS5lLiwgcm91bmQtdHJpcHBpbmcgaXQgdGhyb3VnaFxuICogYEpTT04uc3RyaW5naWZ5YCBhbmQgYEpTT04ucGFyc2VgIHdpdGggbm8gcmVwbGFjZXJzIG9yIHJldml2ZXJzXG4gKiByZXR1cm5zIGFuIGVxdWl2YWxlbnQgc3RydWN0dXJlIGV4Y2VwdCBmb3Igb2JqZWN0IGlkZW50aXR5KS5cbiAqIFdlIGNhbGwgdGhpcyByZXByZXNlbnRhdGlvbiBhIFNtYWxsY2FwcyBFbmNvZGluZy5cbiAqXG4gKiBBIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhcyBhcmd1bWVudCB3aGF0IGl0XG4gKiAqYXNzdW1lcyogaXMgdGhlIHJlc3VsdCBvZiBhIHBsYWluIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlc29sdmVyLiBJdCB0aGVuXG4gKiBtdXN0IHZhbGlkYXRlIHRoYXQgaXQgaXMgYSB2YWxpZCBTbWFsbGNhcHMgRW5jb2RpbmcsIGFuZCBpZiBpdCBpcyxcbiAqIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgcGFzc2FibGUuXG4gKlxuICogU21hbGxjYXBzIGNvbnNpZGVycyB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIGAhYCAoYXNjaWkgY29kZSAzMywgQkFORylcbiAqIGFuZCBgLWAgKGFzY2lpIGNvZGUgNDUsIERBU0gpIHRvIGJlIHNwZWNpYWwgcHJlZml4ZXMgYWxsb3dpbmdcbiAqIHJlcHJlc2VudGF0aW9uIG9mIEpTT04taW5jb21wYXRpYmxlIGRhdGEgdXNpbmcgc3RyaW5ncy5cbiAqIFRoZXNlIGNoYXJhY3RlcnMsIGluIG9yZGVyLCBhcmUgYCFcIiMkJSYnKCkqKywtYFxuICogT2YgdGhlc2UsIHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAqIGAhYCAtIGVzY2FwZWQgc3RyaW5nXG4gKiAgKiBgK2AgLSBub24tbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgLWAgLSBuZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAjYCAtIG1hbmlmZXN0IGNvbnN0YW50XG4gKiAgKiBgJWAgLSBzeW1ib2xcbiAqICAqIGAkYCAtIHJlbW90YWJsZVxuICogICogYCZgIC0gcHJvbWlzZVxuICpcbiAqIEFsbCBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgKGBcIicoKSosYCkgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxuICpcbiAqIFRoZSBtYW5pZmVzdCBjb25zdGFudHMgdGhhdCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgZm9yIHZhbHVlczpcbiAqICAqIGAjdW5kZWZpbmVkYFxuICogICogYCNOYU5gXG4gKiAgKiBgI0luZmluaXR5YFxuICogICogYCMtSW5maW5pdHlgXG4gKlxuICogYW5kIGZvciBwcm9wZXJ0eSBuYW1lcyBhbmFsb2dvdXMgdG8gY2FwZGF0YSBAcWNsYXNzOlxuICogICogYCN0YWdgXG4gKiAgKiBgI2Vycm9yYFxuICpcbiAqIEFsbCBvdGhlciBlbmNvZGVkIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYCNgIGFyZSByZXNlcnZlZCBmb3JcbiAqIGZ1dHVyZSB1c2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRTdHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzdGFydHNTcGVjaWFsID0gZW5jb2RlZFN0ciA9PiB7XG4gIGlmIChlbmNvZGVkU3RyID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKiBjaGFyQ29kZUF0KDApIGFuZCBudW1iZXIgY29tcGFyZSBpcyBhIGJpdCBmYXN0ZXIuKi9cbiAgY29uc3QgY29kZSA9IGVuY29kZWRTdHIuY2hhckNvZGVBdCgwKTtcbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHlvZGEqL1xuICByZXR1cm4gQkFORyA8PSBjb2RlICYmIGNvZGUgPD0gREFTSDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGVPYmplY3QsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZUVycm9yVG9TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzID0gcmVtID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSBwcm9tID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSBlcnIgPT5cbiAgRmFpbGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvU21hbGxjYXBzT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBlbmNvZGVPcHRpb25zIGlzIGFjdHVhbGx5IG9wdGlvbmFsLCBidXQgbm90IG1hcmtlZCBhcyBzdWNoIHRvIHdvcmsgYXJvdW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMjg2XG4gKlxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nfVxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVRvU21hbGxjYXBzID0gKGVuY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG4gICAgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbiAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzID0gZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHMsXG4gIH0gPSBlbmNvZGVPcHRpb25zO1xuXG4gIGNvbnN0IGFzc2VydEVuY29kZWRFcnJvciA9IGVuY29kaW5nID0+IHtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnb2JqZWN0JyAmJiBoYXNPd24oZW5jb2RpbmcsICcjZXJyb3InKSkgfHxcbiAgICAgIEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG4gICAgICAgIGVuY29kaW5nLFxuICAgICAgKX1gO1xuICAgIC8qIEFzc2VydCB0aGF0IHRoZSAjZXJyb3IgcHJvcGVydHkgZGVjb2RlcyB0byBhIHN0cmluZy4qL1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmNvZGluZ1snI2Vycm9yJ107XG4gICAgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyAmJlxuICAgICAgKCFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpIHx8IG1lc3NhZ2UuY2hhckF0KDApID09PSAnIScpKSB8fFxuICAgICAgRmFpbGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIHN0cmluZyBtZXNzYWdlOiAke3EobWVzc2FnZSl9YDtcbiAgfTtcblxuICAvKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZWx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHthbnl9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7U21hbGxjYXBzRW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb1NtYWxsY2Fwc2AgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb1NtYWxsY2Fwc2AgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbiAgY29uc3QgZW5jb2RlVG9TbWFsbGNhcHNSZWN1ciA9IHBhc3NhYmxlID0+IHtcbiAgICAvKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbiAgICAvKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgaW50byBzbWFsbGNhcHMgc3RyaW5ncy4qL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzoge1xuICAgICAgICAvKiBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG4gICAgICAgIHJldHVybiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgaWYgKHN0YXJ0c1NwZWNpYWwocGFzc2FibGUpKSB7XG4gICAgICAgICAgLyogU3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYSBzcGVjaWFsIGNoYXIgYXJlIHF1b3RlZCB3aXRoIGAhYC4qL1xuICAgICAgICAgIC8qIFNpbmNlIGAhYCBpcyBpdHNlbGYgYSBzcGVjaWFsIGNoYXJhY3RlciwgdGhpcyB0cml2aWFsbHkgZG9lcyovXG4gICAgICAgICAgLyogdGhlIEhpbGJlcnQgaG90ZWwuIEFsc28sIHNpbmNlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlKi9cbiAgICAgICAgICAvKiBhIGNvbnRpbnVvdXMgc3VicmFuZ2Ugb2YgYXNjaWksIHRoaXMgcXVvdGluZyBpcyBzb3J0LW9yZGVyKi9cbiAgICAgICAgICAvKiBwcmVzZXJ2aW5nLiovXG4gICAgICAgICAgcmV0dXJuIGAhJHtwYXNzYWJsZX1gO1xuICAgICAgICB9XG4gICAgICAgIC8qIEFsbCBvdGhlciBzdHJpbmdzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4gJyN1bmRlZmluZWQnO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICAvKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFzc2FibGUpKSB7XG4gICAgICAgICAgcmV0dXJuICcjTmFOJztcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4gJyNJbmZpbml0eSc7XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IC1JbmZpbml0eSkge1xuICAgICAgICAgIHJldHVybiAnIy1JbmZpbml0eSc7XG4gICAgICAgIH1cbiAgICAgICAgLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xuICAgICAgICByZXR1cm4gaXMocGFzc2FibGUsIC0wKSA/IDAgOiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgY29uc3Qgc3RyID0gU3RyaW5nKHBhc3NhYmxlKTtcbiAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7YmlnaW50fSAqLyAocGFzc2FibGUpIDwgMG4gPyBzdHIgOiBgKyR7c3RyfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKSk7XG4gICAgICAgIHJldHVybiBgJSR7bmFtZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbiAgICAgICAgLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbiAgICAgICAgLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbiAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG4gICAgICAgIHJldHVybiBmcm9tRW50cmllcyhcbiAgICAgICAgICBuYW1lcy5tYXAobmFtZSA9PiBbXG4gICAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKG5hbWUpLFxuICAgICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZVtuYW1lXSksXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG4gICAgICB9XG4gICAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICAgIC8qIFRPRE8gaW1wbGVtZW50Ki9cbiAgICAgICAgdGhyb3cgRmFpbGBtYXJzYWwgb2YgYnl0ZUFycmF5IG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7cGFzc2FibGV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAnI3RhZyc6IGVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnICYmIHJlc3VsdC5jaGFyQXQoMCkgPT09ICckJykge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJFwiOiAke3Jlc3VsdH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzKFxuICAgICAgICAgIHBhc3NhYmxlLFxuICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyAmJiByZXN1bHQuY2hhckF0KDApID09PSAnJicpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJlwiOiAke3Jlc3VsdH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsIGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuICAgICAgICBhc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgWGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzID0gcGFzc2FibGUgPT4ge1xuICAgIGlmIChpc0Vycm9yTGlrZShwYXNzYWJsZSkpIHtcbiAgICAgIC8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuICAgICAgLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbiAgICAgIC8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4gICAgICAvKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbiAgICAgIC8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbiAgICAgIC8qKi9cbiAgICAgIC8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuICAgICAgLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuICAgICAgLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4gICAgICAvKiB0aGlzIGluZm9ybWF0aW9uLiovXG4gICAgICBjb25zdCByZXN1bHQgPSBoYXJkZW4oXG4gICAgICAgIGVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsIGVuY29kZVRvU21hbGxjYXBzUmVjdXIpLFxuICAgICAgKTtcbiAgICAgIGFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlKSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHMpO1xufTskaM2PX29uY2UubWFrZUVuY29kZVRvU21hbGxjYXBzKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5oYXJkZW4obWFrZUVuY29kZVRvU21hbGxjYXBzKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGVPYmplY3R9IFtkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgPSBlbmNvZGluZyA9PlxuICBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7cShlbmNvZGluZyl9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogU21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2FwcyxcbiAgfSA9IGRlY29kZU9wdGlvbnM7XG5cbiAgLyoqXG4gKiBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbWF5IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBgZW5jb2RpbmdgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb1NtYWxsY2Fwc2BcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgY2Fubm90IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7U21hbGxjYXBzRW5jb2Rpbmd9IGVuY29kaW5nIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuICBjb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT4ge1xuICAgIHN3aXRjaCAodHlwZW9mIGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBpZiAoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGMgPSBlbmNvZGluZy5jaGFyQXQoMCk7XG4gICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgICAgICAvKiB1bi1oaWxiZXJ0LWlmeSB0aGUgc3RyaW5nKi9cbiAgICAgICAgICAgIHJldHVybiBlbmNvZGluZy5zbGljZSgxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJSc6IHtcbiAgICAgICAgICAgIHJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2Rpbmcuc2xpY2UoMSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICcjJzoge1xuICAgICAgICAgICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgICAgICAgICBjYXNlICcjdW5kZWZpbmVkJzoge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnI05hTic6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJyNJbmZpbml0eSc6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnIy1JbmZpbml0eSc6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgICAgICAgIFhgdW5rbm93biBjb25zdGFudCBcIiR7cShlbmNvZGluZyl9XCJgLFxuICAgICAgICAgICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgICAgY2FzZSAnLSc6IHtcbiAgICAgICAgICAgIHJldHVybiBCaWdJbnQoZW5jb2RpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICckJzoge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyhcbiAgICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLyogQHRzLWlnbm9yZSBYWFggU21hbGxDYXBzRW5jb2RpbmcqL1xuICAgICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKHJlc3VsdCkgIT09ICdyZW1vdGFibGUnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJic6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocGFzc1N0eWxlT2YocmVzdWx0KSAhPT0gJ3Byb21pc2UnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYFNwZWNpYWwgY2hhciAke3EoXG4gICAgICAgICAgICAgIGMsXG4gICAgICAgICAgICApfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgICBpZiAoZW5jb2RpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShlbmNvZGluZykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RpbmcubWFwKHZhbCA9PiBkZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093bihlbmNvZGluZywgJyN0YWcnKSkge1xuICAgICAgICAgIGNvbnN0IHsgJyN0YWcnOiB0YWcsIHBheWxvYWQsIC4uLnJlc3QgfSA9IGVuY29kaW5nO1xuICAgICAgICAgIHR5cGVvZiB0YWcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG4gICAgICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgIEZhaWxgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbiAgICAgICAgICByZXR1cm4gbWFrZVRhZ2dlZChcbiAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHModGFnKSxcbiAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMocGF5bG9hZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd24oZW5jb2RpbmcsICcjZXJyb3InKSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbiAgICAgICAgICAgIGVuY29kaW5nLFxuICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHBhc3NTdHlsZU9mKHJlc3VsdCkgPT09ICdlcnJvcicgfHxcbiAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlY29kZUVudHJ5ID0gKFtlbmNvZGVkTmFtZSwgZW5jb2RlZFZhbF0pID0+IHtcbiAgICAgICAgICB0eXBlb2YgZW5jb2RlZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYFByb3BlcnR5IG5hbWUgJHtxKFxuICAgICAgICAgICAgICBlbmNvZGVkTmFtZSxcbiAgICAgICAgICAgICl9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgIGVuY29kZWROYW1lLmNoYXJBdCgwKSAhPT0gJyMnIHx8XG4gICAgICAgICAgICBGYWlsYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbiAgICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICByZXR1cm4gW25hbWUsIGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBkZWNvZGVkRW50cmllcyA9IGVudHJpZXMoZW5jb2RpbmcpLm1hcChkZWNvZGVFbnRyeSk7XG4gICAgICAgIHJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG4gICAgICAgICAgICB0eXBlb2YgZW5jb2RpbmcsXG4gICAgICAgICAgKX06ICR7ZW5jb2Rpbmd9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFyZGVuKGRlY29kZUZyb21TbWFsbGNhcHMpO1xufTskaM2PX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVuY29kZVRvU21hbGxjYXBzIjpbIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABCdBXpvkIAAL5CAAAqAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtanVzdGluLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbImRlY29kZVRvSnVzdGluIiwicGFzc2FibGVBc0p1c3RpbiIsInFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxYLEZhaWwsTmF0LGdldEVycm9yQ29uc3RydWN0b3IsaXNQcmltaXRpdmUsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxRQ0xBU1MsbWFrZU1hcnNoYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dXV0sW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7U3RyaW5nYWJsZVBheWxvYWR9IGZyb20gJ3Nlcyc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtFbmNvZGluZ30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgc3RyaW5naWZ5OiBxdW90ZSB9ID0gSlNPTjtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbmRlbnRlclxuICogQHByb3BlcnR5IHsob3BlbkJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBvcGVuXG4gKiBAcHJvcGVydHkgeygpID0+IG51bWJlcn0gbGluZVxuICogQHByb3BlcnR5IHsodG9rZW46IHN0cmluZykgPT4gbnVtYmVyfSBuZXh0XG4gKiBAcHJvcGVydHkgeyhjbG9zZUJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBjbG9zZVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGRvbmVcbiAqL1xuXG4vKipcbiAqIEdlbmVyb3VzIHdoaXRlc3BhY2UgZm9yIHJlYWRhYmlsaXR5XG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlWWVzSW5kZW50ZXIgPSAoKSA9PiB7XG4gIGNvbnN0IHN0cmluZ3MgPSBbXTtcbiAgbGV0IGxldmVsID0gMDtcbiAgbGV0IG5lZWRTcGFjZSA9IGZhbHNlO1xuICBjb25zdCBsaW5lID0gKCkgPT4ge1xuICAgIG5lZWRTcGFjZSA9IGZhbHNlO1xuICAgIHJldHVybiBzdHJpbmdzLnB1c2goJ1xcbicsICcgICcucmVwZWF0KGxldmVsKSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG9wZW46IG9wZW5CcmFja2V0ID0+IHtcbiAgICAgIGxldmVsICs9IDE7XG4gICAgICBpZiAobmVlZFNwYWNlKSB7XG4gICAgICAgIHN0cmluZ3MucHVzaCgnICcpO1xuICAgICAgfVxuICAgICAgbmVlZFNwYWNlID0gZmFsc2U7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KTtcbiAgICB9LFxuICAgIGxpbmUsXG4gICAgbmV4dDogdG9rZW4gPT4ge1xuICAgICAgaWYgKG5lZWRTcGFjZSAmJiB0b2tlbiAhPT0gJywnICYmIHRva2VuICE9PSAnKScpIHtcbiAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICB9XG4gICAgICBuZWVkU3BhY2UgPSB0cnVlO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gICAgfSxcbiAgICBjbG9zZTogY2xvc2VCcmFja2V0ID0+IHtcbiAgICAgIGFzc2VydChsZXZlbCA+PSAxKTtcbiAgICAgIGxldmVsIC09IDE7XG4gICAgICBsaW5lKCk7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gICAgfSxcbiAgICBkb25lOiAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwobGV2ZWwsIDApO1xuICAgICAgcmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIElmIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBvbmUgdG9rZW4gdG9nZXRoZXIgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyXG4gKiBvZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoaXMgcGF0dGVybiwgdGhlbiB0aGUgdHdvIHRva2VucyBtdXN0IGJlXG4gKiBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSB0byBwcmVzZXJ2ZSB0aGVpciBtZWFuaW5nLiBPdGhlcndpc2UgdGhlXG4gKiB3aGl0ZXNwYWNlIGluIHVubmVjZXNzYXJ5LlxuICpcbiAqIFRoZSBgPCFgIGFuZCBgLT5gIGNhc2VzIHByZXZlbnQgdGhlIGFjY2lkZW50YWwgZm9ybWF0aW9uIG9mIGFuXG4gKiBodG1sLWxpa2UgY29tbWVudC4gSSBkb24ndCB0aGluayB0aGUgZG91YmxlIGFuZ2xlIGJyYWNrZXRzIGFyZSBhY3R1YWxseVxuICogbmVlZGVkIGJ1dCBJIGhhdmVuJ3QgdGhvdWdodCBhYm91dCBpdCBlbm91Z2ggdG8gcmVtb3ZlIHRoZW0uXG4gKi9cbmNvbnN0IGJhZFBhaXJQYXR0ZXJuID0gL14oPzpcXHdcXHd8PDx8Pj58XFwrXFwrfC0tfDwhfC0+KSQvO1xuXG4vKipcbiAqIE1pbmltdW0gd2hpdGVzcGFjZSBuZWVkZWQgdG8gcHJlc2V2ZSBtZWFuaW5nLlxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZU5vSW5kZW50ZXIgPSAoKSA9PiB7XG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IHN0cmluZ3MgPSBbXTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgb3Blbjogb3BlbkJyYWNrZXQgPT4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KSxcbiAgICBsaW5lOiAoKSA9PiBzdHJpbmdzLmxlbmd0aCxcbiAgICBuZXh0OiB0b2tlbiA9PiB7XG4gICAgICBpZiAoc3RyaW5ncy5sZW5ndGggPj0gMSkge1xuICAgICAgICBjb25zdCBsYXN0ID0gc3RyaW5nc1tzdHJpbmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyAtLSBlcnJvciovXG4gICAgICAgIGlmIChsYXN0Lmxlbmd0aCA+PSAxICYmIHRva2VuLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgY29uc3QgcGFpciA9IGAke2xhc3RbbGFzdC5sZW5ndGggLSAxXX0ke3Rva2VuWzBdfWA7XG4gICAgICAgICAgaWYgKGJhZFBhaXJQYXR0ZXJuLnRlc3QocGFpcikpIHtcbiAgICAgICAgICAgIHN0cmluZ3MucHVzaCgnICcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gICAgfSxcbiAgICBjbG9zZTogY2xvc2VCcmFja2V0ID0+IHtcbiAgICAgIGlmIChzdHJpbmdzLmxlbmd0aCA+PSAxICYmIHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXSA9PT0gJywnKSB7XG4gICAgICAgIHN0cmluZ3MucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gICAgfSxcbiAgICBkb25lOiAoKSA9PiBzdHJpbmdzLmpvaW4oJycpLFxuICB9KTtcbn07XG5cbmNvbnN0IGlkZW50UGF0dGVybiA9IC9eW2EtekEtWl1cXHcqJC87XG5oYXJkZW4oaWRlbnRQYXR0ZXJuKTtcbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuID0gL15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHNob3VsZEluZGVudFxuICogQHBhcmFtIHthbnlbXX0gW3Nsb3RzXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW4gPSAoZW5jb2RpbmcsIHNob3VsZEluZGVudCA9IGZhbHNlLCBzbG90cyA9IFtdKSA9PiB7XG4gIC8qKlxuICogVGhlIGZpcnN0IHBhc3MgZG9lcyBzb21lIGlucHV0IHZhbGlkYXRpb24uXG4gKiBJdHMgY29udHJvbCBmbG93IHNob3VsZCBtaXJyb3IgYHJlY3VyYCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlXG4gKiBhbmQgdGhlIHR3byBzaG91bGQgYmUgbWFpbnRhaW5lZCB0b2dldGhlci4gVGhleSBtdXN0IHZpc2l0IGV2ZXJ5dGhpbmdcbiAqIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIFRPRE8gbm93IHRoYXQgaWJpZHMgYXJlIGdvbmUsIHdlIHNob3VsZCBmb2xkIHRoaXMgYmFjayB0b2dldGhlciBpbnRvXG4gKiBvbmUgdmFsaWRhdGluZyBwYXNzLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gIGNvbnN0IHByZXBhcmUgPSByYXdUcmVlID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUocmF3VHJlZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG4gICAgYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCAnb2JqZWN0Jyk7XG4gICAgYXNzZXJ0KHJhd1RyZWUgIT09IG51bGwpO1xuICAgIGlmIChRQ0xBU1MgaW4gcmF3VHJlZSkge1xuICAgICAgY29uc3QgcWNsYXNzID0gcmF3VHJlZVtRQ0xBU1NdO1xuICAgICAgdHlwZW9mIHFjbGFzcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgRmFpbGBpbnZhbGlkIHFjbGFzcyB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG4gICAgICBhc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuICAgICAgc3dpdGNoIChyYXdUcmVlWydAcWNsYXNzJ10pIHtcbiAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgY2FzZSAnTmFOJzpcbiAgICAgICAgY2FzZSAnSW5maW5pdHknOlxuICAgICAgICBjYXNlICctSW5maW5pdHknOiB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgICBjb25zdCB7IGRpZ2l0cyB9ID0gcmF3VHJlZTtcbiAgICAgICAgICB0eXBlb2YgZGlnaXRzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgICBjb25zdCBzeW0gPSBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihzeW0sICdzeW1ib2wnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHsgdGFnLCBwYXlsb2FkIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YodGFnLCAnc3RyaW5nJyk7XG4gICAgICAgICAgcHJlcGFyZShwYXlsb2FkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICBjb25zdCB7IGluZGV4LCBpZmFjZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKGluZGV4LCAnbnVtYmVyJyk7XG4gICAgICAgICAgTmF0KGluZGV4KTtcbiAgICAgICAgICBpZiAoaWZhY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihpZmFjZSwgJ3N0cmluZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSByYXdUcmVlO1xuICAgICAgICAgICdvcmlnaW5hbCcgaW4gcmF3VHJlZSB8fFxuICAgICAgICAgICAgRmFpbGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtyYXdUcmVlfWA7XG4gICAgICAgICAgcHJlcGFyZShvcmlnaW5hbCk7XG4gICAgICAgICAgaWYgKCdyZXN0JyBpbiByYXdUcmVlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3QgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIG51bGxgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQXJyYXkocmVzdCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgYW4gYXJyYXlgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFFDTEFTUyBpbiByZXN0KSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCBlbmNvZGluZyAke3Jlc3R9IG11c3Qgbm90IGNvbnRhaW4gJHtxKFFDTEFTUyl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyZXN0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICAgICBGYWlsYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgICAgICBwcmVwYXJlKHJlc3RbbmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lLCBtZXNzYWdlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIG5hbWUpfWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGdldEVycm9yQ29uc3RydWN0b3IobmFtZSkgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgRmFpbGBNdXN0IGJlIHRoZSBuYW1lIG9mIGFuIEVycm9yIGNvbnN0cnVjdG9yICR7bmFtZX1gO1xuICAgICAgICAgIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgbWVzc2FnZSl9YDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgYXNzZXJ0LmZhaWwoWGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsIFR5cGVFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmF3VHJlZSkpIHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSByYXdUcmVlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBwcmVwYXJlKHJhd1RyZWVbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmF3VHJlZSk7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IEZhaWxgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgIH1cbiAgICAgICAgcHJlcGFyZShyYXdUcmVlW25hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbWFrZUluZGVudGVyID0gc2hvdWxkSW5kZW50ID8gbWFrZVllc0luZGVudGVyIDogbWFrZU5vSW5kZW50ZXI7XG4gIGxldCBvdXQgPSBtYWtlSW5kZW50ZXIoKTtcblxuICAvKipcbiAqIFRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIHJlY3Vyc2lvbiBhZnRlciB0aGUgZmlyc3QgcGFzcyBgcHJlcGFyZWAuXG4gKiBUaGUgZmlyc3QgcGFzcyBkaWQgc29tZSBpbnB1dCB2YWxpZGF0aW9uIHNvXG4gKiBoZXJlIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGV2ZXJ5dGhpbmcgdGhvc2UgdGhpbmdzIGFyZSB2YWxpZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICBjb25zdCBkZWNvZGUgPSByYXdUcmVlID0+IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgIHJldHVybiByZWN1cihyYXdUcmVlKTtcbiAgfTtcblxuICBjb25zdCBkZWNvZGVQcm9wZXJ0eSA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgIG91dC5saW5lKCk7XG4gICAgaWYgKG5hbWUgPT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAvKiBKYXZhU2NyaXB0IGludGVycHJldHMgYHtfX3Byb3RvX186IHgsIC4uLn1gKi9cbiAgICAgIC8qIGFzIG1ha2luZyBhbiBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGB4YCwgd2hlcmVhcyovXG4gICAgICAvKiBpbiBKU09OIGl0IGlzIHNpbXBseSBhIHByb3BlcnR5IG5hbWUuIFByZXNlcnZlIHRoZSovXG4gICAgICAvKiBKU09OIG1lYW5pbmcuKi9cbiAgICAgIG91dC5uZXh0KGBbXCJfX3Byb3RvX19cIl06YCk7XG4gICAgfSBlbHNlIGlmIChpZGVudFBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgb3V0Lm5leHQoYCR7bmFtZX06YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5uZXh0KGAke3F1b3RlKG5hbWUpfTpgKTtcbiAgICB9XG4gICAgZGVjb2RlKHZhbHVlKTtcbiAgICBvdXQubmV4dCgnLCcpO1xuICB9O1xuXG4gIC8qKlxuICogTW9kZWxlZCBhZnRlciBgZnVsbFJldml2ZWAgaW4gbWFyc2hhbC5qc1xuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgY29uc3QgcmVjdXIgPSByYXdUcmVlID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUocmF3VHJlZSkpIHtcbiAgICAgIC8qIHByaW1pdGl2ZXMgZ2V0IHF1b3RlZCovXG4gICAgICByZXR1cm4gb3V0Lm5leHQocXVvdGUocmF3VHJlZSkpO1xuICAgIH1cbiAgICAvKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbiAgICBhc3NlcnQudHlwZW9mKHJhd1RyZWUsICdvYmplY3QnKTtcbiAgICBhc3NlcnQocmF3VHJlZSAhPT0gbnVsbCk7XG4gICAgaWYgKFFDTEFTUyBpbiByYXdUcmVlKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSByYXdUcmVlW1FDTEFTU107XG4gICAgICBhc3NlcnQudHlwZW9mKHFjbGFzcywgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbiAgICAgIC8qIFN3aXRjaGluZyBvbiBgZW5jb2RlZFtRQ0xBU1NdYCAob3IgYW55dGhpbmcgbGVzcyBkaXJlY3QsIGxpa2UqL1xuICAgICAgLyogYHFjbGFzc2ApIGRvZXMgbm90IGRpc2NyaW1pbmF0ZSByYXdUcmVlIGluIHR5cGVzY3JpcHRANC4yLjMgYW5kKi9cbiAgICAgIC8qIGVhcmxpZXIuKi9cbiAgICAgIHN3aXRjaCAocmF3VHJlZVsnQHFjbGFzcyddKSB7XG4gICAgICAgIC8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ05hTic6XG4gICAgICAgIGNhc2UgJ0luZmluaXR5JzpcbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIC8qIFRoZWlyIHFjbGFzcyBpcyB0aGVpciBleHByZXNzaW9uIHNvdXJjZS4qL1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgICBjb25zdCB7IGRpZ2l0cyB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKGRpZ2l0cywgJ3N0cmluZycpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgJHtCaWdJbnQoZGlnaXRzKX1uYCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIC8qIFRPRE8gZGVwcmVjYXRlZC4gRXZlbnR1YWxseSByZW1vdmUuKi9cbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgICBjb25zdCBzeW0gPSBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihzeW0sICdzeW1ib2wnKTtcbiAgICAgICAgICBjb25zdCByZWdpc3RlcmVkTmFtZSA9IG5hbWVGb3JQYXNzYWJsZVN5bWJvbChzeW0pO1xuICAgICAgICAgIGlmIChyZWdpc3RlcmVkTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IEF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG4gICAgICAgICAgICBhc3NlcnQobWF0Y2ggIT09IG51bGwpO1xuICAgICAgICAgICAgY29uc3Qgc3VmZml4ID0gbWF0Y2hbMV07XG4gICAgICAgICAgICBhc3NlcnQoU3ltYm9sW3N1ZmZpeF0gPT09IHN5bSk7XG4gICAgICAgICAgICBhc3NlcnQoaWRlbnRQYXR0ZXJuLnRlc3Qoc3VmZml4KSk7XG4gICAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYFN5bWJvbC4ke3N1ZmZpeH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBwYXNzYWJsZVN5bWJvbEZvck5hbWUoJHtxdW90ZShyZWdpc3RlcmVkTmFtZSl9KWApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBvdXQubmV4dChgbWFrZVRhZ2dlZCgke3F1b3RlKHRhZyl9YCk7XG4gICAgICAgICAgb3V0Lm5leHQoJywnKTtcbiAgICAgICAgICBkZWNvZGUocGF5bG9hZCk7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KCcpJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdzbG90Jzoge1xuICAgICAgICAgIGNvbnN0IHsgaWZhY2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoTmF0KHJhd1RyZWUuaW5kZXgpKTtcbiAgICAgICAgICBjb25zdCBuZXN0ZWRSZW5kZXIgPSBhcmcgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2xkT3V0ID0gb3V0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgb3V0ID0gbWFrZU5vSW5kZW50ZXIoKTtcbiAgICAgICAgICAgICAgZGVjb2RlKGFyZyk7XG4gICAgICAgICAgICAgIHJldHVybiBvdXQuZG9uZSgpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgb3V0ID0gb2xkT3V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGluZGV4IDwgc2xvdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJlZFNsb3QgPSBuZXN0ZWRSZW5kZXIoc2xvdHNbaW5kZXhdKTtcbiAgICAgICAgICAgIHJldHVybiBpZmFjZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gb3V0Lm5leHQoYHNsb3RUb1ZhbCgke3JlbmRlcmVkU2xvdH0pYClcbiAgICAgICAgICAgICAgOiBvdXQubmV4dChgc2xvdFRvVmFsKCR7cmVuZGVyZWRTbG90fSwke25lc3RlZFJlbmRlcihpZmFjZSl9KWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaWZhY2UgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBvdXQubmV4dChgc2xvdCgke2luZGV4fSlgKVxuICAgICAgICAgICAgOiBvdXQubmV4dChgc2xvdCgke2luZGV4fSwke25lc3RlZFJlbmRlcihpZmFjZSl9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSByYXdUcmVlO1xuICAgICAgICAgIG91dC5vcGVuKCd7Jyk7XG4gICAgICAgICAgZGVjb2RlUHJvcGVydHkoUUNMQVNTLCBvcmlnaW5hbCk7XG4gICAgICAgICAgaWYgKCdyZXN0JyBpbiByYXdUcmVlKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKHJlc3QsICdvYmplY3QnKTtcbiAgICAgICAgICAgIGFzc2VydChyZXN0ICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyZXN0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRmFpbGBQcm9wZXJ0eSBuYW1lICR7cShcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgKX0gb2YgJHtyZXN0fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShuYW1lLCByZXN0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnfScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICBjYXVzZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVycm9ycyA9IHVuZGVmaW5lZCxcbiAgICAgICAgICB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBjYXVzZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYGVycm9yIGNhdXNlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIG5hbWUgIT09IGBBZ2dyZWdhdGVFcnJvcmAgfHxcbiAgICAgICAgICAgIEZhaWxgQWdncmVnYXRlRXJyb3Igbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG4gICAgICAgICAgZXJyb3JzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgZXJyb3IgZXJyb3JzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgJHtuYW1lfSgke3F1b3RlKG1lc3NhZ2UpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgIFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuICAgICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmF3VHJlZSkpIHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSByYXdUcmVlO1xuICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQub3BlbignWycpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgb3V0LmxpbmUoKTtcbiAgICAgICAgICBkZWNvZGUocmF3VHJlZVtpXSk7XG4gICAgICAgICAgb3V0Lm5leHQoJywnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIHJhd1RyZWUgaXMgYW4gYEVuY29kaW5nUmVjb3JkYCB3aGljaCBvbmx5IGhhcyBzdHJpbmcga2V5cywqL1xuICAgICAgLyogYnV0IHNpbmNlIG93bktleXMgaXMgbm90IGdlbmVyaWMsIGl0IGNhbid0IHByb3BhZ2F0ZSB0aGF0Ki9cbiAgICAgIGNvbnN0IG5hbWVzID0gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKG93bktleXMocmF3VHJlZSkpO1xuICAgICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ3t9Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQub3BlbigneycpO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShuYW1lLCByYXdUcmVlW25hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBwcmVwYXJlKGVuY29kaW5nKTtcbiAgZGVjb2RlKGVuY29kaW5nKTtcbiAgcmV0dXJuIG91dC5kb25lKCk7XG59OyRozY9fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Nob3VsZEluZGVudF1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbiAgICAgICBjb25zdCBwYXNzYWJsZUFzSnVzdGluID0gKHBhc3NhYmxlLCBzaG91bGRJbmRlbnQgPSB0cnVlKSA9PiB7XG4gIGxldCBzbG90Q291bnQgPSAwO1xuICAvKiBVc2luZyBwb3N0LWluY3JlbWVudCBiZWxvdyBvbmx5IHNvIHRoYXQgdGhlIGluZGV4ZXMgc3RhcnQgYXQgemVybyovXG4gIC8qIGFuZCB0aGUgYHNsb3RDb3VudGAgdmFyaWFibGUgY2FuIGJlIGluaXRpYWxpemVkIHRvIGAwYCByYXRoZXIgdGhhbiovXG4gIC8qIGAtMWAuKi9cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzKi9cbiAgY29uc3QgY29udmVydFZhbFRvU2xvdCA9IHZhbCA9PiBgcyR7c2xvdENvdW50Kyt9YDtcbiAgY29uc3QgeyB0b0NhcERhdGEgfSA9IG1ha2VNYXJzaGFsKGNvbnZlcnRWYWxUb1Nsb3QpO1xuICBjb25zdCB7IGJvZHksIHNsb3RzIH0gPSB0b0NhcERhdGEocGFzc2FibGUpO1xuICBjb25zdCBlbmNvZGVkID0gSlNPTi5wYXJzZShib2R5KTtcbiAgcmV0dXJuIGRlY29kZVRvSnVzdGluKGVuY29kZWQsIHNob3VsZEluZGVudCwgc2xvdHMpO1xufTskaM2PX29uY2UucGFzc2FibGVBc0p1c3RpbihwYXNzYWJsZUFzSnVzdGluKTtcbmhhcmRlbihwYXNzYWJsZUFzSnVzdGluKTtcblxuLyogVGhlIGV4YW1wbGUgYmVsb3cgaXMgdGhlIGBwYXR0MWAgdGVzdCBjYXNlIGZyb20gYHFwLW9uLXBhdHRlcm4udGVzdC5qc2AuKi9cbi8qIFBsZWFzZSBjby1tYWludGFpbiB0aGUgZm9sbG93aW5nIGRvYy1jb21tZW50IGFuZCB0aGF0IHRlc3QgbW9kdWxlLiovXG4vKipcbiAqIGBxcGAgZm9yIHF1b3RlIHBhc3NhYmxlIGFzIGEgcXVhc2ktcXVvdGVkIEp1c3RpbiBleHByZXNzaW9uLlxuICpcbiAqIEJvdGggYHFgIGZyb20gYEBlbmRvL2Vycm9yc2AgYW5kIHRoaXMgYHFwYCBmcm9tIGBAZW5kby9tYXJzaGFsYCBjYW5cbiAqIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBgRmFpbGAsIGBYYCwgZXRjIGZyb20gYEBlbmRvL2Vycm9yc2AgdG8gbWFya1xuICogYSBzdWJzdGl0dXRpb24gdmFsdWUgdG8gYmUgYm90aFxuICogLSB2aXN1YWxseSBxdW90ZWQgaW4gc29tZSB1c2VmdWwgbWFubmVyXG4gKiAtIHVucmVkYWN0ZWRcbiAqXG4gKiBEaWZmZXJlbmNlczpcbiAqIC0gZ2l2ZW4gYSBwYXR0ZXJuIGBNLmFuZChNLmd0ZSgtMTAwKSwgTS5sdGUoMTAwKSlgLFxuICogICBgYGBqc1xuICogICBgJHtxKHBhdHQpfWBcbiAqICAgYGBgXG4gKiAgIHByb2R1Y2VzIGBcIlttYXRjaDphbmRdXCJgLCB3aGVyZWFzXG4gKiAgIGBgYGpzXG4gKiAgIGAke3FwKHBhdHQpfWBcbiAqICAgYGBgXG4gKiAgIHByb2R1Y2VzIHF1YXNpLXF1b3RlcyBKdXN0aW4gb2Ygd2hhdCB3b3VsZCBiZSBwYXNzZWQ6XG4gKiAgIGBgYGpzXG4gKiAgIGBtYWtlVGFnZ2VkKFwibWF0Y2g6YW5kXCIsIFtcbiAqICAgICBtYWtlVGFnZ2VkKFwibWF0Y2g6Z3RlXCIsIC0xMDApLFxuICogICAgIG1ha2VUYWdnZWQoXCJtYXRjaDpsdGVcIiwgMTAwKSxcbiAqICAgXSlgXG4gKiAgIGBgYFxuICogLSBgcWAgaXMgbGF6eSwgbWluaW1pemluZyB0aGUgY29zdCBmb3IgdXNpbmcgaXQgaW4gYW4gZXJyb3IgdGhhdCdzIG5ldmVyXG4gKiAgIGxvZ2dlZC4gVW5mb3J0dW5hdGVseSwgZHVlIHRvIGxheWVyaW5nIGNvbnN0cmFpbnRzLCBgcXBgIGlzIG5vdFxuICogICBsYXp5LCBhbHdheXMgcmVuZGVyaW5nIHRvIHF1YXNpLXF1b3RlZCBKdXN0aW4gaW1tZWRpYXRlbHkuXG4gKlxuICogU2luY2UgSnVzdGluIGlzIGEgc3Vic2V0IG9mIEhhcmRlbmVkSlMsIG5laXRoZXIgdGhlIG5hbWUgYHFwYCBub3IgdGhlXG4gKiByZW5kZXJlZCBmb3JtIG5lZWQgdG8gbWFrZSBjbGVhciB0aGF0IHRoZSByZW5kZXJlZCBmb3JtIGlzIGluIEp1c3RpbiByYXRoZXJcbiAqIHRoYW4gSGFyZGVuZWRKUy5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXlsb2FkXG4gKiBAcmV0dXJucyB7U3RyaW5nYWJsZVBheWxvYWR9XG4gKi9cbiAgICAgICBjb25zdCBxcCA9IHBheWxvYWQgPT4gYFxcYCR7cGFzc2FibGVBc0p1c3RpbihoYXJkZW4ocGF5bG9hZCksIHRydWUpfVxcYGA7JGjNj19vbmNlLnFwKHFwKTtcbmhhcmRlbihxcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWNvZGVUb0p1c3RpbiI6WyJkZWNvZGVUb0p1c3RpbiJdLCJwYXNzYWJsZUFzSnVzdGluIjpbInBhc3NhYmxlQXNKdXN0aW4iXSwicXAiOlsicXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAq3GB+KEJAAChCQAALQAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJwYXJzZSIsInN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbWFrZU1hcnNoYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJyAqL1xuXG5jb25zdCB7IGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFZhbFRvU2xvdCA9IHZhbCA9PlxuICBGYWlsYE1hcnNoYWwncyBzdHJpbmdpZnkgcmVqZWN0cyBwcmVzZW5jZXMgYW5kIHByb21pc2VzICR7dmFsfWA7XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsID0gKHNsb3QsIF9pZmFjZSkgPT5cbiAgRmFpbGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90cyAke3Nsb3R9YDtcblxuY29uc3QgYmFkQXJyYXlIYW5kbGVyID0gaGFyZGVuKHtcbiAgZ2V0OiAoX3RhcmdldCwgbmFtZSwgX3JlY2VpdmVyKSA9PiB7XG4gICAgaWYgKG5hbWUgPT09ICdsZW5ndGgnKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xuICAgIHRocm93IEZhaWxgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gIH0sXG59KTtcblxuLyoqXG4gKiBgZnJlZXplYCBidXQgbm90IGBoYXJkZW5gIHRoZSBwcm94eSB0YXJnZXQgc28gaXQgcmVtYWlucyB0cmFwcGluZy5cbiAqIFRodXMsIGl0IHNob3VsZCBub3QgYmUgc2hhcmVkIG91dHNpZGUgdGhpcyBtb2R1bGUuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2VzL2RvY3MvcHJlcGFyaW5nLWZvci1zdGFiaWxpemUubWRcbiAqL1xuY29uc3QgYXJyYXlUYXJnZXQgPSBmcmVlemUoLyoqIEB0eXBlIHthbnlbXX0gKi8gKFtdKSk7XG5jb25zdCBiYWRBcnJheSA9IG5ldyBQcm94eShhcnJheVRhcmdldCwgYmFkQXJyYXlIYW5kbGVyKTtcblxuY29uc3QgeyBzZXJpYWxpemUsIHVuc2VyaWFsaXplIH0gPSBtYWtlTWFyc2hhbChcbiAgZG9Ob3RDb252ZXJ0VmFsVG9TbG90LFxuICBkb05vdENvbnZlcnRTbG90VG9WYWwsXG4gIHtcbiAgICBlcnJvclRhZ2dpbmc6ICdvZmYnLFxuICAgIC8qIFRPRE8gZml4IHRlc3RzIHRvIHdvcmtzIHdpdGggc21hbGxjYXBzLiovXG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ2NhcGRhdGEnLFxuICB9LFxuKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHN0cmluZ2lmeSA9IHZhbCA9PiBzZXJpYWxpemUodmFsKS5ib2R5OyRozY9fb25jZS5zdHJpbmdpZnkoc3RyaW5naWZ5KTtcbmhhcmRlbihzdHJpbmdpZnkpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgcGFyc2UgPSBzdHIgPT5cbiAgdW5zZXJpYWxpemUoXG4gICAgLyogYGZyZWV6ZWAgYnV0IG5vdCBgaGFyZGVuYCBzaW5jZSB0aGUgYGJhZEFycmF5YCBwcm94eSBhbmQgaXRzIHRhcmdldCovXG4gICAgLyogbXVzdCByZW1haW4gdHJhcHBpbmcuKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3Nlcy9kb2NzL3ByZXBhcmluZy1mb3Itc3RhYmlsaXplLm1kKi9cbiAgICBmcmVlemUoe1xuICAgICAgYm9keTogc3RyLFxuICAgICAgc2xvdHM6IGJhZEFycmF5LFxuICAgIH0pLFxuICApOyRozY9fb25jZS5wYXJzZShwYXJzZSk7XG5oYXJkZW4ocGFyc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABlWIW1fD8AAHw/AAAjAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2VuY29kZVRvU21hbGxjYXBzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsYXNzZXJ0UGFzc2FibGUsZ2V0SW50ZXJmYWNlT2YsZ2V0RXJyb3JDb25zdHJ1Y3Rvcix0b1Bhc3NhYmxlRXJyb3IsWCxGYWlsLHEsbWFrZUVycm9yLGFubm90YXRlRXJyb3Isb2JqZWN0TWFwLFFDTEFTUyxtYWtlRW5jb2RlVG9DYXBEYXRhLG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyxtYWtlRW5jb2RlVG9TbWFsbGNhcHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRozY9fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJ0b1Bhc3NhYmxlRXJyb3JcIixbJGjNj19hID0+ICh0b1Bhc3NhYmxlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dLFtcIm1ha2VFbmNvZGVUb0NhcERhdGFcIixbJGjNj19hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjNj19hKV1dLFtcIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YVwiLFskaM2PX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9TbWFsbGNhcHMuanNcIiwgW1tcIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzXCIsWyRozY9fYSA9PiAobWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAkaM2PX2EpXV0sW1wibWFrZUVuY29kZVRvU21hbGxjYXBzXCIsWyRozY9fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q29udmVydFNsb3RUb1ZhbCwgQ29udmVydFZhbFRvU2xvdCwgRnJvbUNhcERhdGEsIE1ha2VNYXJzaGFsT3B0aW9ucywgVG9DYXBEYXRhfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBQYXNzYWJsZUNhcCwgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0ludGVyZmFjZVNwZWN9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7RW5jb2Rpbmd9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHsgZGVmaW5lUHJvcGVydGllcywgaGFzT3duIH0gPSBPYmplY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKiogQHR5cGUge0NvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbiA9IHggPT4geDtcbi8qKiBAdHlwZSB7Q29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFNsb3RUb1ZhbEZuID0gKHgsIF8pID0+IHg7XG5cbi8qKlxuICogQHRlbXBsYXRlIFNsb3RcbiAqIEBwYXJhbSB7Q29udmVydFZhbFRvU2xvdDxTbG90Pn0gW2NvbnZlcnRWYWxUb1Nsb3RdXG4gKiBAcGFyYW0ge0NvbnZlcnRTbG90VG9WYWw8U2xvdD59IFtjb252ZXJ0U2xvdFRvVmFsXVxuICogQHBhcmFtIHtNYWtlTWFyc2hhbE9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNYXJzaGFsID0gKFxuICBjb252ZXJ0VmFsVG9TbG90ID0gZGVmYXVsdFZhbFRvU2xvdEZuLFxuICBjb252ZXJ0U2xvdFRvVmFsID0gZGVmYXVsdFNsb3RUb1ZhbEZuLFxuICB7XG4gICAgZXJyb3JUYWdnaW5nID0gJ29uJyxcbiAgICBtYXJzaGFsTmFtZSA9ICdhbm9uLW1hcnNoYWwnLFxuICAgIC8qIFRPRE8gVGVtcG9yYXJ5IGhhY2suKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yNzgwKi9cbiAgICBlcnJvcklkTnVtID0gMTAwMDAsXG4gICAgLyogV2UgcHJlZmVyIHRoYXQgdGhlIGNhbGxlciBpbnN0ZWFkIGxvZyB0byBzb21ld2hlcmUgaGlkZGVuKi9cbiAgICAvKiB0byBiZSByZXZlYWxlZCB3aGVuIGNvcnJlbGF0aW5nIHdpdGggdGhlIHJlY2VpdmVkIGVycm9yLiovXG4gICAgbWFyc2hhbFNhdmVFcnJvciA9IGVyciA9PlxuICAgICAgY29uc29sZS5sb2coJ1RlbXBvcmFyeSBsb2dnaW5nIG9mIHNlbnQgZXJyb3InLCBlcnIpLFxuICAgIC8qIERlZmF1bHQgdG8gJ2NhcGRhdGEnIGJlY2F1c2UgaXQgd2FzIGltcGxlbWVudGVkIGZpcnN0LiovXG4gICAgLyogU29tZXRpbWVzLCBvbnRvZ2VueSBkb2VzIHJlY2FwaXR1bGF0ZSBwaHlsb2dlbnkgOykqL1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQgPSAnY2FwZGF0YScsXG4gIH0gPSB7fSxcbikgPT4ge1xuICBhc3NlcnQudHlwZW9mKG1hcnNoYWxOYW1lLCAnc3RyaW5nJyk7XG4gIGVycm9yVGFnZ2luZyA9PT0gJ29uJyB8fFxuICAgIGVycm9yVGFnZ2luZyA9PT0gJ29mZicgfHxcbiAgICBGYWlsYFRoZSBlcnJvclRhZ2dpbmcgb3B0aW9uIGNhbiBvbmx5IGJlIFwib25cIiBvciBcIm9mZlwiICR7ZXJyb3JUYWdnaW5nfWA7XG4gIGNvbnN0IG5leHRFcnJvcklkID0gKCkgPT4ge1xuICAgIGVycm9ySWROdW0gKz0gMTtcbiAgICByZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuICB9O1xuXG4gIC8qKlxuICogQHR5cGUge1RvQ2FwRGF0YTxTbG90Pn1cbiAqL1xuICBjb25zdCB0b0NhcERhdGEgPSByb290ID0+IHtcbiAgICBjb25zdCBzbG90cyA9IFtdO1xuICAgIC8qIG1hcHMgdmFsIChwcm9taXNlIG9yIHJlbW90YWJsZSkgdG8gaW5kZXggb2Ygc2xvdHNbXSovXG4gICAgY29uc3Qgc2xvdE1hcCA9IG5ldyBNYXAoKTtcblxuICAgIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZUNhcH0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHt7aW5kZXg6IG51bWJlciwgcmVwZWF0OiBib29sZWFufX1cbiAqL1xuICAgIGNvbnN0IGVuY29kZVNsb3RDb21tb24gPSBwYXNzYWJsZSA9PiB7XG4gICAgICBsZXQgaW5kZXggPSBzbG90TWFwLmdldChwYXNzYWJsZSk7XG4gICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBUT0RPIGFzc2VydCB0aGF0IGl0J3MgdGhlIHNhbWUgaWZhY2UgYXMgYmVmb3JlKi9cbiAgICAgICAgYXNzZXJ0LnR5cGVvZihpbmRleCwgJ251bWJlcicpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgaW5kZXgsIHJlcGVhdDogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgaW5kZXggPSBzbG90cy5sZW5ndGg7XG4gICAgICBjb25zdCBzbG90ID0gY29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG4gICAgICBzbG90cy5wdXNoKHNsb3QpO1xuICAgICAgc2xvdE1hcC5zZXQocGFzc2FibGUsIGluZGV4KTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBpbmRleCwgcmVwZWF0OiBmYWxzZSB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiB1bmtub3dufSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319XG4gKi9cbiAgICBjb25zdCBlbmNvZGVFcnJvckNvbW1vbiA9IChlcnIsIGVuY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZW5jb2RlUmVjdXIoYCR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICBhc3NlcnQudHlwZW9mKG1lc3NhZ2UsICdzdHJpbmcnKTtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbmNvZGVSZWN1cihgJHtlcnIubmFtZX1gKTtcbiAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgLyogVE9ETyBNdXN0IGVuY29kZSBgY2F1c2VgLCBgZXJyb3JzYCwgYnV0Ki9cbiAgICAgIC8qIG9ubHkgb25jZSBhbGwgcG9zc2libGUgY291bnRlcnBhcnR5IGRlY29kZXJzIGFyZSB0b2xlcmFudCBvZiovXG4gICAgICAvKiByZWNlaXZpbmcgdGhlbS4qL1xuICAgICAgaWYgKGVycm9yVGFnZ2luZyA9PT0gJ29uJykge1xuICAgICAgICAvKiBXZSBkZWxpYmVyYXRlbHkgZG8gbm90IHNoYXJlIHRoZSBzdGFjaywgYnV0IGl0IHdvdWxkKi9cbiAgICAgICAgLyogYmUgdXNlZnVsIHRvIGxvZyB0aGUgc3RhY2sgbG9jYWxseSBzbyBzb21lb25lIHdobyBoYXMqL1xuICAgICAgICAvKiBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgdGhyb3dpbmcgVmF0IGNhbiBjb3JyZWxhdGUqL1xuICAgICAgICAvKiB0aGUgcHJvYmxlbSB3aXRoIHRoZSByZW1vdGUgVmF0IHRoYXQgZ2V0cyB0aGlzKi9cbiAgICAgICAgLyogc3VtbWFyeS4gSWYgd2UgZG8gdGhhdCwgd2UgY291bGQgYWxsb2NhdGUgc29tZSByYW5kb20qL1xuICAgICAgICAvKiBpZGVudGlmaWVyIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBtZXNzYWdlLCB0byBoZWxwKi9cbiAgICAgICAgLyogd2l0aCB0aGUgY29ycmVsYXRpb24uKi9cbiAgICAgICAgY29uc3QgZXJyb3JJZCA9IGVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuICAgICAgICBhc3NlcnQudHlwZW9mKGVycm9ySWQsICdzdHJpbmcnKTtcbiAgICAgICAgYW5ub3RhdGVFcnJvcihlcnIsIFhgU2VudCBhcyAke2Vycm9ySWR9YCk7XG4gICAgICAgIG1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGVycm9ySWQsIG1lc3NhZ2UsIG5hbWUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgbWVzc2FnZSwgbmFtZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHNlcmlhbGl6ZUJvZHlGb3JtYXQgPT09ICdjYXBkYXRhJykge1xuICAgICAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlQ2FwfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbiAgICAgIGNvbnN0IGVuY29kZVNsb3RUb0NhcERhdGEgPSAocGFzc2FibGUsIGlmYWNlID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIHJlcGVhdCB9ID0gZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbiAgICAgICAgaWYgKHJlcGVhdCA9PT0gdHJ1ZSB8fCBpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnc2xvdCcsIGluZGV4IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ3Nsb3QnLCBpZmFjZSwgaW5kZXggfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8qKiBAdHlwZSB7KHByb21pc2U6IFJlbW90YWJsZU9iamVjdCwgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmcpID0+IEVuY29kaW5nfSAqL1xuICAgICAgY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gKHZhbCwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9DYXBEYXRhKHZhbCwgZ2V0SW50ZXJmYWNlT2YodmFsKSk7XG5cbiAgICAgIC8qKiBAdHlwZSB7KHByb21pc2U6IFByb21pc2UsIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nKSA9PiBFbmNvZGluZ30gKi9cbiAgICAgIGNvbnN0IGVuY29kZVByb21pc2VUb0NhcERhdGEgPSAocHJvbWlzZSwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9DYXBEYXRhKHByb21pc2UpO1xuXG4gICAgICAvKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIGlzRXJyb3JMaWtlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IEVuY29kaW5nfSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG4gICAgICBjb25zdCBlbmNvZGVFcnJvclRvQ2FwRGF0YSA9IChlcnIsIGVuY29kZVJlY3VyKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckRhdGEgPSBlbmNvZGVFcnJvckNvbW1vbihlcnIsIGVuY29kZVJlY3VyKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnZXJyb3InLCAuLi5lcnJEYXRhIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlVG9DYXBEYXRhID0gbWFrZUVuY29kZVRvQ2FwRGF0YSh7XG4gICAgICAgIGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbiAgICAgICAgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbiAgICAgICAgZW5jb2RlRXJyb3JUb0NhcERhdGEsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVRvQ2FwRGF0YShyb290KTtcbiAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBib2R5LFxuICAgICAgICBzbG90cyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplQm9keUZvcm1hdCA9PT0gJ3NtYWxsY2FwcycpIHtcbiAgICAgIC8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtQYXNzYWJsZUNhcH0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuICAgICAgY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzID0gKHByZWZpeCwgcGFzc2FibGUsIGlmYWNlID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIHJlcGVhdCB9ID0gZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbiAgICAgICAgLyogVE9ETyBleHBsb3JlIHJlbW92aW5nIHRoaXMgc3BlY2lhbCBjYXNlKi9cbiAgICAgICAgaWYgKHJlcGVhdCA9PT0gdHJ1ZSB8fCBpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IChyZW1vdGFibGUsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvU21hbGxjYXBzKCckJywgcmVtb3RhYmxlLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuICAgICAgY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gKHByb21pc2UsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJywgcHJvbWlzZSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgICBjb25zdCBlcnJEYXRhID0gZW5jb2RlRXJyb3JDb21tb24oZXJyLCBlbmNvZGVSZWN1cik7XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4ucmVzdCB9ID0gZXJyRGF0YTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7ICcjZXJyb3InOiBtZXNzYWdlLCAuLi5yZXN0IH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlVG9TbWFsbGNhcHMgPSBtYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuICAgICAgICBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbiAgICAgICAgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbiAgICAgIGNvbnN0IHNtYWxsY2Fwc0JvZHkgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICAvKiBWYWxpZCBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGEgdmFsaWQgc2lnbmFsKi9cbiAgICAgICAgLyogaW5kaWNhdGluZyBzbWFsbGNhcHMgZm9ybWF0LiovXG4gICAgICAgIGJvZHk6IGAjJHtzbWFsbGNhcHNCb2R5fWAsXG4gICAgICAgIHNsb3RzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIFRoZSBgdGhyb3dgIGlzIGEgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBBZGRlZCBmb3IgY29uZnVzZWQgbGludGVycy4qL1xuICAgICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VGdWxsUmV2aXZlID0gc2xvdHMgPT4ge1xuICAgIC8qKiBAdHlwZSB7TWFwPG51bWJlciwgUmVtb3RhYmxlT2JqZWN0IHwgUHJvbWlzZT59ICovXG4gICAgY29uc3QgdmFsTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgLyoqXG4gKiBAcGFyYW0ge3tpZmFjZT86IHN0cmluZywgaW5kZXg6IG51bWJlcn19IHNsb3REYXRhXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlT2JqZWN0IHwgUHJvbWlzZX1cbiAqL1xuICAgIGNvbnN0IGRlY29kZVNsb3RDb21tb24gPSBzbG90RGF0YSA9PiB7XG4gICAgICBjb25zdCB7IGlmYWNlID0gdW5kZWZpbmVkLCBpbmRleCwgLi4ucmVzdCB9ID0gc2xvdERhdGE7XG4gICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICBGYWlsYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG4gICAgICBjb25zdCBleHRhbnQgPSB2YWxNYXAuZ2V0KGluZGV4KTtcbiAgICAgIGlmIChleHRhbnQpIHtcbiAgICAgICAgcmV0dXJuIGV4dGFudDtcbiAgICAgIH1cbiAgICAgIC8qIFRPRE8gU0VDVVJJVFkgSEFaQVJEOiBtdXN0IGVuZm9jZSB0aGF0IHJlbW90YWJsZSB2cyBwcm9taXNlKi9cbiAgICAgIC8qIGlzIGFjY29yZGluZyB0byB0aGUgZW5jb2RlZCBzdHJpbmcuKi9cbiAgICAgIGNvbnN0IHNsb3QgPSBzbG90c1tOdW1iZXIoTmF0KGluZGV4KSldO1xuICAgICAgY29uc3QgdmFsID0gY29udmVydFNsb3RUb1ZhbChzbG90LCBpZmFjZSk7XG4gICAgICB2YWxNYXAuc2V0KGluZGV4LCB2YWwpO1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9O1xuXG4gICAgLyoqXG4gKiBAcGFyYW0ge3tcbiAqICAgZXJyb3JJZD86IHN0cmluZyxcbiAqICAgbWVzc2FnZTogc3RyaW5nLFxuICogICBuYW1lOiBzdHJpbmcsXG4gKiAgIGNhdXNlOiB1bmtub3duLFxuICogICBlcnJvcnM6IHVua25vd24sXG4gKiB9fSBlcnJEYXRhXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuICAgIGNvbnN0IGRlY29kZUVycm9yQ29tbW9uID0gKGVyckRhdGEsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGVycm9ySWQgPSB1bmRlZmluZWQsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNhdXNlID0gdW5kZWZpbmVkLFxuICAgICAgICBlcnJvcnMgPSB1bmRlZmluZWQsXG4gICAgICAgIC4uLnJlc3RcbiAgICAgIH0gPSBlcnJEYXRhO1xuICAgICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzIwNTIqL1xuICAgICAgLyogY2FwRGF0YSBkb2VzIG5vdCB0cmFuc2Zvcm0gc3RyaW5ncy4gVGhlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBjYWxscyovXG4gICAgICAvKiB0byBgZGVjb2RlUmVjdXJgIGFyZSBmb3IgcmV1c2UgYnkgb3RoZXIgZW5jb2RpbmdzIHRoYXQgZG8sKi9cbiAgICAgIC8qIHN1Y2ggYXMgc21hbGxjYXBzLiovXG4gICAgICBjb25zdCBkTmFtZSA9IGRlY29kZVJlY3VyKG5hbWUpO1xuICAgICAgY29uc3QgZE1lc3NhZ2UgPSBkZWNvZGVSZWN1cihtZXNzYWdlKTtcbiAgICAgIC8qIGVycm9ySWQgaXMgYSBsYXRlIGFkZGl0aW9uIHNvIGJlIHRvbGVyYW50IG9mIGl0cyBhYnNlbmNlLiovXG4gICAgICBjb25zdCBkRXJyb3JJZCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZXJyb3JJZCAmJiBkZWNvZGVSZWN1cihlcnJvcklkKSk7XG4gICAgICBpZiAodHlwZW9mIGROYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBkTmFtZSl9YDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZE1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyQ29uc3RydWN0b3IgPSBnZXRFcnJvckNvbnN0cnVjdG9yKGROYW1lKSB8fCBFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yTmFtZSA9XG4gICAgICAgIGRFcnJvcklkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGBSZW1vdGUke2VyckNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICAgIDogYFJlbW90ZSR7ZXJyQ29uc3RydWN0b3IubmFtZX0oJHtkRXJyb3JJZH0pYDtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGVycm9yTmFtZSxcbiAgICAgICAgc2FuaXRpemU6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGlmIChjYXVzZSkge1xuICAgICAgICBvcHRpb25zLmNhdXNlID0gZGVjb2RlUmVjdXIoY2F1c2UpO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICBvcHRpb25zLmVycm9ycyA9IGRlY29kZVJlY3VyKGVycm9ycyk7XG4gICAgICB9XG4gICAgICBjb25zdCByYXdFcnJvciA9IG1ha2VFcnJvcihkTWVzc2FnZSwgZXJyQ29uc3RydWN0b3IsIG9wdGlvbnMpO1xuICAgICAgLyogTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgZGVjb2RlUmVjdXIgcmVzdCdzIHByb3BlcnR5IG5hbWVzLiovXG4gICAgICAvKiBUaGlzIHdvdWxkIGJlIGluY29uc2lzdGVudCB3aXRoIHNtYWxsY2FwcycgZXhwZWN0ZWQgaGFuZGxpbmcsKi9cbiAgICAgIC8qIGJ1dCBpcyBmaW5lIGhlcmUgc2luY2UgaXQgaXMgb25seSB1c2VkIGZvciBgYW5ub3RhdGVFcnJvcmAsKi9cbiAgICAgIC8qIHdoaWNoIGlzIGZvciBkaWFnbm9zdGljIGluZm8gdGhhdCBpcyBvdGhlcndpc2UgdW5vYnNlcnZhYmxlLiovXG4gICAgICBjb25zdCBkZXNjcyA9IG9iamVjdE1hcChyZXN0LCBkYXRhID0+ICh7XG4gICAgICAgIHZhbHVlOiBkZWNvZGVSZWN1cihkYXRhKSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIH0pKTtcbiAgICAgIGRlZmluZVByb3BlcnRpZXMocmF3RXJyb3IsIGRlc2NzKTtcbiAgICAgIGhhcmRlbihyYXdFcnJvcik7XG4gICAgICByZXR1cm4gdG9QYXNzYWJsZUVycm9yKHJhd0Vycm9yKTtcbiAgICB9O1xuXG4gICAgLyogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaCovXG4gICAgLyogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uKi9cbiAgICAvKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSovXG4gICAgLyogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzQqL1xuICAgIGNvbnN0IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhID0gKHJhd1RyZWUsIF9kZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyBbUUNMQVNTXTogXywgLi4uc2xvdERhdGEgfSA9IHJhd1RyZWU7XG4gICAgICByZXR1cm4gZGVjb2RlU2xvdENvbW1vbihzbG90RGF0YSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGRlY29kZUVycm9yRnJvbUNhcERhdGEgPSAocmF3VHJlZSwgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgW1FDTEFTU106IF8sIC4uLmVyckRhdGEgfSA9IHJhd1RyZWU7XG4gICAgICByZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oZXJyRGF0YSwgZGVjb2RlUmVjdXIpO1xuICAgIH07XG5cbiAgICBjb25zdCByZXZpdmVGcm9tQ2FwRGF0YSA9IG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTogZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgICBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGE6IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgICAgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcyA9IHByZWZpeCA9PiB7XG4gICAgICAvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdFbmNvZGluZ1xuICogQHBhcmFtIHsoZTogdW5rbm93bikgPT4gUGFzc2FibGV9IF9kZWNvZGVSZWN1clxuICogQHJldHVybnMge1JlbW90YWJsZU9iamVjdCB8IFByb21pc2V9XG4gKi9cbiAgICAgIHJldHVybiAoc3RyaW5nRW5jb2RpbmcsIF9kZWNvZGVSZWN1cikgPT4ge1xuICAgICAgICBhc3NlcnQoc3RyaW5nRW5jb2RpbmcuY2hhckF0KDApID09PSBwcmVmaXgpO1xuICAgICAgICAvKiBzbG90czogJHNsb3RJbmRleC5pZmFjZSBvciAkc2xvdEluZGV4Ki9cbiAgICAgICAgY29uc3QgaSA9IHN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoc3RyaW5nRW5jb2Rpbmcuc2xpY2UoMSwgaSA8IDAgPyB1bmRlZmluZWQgOiBpKSk7XG4gICAgICAgIC8qIGkgPCAwIG1lYW5zIHRoZXJlIHdhcyBubyBpZmFjZSBpbmNsdWRlZC4qL1xuICAgICAgICBjb25zdCBpZmFjZSA9IGkgPCAwID8gdW5kZWZpbmVkIDogc3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSArIDEpO1xuICAgICAgICByZXR1cm4gZGVjb2RlU2xvdENvbW1vbih7IGlmYWNlLCBpbmRleCB9KTtcbiAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG4gICAgY29uc3QgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuICAgIGNvbnN0IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyA9IChlbmNvZGluZywgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgJyNlcnJvcic6IG1lc3NhZ2UsIC4uLnJlc3RFcnJEYXRhIH0gPSBlbmNvZGluZztcbiAgICAgICFoYXNPd24ocmVzdEVyckRhdGEsICdtZXNzYWdlJykgfHxcbiAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbiAgICAgIHJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7IG1lc3NhZ2UsIC4uLnJlc3RFcnJEYXRhIH0sIGRlY29kZVJlY3VyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV2aXZlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbiAgICAgIC8qIEB0cy1pZ25vcmUgWFhYIFNtYWxsQ2Fwc0VuY29kaW5nKi9cbiAgICAgIGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG4gICAgICAvKiBAdHMtaWdub3JlIFhYWCBTbWFsbENhcHNFbmNvZGluZyovXG4gICAgICBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbiAgICAgIGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBoYXJkZW4oeyByZXZpdmVGcm9tQ2FwRGF0YSwgcmV2aXZlRnJvbVNtYWxsY2FwcyB9KTtcbiAgfTtcblxuICAvKipcbiAqIEB0eXBlIHtGcm9tQ2FwRGF0YTxTbG90Pn1cbiAqL1xuICBjb25zdCBmcm9tQ2FwRGF0YSA9IGRhdGEgPT4ge1xuICAgIGNvbnN0IHsgYm9keSwgc2xvdHMgfSA9IGRhdGE7XG4gICAgdHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5ib2R5IGlzICR7Ym9keX0sIG5vdCBzdHJpbmcpYDtcbiAgICBpc0FycmF5KGRhdGEuc2xvdHMpIHx8XG4gICAgICBGYWlsYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5zbG90cyBhcmUgbm90IEFycmF5KWA7XG4gICAgY29uc3QgeyByZXZpdmVGcm9tQ2FwRGF0YSwgcmV2aXZlRnJvbVNtYWxsY2FwcyB9ID0gbWFrZUZ1bGxSZXZpdmUoc2xvdHMpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgLyogSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhbiB1bmFtYmlndW91cyBzaWduYWwuKi9cbiAgICBpZiAoYm9keS5jaGFyQXQoMCkgPT09ICcjJykge1xuICAgICAgY29uc3Qgc21hbGxjYXBzQm9keSA9IGJvZHkuc2xpY2UoMSk7XG4gICAgICBjb25zdCBlbmNvZGluZyA9IGhhcmRlbihKU09OLnBhcnNlKHNtYWxsY2Fwc0JvZHkpKTtcbiAgICAgIHJlc3VsdCA9IGhhcmRlbihyZXZpdmVGcm9tU21hbGxjYXBzKGVuY29kaW5nKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJhd1RyZWUgPSBoYXJkZW4oSlNPTi5wYXJzZShib2R5KSk7XG4gICAgICByZXN1bHQgPSBoYXJkZW4ocmV2aXZlRnJvbUNhcERhdGEocmF3VHJlZSkpO1xuICAgIH1cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM3Ki9cbiAgICAvKiB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBmaXhlZCBvbmNlIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgc3dpdGNoKi9cbiAgICAvKiB0byBzbWFsbGNhcHMuKi9cbiAgICBhc3NlcnRQYXNzYWJsZShyZXN1bHQpO1xuICAgIHJldHVybiAvKiogQHR5cGUge1Bhc3NhYmxlQ2FwfSAqLyAocmVzdWx0KTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICB0b0NhcERhdGEsXG4gICAgZnJvbUNhcERhdGEsXG5cbiAgICAvKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqL1xuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgdG9DYXBEYXRhICovXG4gICAgc2VyaWFsaXplOiB0b0NhcERhdGEsXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSBmcm9tQ2FwRGF0YSAqL1xuICAgIHVuc2VyaWFsaXplOiBmcm9tQ2FwRGF0YSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlTWFyc2hhbChtYWtlTWFyc2hhbCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACBor4x6FkAAOhZAAAlAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL3JhbmtPcmRlci5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCIuL2VuY29kZVBhc3NhYmxlLmpzIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlQnlDb2RlUG9pbnRzIiwiY29tcGFyZU51bWVyaWNzIiwiY29tcGFyZVJhbmsiLCJjb3ZlcmVkRW50cmllcyIsImdldEluZGV4Q292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciIsImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpc1JhbmtTb3J0ZWQiLCJtYWtlQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Iiwic29ydEJ5UmFuayIsInVuaW9uUmFua0NvdmVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldGVudixGYWlsLHEsZ2V0VGFnLHBhc3NTdHlsZU9mLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzU3R5bGVQcmVmaXhlcyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRlbnYgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicGFzc1N0eWxlUHJlZml4ZXNcIixbJGjNj19hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRozY9fYSldXSxbXCJyZWNvcmROYW1lc1wiLFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZSwgUGFzc1N0eWxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJ1xuICogQGltcG9ydCB7RnVsbENvbXBhcmUsIFBhcnRpYWxDb21wYXJlLCBQYXJ0aWFsQ29tcGFyaXNvbiwgUmFua0NvbXBhcmUsIFJhbmtDb21wYXJpc29uLCBSYW5rQ292ZXJ9IGZyb20gJy4vdHlwZXMuanMnXG4gKi9cblxuY29uc3QgeyBpc05hTjogTnVtYmVySXNOYU4gfSA9IE51bWJlcjtcbmNvbnN0IHsgZW50cmllcywgZnJvbUVudHJpZXMsIHNldFByb3RvdHlwZU9mLCBpcyB9ID0gT2JqZWN0O1xuXG5jb25zdCBFTkRPX1JBTktfU1RSSU5HUyA9IGdldGVudignRU5ET19SQU5LX1NUUklOR1MnLCAndXRmMTYtY29kZS11bml0LW9yZGVyJywgW1xuICAndW5pY29kZS1jb2RlLXBvaW50LW9yZGVyJyxcbiAgJ2Vycm9yLWlmLW9yZGVyLWNob2ljZS1tYXR0ZXJzJyxcbl0pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbmtDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnVsbENvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W251bWJlciwgbnVtYmVyXX0gSW5kZXhDb3ZlclxuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbiB1c2VkIGJ5IEphdmFTY3JpcHQncyBNYXAgYW5kIFNldFxuICogYWJzdHJhY3Rpb25zLCB3aGVyZSBOYU4gaXMgdGhlIHNhbWUgYXMgTmFOIGFuZCAtMCBpcyB0aGUgc2FtZSBhc1xuICogMC4gTWFyc2hhbCBzZXJpYWxpemVzIC0wIGFzIHplcm8sIHNvIHRoZSBzZW1hbnRpY3Mgb2Ygb3VyIGRpc3RyaWJ1dGVkXG4gKiBvYmplY3Qgc3lzdGVtIGRvZXMgbm90IGRpc3Rpbmd1aXNoIDAgZnJvbSAtMC5cbiAqXG4gKiBgc2FtZVZhbHVlWmVyb2AgaXMgdGhlIEVjbWFTY3JpcHQgc3BlYyBuYW1lIGZvciB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24sXG4gKiBidXQgVE9ETyB3ZSBuZWVkIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSBBUEkuXG4gKlxuICogQHBhcmFtIHthbnl9IHhcbiAqIEBwYXJhbSB7YW55fSB5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc2FtZVZhbHVlWmVybyA9ICh4LCB5KSA9PiB4ID09PSB5IHx8IGlzKHgsIHkpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBsZWZ0XG4gKiBAcGFyYW0ge2FueX0gcmlnaHRcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuY29uc3QgdHJpdmlhbENvbXBhcmF0b3IgPSAobGVmdCwgcmlnaHQpID0+XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSwgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG4gIGxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA9PT0gcmlnaHQgPyAwIDogMTtcbmhhcmRlbih0cml2aWFsQ29tcGFyYXRvcik7XG5cbi8qIEFwcGFyZW50bHkgZXNsaW50IGNvbmZ1c2VkIGFib3V0IHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGNhbiBldmVyIGV4aXQqL1xuLyogd2l0aG91dCBhbiBleHBsaWNpdCByZXR1cm4uKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnMtY2hlY2sqL1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGVmdFxuICogQHBhcmFtIHtzdHJpbmd9IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmlzb259XG4gKi9cbiAgICAgICBjb25zdCBjb21wYXJlQnlDb2RlUG9pbnRzID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGNvbnN0IGxlZnRJdGVyID0gbGVmdFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIGNvbnN0IHJpZ2h0SXRlciA9IHJpZ2h0W1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IHsgdmFsdWU6IGxlZnRDaGFyIH0gPSBsZWZ0SXRlci5uZXh0KCk7XG4gICAgY29uc3QgeyB2YWx1ZTogcmlnaHRDaGFyIH0gPSByaWdodEl0ZXIubmV4dCgpO1xuICAgIGlmIChsZWZ0Q2hhciA9PT0gdW5kZWZpbmVkICYmIHJpZ2h0Q2hhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKGxlZnRDaGFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIGxlZnQgaXMgYSBwcmVmaXggb2YgcmlnaHQuKi9cbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKHJpZ2h0Q2hhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiByaWdodCBpcyBhIHByZWZpeCBvZiBsZWZ0LiovXG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgY29uc3QgbGVmdENvZGVwb2ludCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAobGVmdENoYXIuY29kZVBvaW50QXQoMCkpO1xuICAgIGNvbnN0IHJpZ2h0Q29kZXBvaW50ID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyaWdodENoYXIuY29kZVBvaW50QXQoMCkpO1xuICAgIGlmIChsZWZ0Q29kZXBvaW50IDwgcmlnaHRDb2RlcG9pbnQpIHJldHVybiAtMTtcbiAgICBpZiAobGVmdENvZGVwb2ludCA+IHJpZ2h0Q29kZXBvaW50KSByZXR1cm4gMTtcbiAgfVxufTskaM2PX29uY2UuY29tcGFyZUJ5Q29kZVBvaW50cyhjb21wYXJlQnlDb2RlUG9pbnRzKTtcbmhhcmRlbihjb21wYXJlQnlDb2RlUG9pbnRzKTtcblxuLyoqXG4gKiBDb21wYXJlIHR3byBzYW1lLXR5cGUgbnVtZXJpYyB2YWx1ZXMsIHJldHVybmluZyByZXN1bHRzIGNvbnNpc3RlbnQgd2l0aFxuICogYGNvbXBhcmVSYW5rYCdzIFwicmFuayBvcmRlclwiIChpLmUuLCB0cmVhdGluZyBib3RoIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB6ZXJvXG4gKiBhcyBlcXVhbCBhbmQgcGxhY2luZyBOYU4gYXMgc2VsZi1lcXVhbCBhZnRlciBhbGwgb3RoZXIgbnVtYmVycykuXG4gKlxuICogQHRlbXBsYXRlIHtudW1iZXIgfCBiaWdpbnR9IFRcbiAqIEBwYXJhbSB7VH0gbGVmdFxuICogQHBhcmFtIHtUfSByaWdodFxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG4gICAgICAgY29uc3QgY29tcGFyZU51bWVyaWNzID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbiAgaWYgKGxlZnQgPCByaWdodCkgcmV0dXJuIC0xO1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG4gIGlmIChsZWZ0ID4gcmlnaHQpIHJldHVybiAxO1xuICBpZiAoTnVtYmVySXNOYU4obGVmdCkgPT09IE51bWJlcklzTmFOKHJpZ2h0KSkgcmV0dXJuIDA7XG4gIGlmIChOdW1iZXJJc05hTihyaWdodCkpIHJldHVybiAtMTtcbiAgYXNzZXJ0KE51bWJlcklzTmFOKGxlZnQpKTtcbiAgcmV0dXJuIDE7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8UGFzc1N0eWxlLCB7IGluZGV4OiBudW1iZXIsIGNvdmVyOiBSYW5rQ292ZXIgfT59IFBhc3NTdHlsZVJhbmtzUmVjb3JkXG4gKi8kaM2PX29uY2UuY29tcGFyZU51bWVyaWNzKGNvbXBhcmVOdW1lcmljcyk7XG5cbmNvbnN0IHBhc3NTdHlsZVJhbmtzID0gLyoqIEB0eXBlIHtQYXNzU3R5bGVSYW5rc1JlY29yZH0gKi8gKFxuICBmcm9tRW50cmllcyhcbiAgICBlbnRyaWVzKHBhc3NTdHlsZVByZWZpeGVzKVxuICAgICAgLyogU29ydCBlbnRyaWVzIGJ5IGFzY2VuZGluZyBwcmVmaXgsIGFzc3VtaW5nIHRoYXQgYWxsIHByZWZpeGVzIGFyZSovXG4gICAgICAvKiBsaW1pdGVkIHRvIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUgKFUrMDAwMCB0aHJvdWdoIFUrRkZGRikgYW5kKi9cbiAgICAgIC8qIHRodXMgY29udGFpbiBvbmx5IGNvZGUgdW5pdHMgdGhhdCBhcmUgZXF1aXZhbGVudCB0byBjb2RlIHBvaW50cy4qL1xuICAgICAgLyogSW4gcHJhY3RpY2UsIHRoZXkgYXJlIGVudGlyZWx5IHByaW50YWJsZSBBU0NJSSovXG4gICAgICAvKiAoMHgyMCBTUEFDRSB0aHJvdWdoIDB4N0UgVElMREUpLiovXG4gICAgICAuc29ydCgoW19sZWZ0U3R5bGUsIGxlZnRQcmVmaXhlc10sIFtfcmlnaHRTdHlsZSwgcmlnaHRQcmVmaXhlc10pID0+IHtcbiAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnRQcmVmaXhlcywgcmlnaHRQcmVmaXhlcyk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoW3Bhc3NTdHlsZSwgcHJlZml4ZXNdLCBpbmRleCkgPT4ge1xuICAgICAgICAvKiBWZXJpZnkgdGhhdCBgcHJlZml4ZXNgIGlzIHNvcnRlZCwgYW5kIGNvdmVyIGFsbCBzdHJpbmdzIHRoYXQgc3RhcnQqL1xuICAgICAgICAvKiB3aXRoIGFueSBvZiBpdHMgY2hhcmFjdGVycywgaS5lLiovXG4gICAgICAgIC8qIGFsbCBzIHN1Y2ggdGhhdCBwcmVmaXhlcy5hdCgwKSDiiaQgcyA8IHN1Y2Nlc3NvcihwcmVmaXhlcy5hdCgtMSkpLiovXG4gICAgICAgIHByZWZpeGVzID09PSBwcmVmaXhlcy5zcGxpdCgnJykuc29ydCgpLmpvaW4oJycpIHx8XG4gICAgICAgICAgRmFpbGB1bnNvcnRlZCBwcmVmaXhlcyBmb3IgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHtxKHByZWZpeGVzKX1gO1xuICAgICAgICBjb25zdCBjb3ZlciA9IFtcbiAgICAgICAgICBwcmVmaXhlcy5jaGFyQXQoMCksXG4gICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZShwcmVmaXhlcy5jaGFyQ29kZUF0KHByZWZpeGVzLmxlbmd0aCAtIDEpICsgMSksXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiBbcGFzc1N0eWxlLCB7IGluZGV4LCBjb3ZlciB9XTtcbiAgICAgIH0pLFxuICApXG4pO1xuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsIG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVJhbmtzKTtcblxuLyoqXG4gKiBBc3NvY2lhdGUgd2l0aCBlYWNoIHBhc3NTdHlsZSBhIFJhbmtDb3ZlciB0aGF0IG1heSBiZSBhbiBvdmVyZXN0aW1hdGUsXG4gKiBhbmQgd2hvc2UgcmVzdWx0cyB0aGVyZWZvcmUgbmVlZCB0byBiZSBmaWx0ZXJlZCBkb3duLiBGb3IgZXhhbXBsZSwgYmVjYXVzZVxuICogdGhlcmUgaXMgbm90IGEgc21hbGxlc3Qgb3IgYmlnZ2VzdCBiaWdpbnQsIGJvdW5kIGl0IGJ5IGBOYU5gICh0aGUgbGFzdCBwbGFjZVxuICogbnVtYmVyKSBhbmQgYCcnYCAodGhlIGVtcHR5IHN0cmluZywgd2hpY2ggaXMgdGhlIGZpcnN0IHBsYWNlIHN0cmluZykuIFRodXMsXG4gKiBhIHJhbmdlIHF1ZXJ5IHVzaW5nIHRoaXMgcmFuZ2UgbWF5IGluY2x1ZGUgdGhlc2UgdmFsdWVzLCB3aGljaCB3b3VsZCB0aGVuXG4gKiBuZWVkIHRvIGJlIGZpbHRlcmVkIG91dC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG4gICAgICAgY29uc3QgZ2V0UGFzc1N0eWxlQ292ZXIgPSBwYXNzU3R5bGUgPT4gcGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaM2PX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxXZWFrU2V0PFBhc3NhYmxlW10+Pn1cbiAqL1xuY29uc3QgbWVtb09mU29ydGVkID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxSYW5rQ29tcGFyZT59XG4gKi9cbmNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFydGlhbENvbXBhcmV9IFtjb21wYXJlUmVtb3RhYmxlc11cbiAqIEEgY29tcGFyYXRvciBmb3IgYXNzaWduaW5nIGFuIGludGVybmFsIG9yZGVyIHRvIHJlbW90YWJsZXMuXG4gKiBJdCBkZWZhdWx0cyB0byBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgYE5hTmAsIG1lYW5pbmcgdGhhdCBhbGxcbiAqIHJlbW90YWJsZXMgYXJlIGluY29tcGFyYWJsZSBhbmQgc2hvdWxkIHRpZSBmb3IgdGhlIHNhbWUgcmFuayBieVxuICogc2hvcnQtY2lyY3VpdGluZyB3aXRob3V0IGZ1cnRoZXIgcmVmaW5lbWVudCAoZS5nLiwgbm90IG9ubHkgYXJlIGByMWAgYW5kIGByMmBcbiAqIHRpZWQsIGJ1dCBzbyBhcmUgYFtyMSwgMF1gIGFuZCBgW3IyLCBcInhcIl1gKS5cbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyYXRvcktpdH1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb21wYXJhdG9yS2l0ID0gKGNvbXBhcmVSZW1vdGFibGVzID0gKF94LCBfeSkgPT4gTmFOKSA9PiB7XG4gIC8qKiBAdHlwZSB7UGFydGlhbENvbXBhcmV9ICovXG4gIGNvbnN0IGNvbXBhcmF0b3IgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgICBpZiAoc2FtZVZhbHVlWmVybyhsZWZ0LCByaWdodCkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0U3R5bGUgPSBwYXNzU3R5bGVPZihsZWZ0KTtcbiAgICBjb25zdCByaWdodFN0eWxlID0gcGFzc1N0eWxlT2YocmlnaHQpO1xuICAgIGlmIChsZWZ0U3R5bGUgIT09IHJpZ2h0U3R5bGUpIHtcbiAgICAgIHJldHVybiBjb21wYXJlTnVtZXJpY3MoXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW3JpZ2h0U3R5bGVdLmluZGV4LFxuICAgICAgKTtcbiAgICB9XG4gICAgLyogZXNsaW50LWRpc2FibGUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyAtLVxuICogV2Uga25vdyBgbGVmdGAgYW5kIGByaWdodGAgYXJlIGNvbXBhcmFibGUuXG4gKi9cbiAgICBzd2l0Y2ggKGxlZnRTdHlsZSkge1xuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICByZXR1cm4gY29tcGFyZVJlbW90YWJsZXMobGVmdCwgcmlnaHQpO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgLyogRm9yIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgYWxsIG1lbWJlcnMgb2YgdGhhdCBwYXNzU3R5bGUgYXJlIHRpZWQqL1xuICAgICAgICAvKiBmb3IgdGhlIHNhbWUgcmFuay4qL1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAvKiBXaXRoaW4gZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCB0aGUgcmFuayBvcmRlcmluZyBhZ3JlZXMgd2l0aCovXG4gICAgICAgIC8qIEphdmFTY3JpcHQncyByZWxhdGlvbmFsIG9wZXJhdG9ycyBgPGAgYW5kIGA+YC4qL1xuICAgICAgICByZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBzd2l0Y2ggKEVORE9fUkFOS19TVFJJTkdTKSB7XG4gICAgICAgICAgY2FzZSAndXRmMTYtY29kZS11bml0LW9yZGVyJzoge1xuICAgICAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAndW5pY29kZS1jb2RlLXBvaW50LW9yZGVyJzoge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVCeUNvZGVQb2ludHMobGVmdCwgcmlnaHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdlcnJvci1pZi1vcmRlci1jaG9pY2UtbWF0dGVycyc6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDEgPSB0cml2aWFsQ29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQyID0gY29tcGFyZUJ5Q29kZVBvaW50cyhsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICByZXN1bHQxID09PSByZXN1bHQyIHx8XG4gICAgICAgICAgICAgIEZhaWxgQ29tcGFyaXNvbnMgZGlmZmVyZWQ6ICR7bGVmdH0gdnMgJHtyaWdodH0sICR7cShyZXN1bHQxKX0gdnMgJHtxKHJlc3VsdDIpfWA7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0MTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBVbmV4cGVjdGVkIEVORE9fUkFOS19TVFJJTkdTICR7cShFTkRPX1JBTktfU1RSSU5HUyl9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IoXG4gICAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sKGxlZnQpLFxuICAgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJlTnVtZXJpY3MobGVmdCwgcmlnaHQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLyogTGV4aWNvZ3JhcGhpYyBieSBpbnZlcnNlIHNvcnRlZCBvcmRlciBvZiBwcm9wZXJ0eSBuYW1lcywgdGhlbiovXG4gICAgICAgIC8qIGxleGljb2dyYXBoaWMgYnkgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhhdCBzYW1lIGludmVyc2UqL1xuICAgICAgICAvKiBvcmRlciBvZiB0aGVpciBwcm9wZXJ0eSBuYW1lcy4gQ29tcGFyaW5nIG5hbWVzIGJ5IHRoZW1zZWx2ZXMgZmlyc3QsKi9cbiAgICAgICAgLyogYWxsIHJlY29yZHMgd2l0aCB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YgcHJvcGVydHkgbmFtZXMgc29ydCBuZXh0IHRvKi9cbiAgICAgICAgLyogZWFjaCBvdGhlciBpbiBhIHJhbmstc29ydCBvZiBjb3B5UmVjb3Jkcy4qL1xuXG4gICAgICAgIC8qIFRoZSBjb3B5UmVjb3JkIGludmFyaWFudHMgZW5mb3JjZWQgYnkgcGFzc1N0eWxlT2YgZW5zdXJlIHRoYXQqL1xuICAgICAgICAvKiBhbGwgdGhlIHByb3BlcnR5IG5hbWVzIGFyZSBzdHJpbmdzLiBXZSBuZWVkIHRoZSByZXZlcnNlIHNvcnRlZCBvcmRlciovXG4gICAgICAgIC8qIG9mIHRoZXNlIG5hbWVzLCB3aGljaCB3ZSB0aGVuIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgZW5zdXJlcyovXG4gICAgICAgIC8qIHRoYXQgaWYgdGhlIG5hbWVzIG9mIHJlY29yZCBYIGFyZSBhIHN1YnNldCBvZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFksKi9cbiAgICAgICAgLyogdGhlbiByZWNvcmQgWCB3aWxsIGhhdmUgYW4gZWFybGllciByYW5rIGFuZCBzb3J0IHRvIHRoZSBsZWZ0IG9mIFkuKi9cbiAgICAgICAgY29uc3QgbGVmdE5hbWVzID0gcmVjb3JkTmFtZXMobGVmdCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0TmFtZXMgPSByZWNvcmROYW1lcyhyaWdodCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0TmFtZXMsIHJpZ2h0TmFtZXMpO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZWZ0VmFsdWVzID0gcmVjb3JkVmFsdWVzKGxlZnQsIGxlZnROYW1lcyk7XG4gICAgICAgIGNvbnN0IHJpZ2h0VmFsdWVzID0gcmVjb3JkVmFsdWVzKHJpZ2h0LCByaWdodE5hbWVzKTtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IobGVmdFZhbHVlcywgcmlnaHRWYWx1ZXMpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICAvKiBMZXhpY29ncmFwaGljKi9cbiAgICAgICAgY29uc3QgbGVuID0gTWF0aC5taW4obGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJhdG9yKGxlZnRbaV0sIHJpZ2h0W2ldKTtcbiAgICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgd2VyZSB0aWVkLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4gICAgICAgIC8qIElmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGhhcyBhbiBlYXJsaWVyIHJhbmsgdGhhbiBZLiovXG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYnl0ZUFycmF5Jzoge1xuICAgICAgICAvKiBCeXRlQXJyYXlzIGNvbXBhcmUgYnkgc2hvcnRsZXguKi9cbiAgICAgICAgLyogLSBmaXJzdCwgaWYgdGhleSBhcmUgb2YgdW5lcXVhbCBsZW5ndGgsIHRoZW4gdGhlIHNob3J0ZXIgaXMgbGVzcy4qL1xuICAgICAgICAvKiAtIHRoZW4sIGFtb25nIGJ5dGVBcnJheXMgb2YgZXF1YWwgbGVuZ3RoLCBieSBsZXhpY29ncmFwaGljIGNvbXBhcmlzb24qL1xuICAgICAgICAvKiBvZiB0aGVpciBieXRlcyBpbiBhc2NlbmRpbmcgb3JkZXIuKi9cbiAgICAgICAgY29uc3QgeyBieXRlTGVuZ3RoOiBsZWZ0TGVuIH0gPSBsZWZ0O1xuICAgICAgICBjb25zdCB7IGJ5dGVMZW5ndGg6IHJpZ2h0TGVuIH0gPSByaWdodDtcbiAgICAgICAgaWYgKGxlZnRMZW4gPCByaWdodExlbikge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVmdExlbiA+IHJpZ2h0TGVuKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBBY2NvdW50IGZvciBnYXBzIGluIHRoZSBAZW5kby9pbW11dGFibGUtYXJyYXlidWZmZXIgc2hpbS4qL1xuICAgICAgICBjb25zdCBsZWZ0QXJyYXkgPVxuICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihsZWZ0KSA9PT0gQXJyYXlCdWZmZXIucHJvdG90eXBlXG4gICAgICAgICAgICA/IG5ldyBVaW50OEFycmF5KGxlZnQpXG4gICAgICAgICAgICA6IG5ldyBVaW50OEFycmF5KGxlZnQuc2xpY2UoMCkpO1xuICAgICAgICBjb25zdCByaWdodEFycmF5ID1cbiAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YocmlnaHQpID09PSBBcnJheUJ1ZmZlci5wcm90b3R5cGVcbiAgICAgICAgICAgID8gbmV3IFVpbnQ4QXJyYXkocmlnaHQpXG4gICAgICAgICAgICA6IG5ldyBVaW50OEFycmF5KHJpZ2h0LnNsaWNlKDApKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZWZ0TGVuOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBsZWZ0Qnl0ZSA9IGxlZnRBcnJheVtpXTtcbiAgICAgICAgICBjb25zdCByaWdodEJ5dGUgPSByaWdodEFycmF5W2ldO1xuICAgICAgICAgIGlmIChsZWZ0Qnl0ZSA8IHJpZ2h0Qnl0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGVmdEJ5dGUgPiByaWdodEJ5dGUpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgLyogTGV4aWNvZ3JhcGhpYyBieSBgW1N5bWJvbC50b1N0cmluZ1RhZ11gIHRoZW4gYC5wYXlsb2FkYC4qL1xuICAgICAgICBjb25zdCBsYWJlbENvbXAgPSBjb21wYXJhdG9yKGdldFRhZyhsZWZ0KSwgZ2V0VGFnKHJpZ2h0KSk7XG4gICAgICAgIGlmIChsYWJlbENvbXAgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbGFiZWxDb21wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnQucGF5bG9hZCwgcmlnaHQucGF5bG9hZCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIHBhc3NTdHlsZTogJHtxKGxlZnRTdHlsZSl9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSAqL1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG4gIGNvbnN0IG91dGVyQ29tcGFyYXRvciA9ICh4LCB5KSA9PlxuICAgIC8qIFdoZW4gdGhlIGlubmVyIGNvbXBhcmF0b3IgcmV0dXJucyBOYU4gdG8gaW5kaWNhdGUgaW5jb21wYXJhYmlsaXR5LCovXG4gICAgLyogcmVwbGFjZSB0aGF0IHdpdGggMCB0byBpbmRpY2F0ZSBhIHRpZS4qL1xuICAgIC8qKiBAdHlwZSB7RXhjbHVkZTxQYXJ0aWFsQ29tcGFyaXNvbiwgTmFOPn0gKi8gKGNvbXBhcmF0b3IoeCwgeSkgfHwgMCk7XG5cbiAgLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbiAgY29uc3QgYW50aUNvbXBhcmF0b3IgPSAoeCwgeSkgPT4gb3V0ZXJDb21wYXJhdG9yKHksIHgpO1xuXG4gIG1lbW9PZlNvcnRlZC5zZXQob3V0ZXJDb21wYXJhdG9yLCBuZXcgV2Vha1NldCgpKTtcbiAgbWVtb09mU29ydGVkLnNldChhbnRpQ29tcGFyYXRvciwgbmV3IFdlYWtTZXQoKSk7XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KG91dGVyQ29tcGFyYXRvciwgYW50aUNvbXBhcmF0b3IpO1xuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvciwgb3V0ZXJDb21wYXJhdG9yKTtcblxuICByZXR1cm4gaGFyZGVuKHsgY29tcGFyYXRvcjogb3V0ZXJDb21wYXJhdG9yLCBhbnRpQ29tcGFyYXRvciB9KTtcbn07XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyZT19XG4gKi8kaM2PX29uY2UubWFrZUNvbXBhcmF0b3JLaXQobWFrZUNvbXBhcmF0b3JLaXQpO1xuICAgICAgIGNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZSA9IGNvbXBhcmF0b3IgPT5cbiAgY29tcGFyYXRvck1pcnJvckltYWdlcy5nZXQoY29tcGFyYXRvcik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjNj19vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuICAgICAgIGNvbnN0IGlzUmFua1NvcnRlZCA9IChwYXNzYWJsZXMsIGNvbXBhcmUpID0+IHtcbiAgY29uc3Qgc3ViTWVtb09mU29ydGVkID0gbWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbiAgYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCAhPT0gdW5kZWZpbmVkKTtcbiAgaWYgKHN1Yk1lbW9PZlNvcnRlZC5oYXMocGFzc2FibGVzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGFzc2VydChwYXNzU3R5bGVPZihwYXNzYWJsZXMpID09PSAnY29weUFycmF5Jyk7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcGFzc2FibGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGNvbXBhcmUocGFzc2FibGVzW2kgLSAxXSwgcGFzc2FibGVzW2ldKSA+PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHN1Yk1lbW9PZlNvcnRlZC5hZGQocGFzc2FibGVzKTtcbiAgcmV0dXJuIHRydWU7XG59OyRozY9fb25jZS5pc1JhbmtTb3J0ZWQoaXNSYW5rU29ydGVkKTtcbmhhcmRlbihpc1JhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRSYW5rU29ydGVkID0gKHNvcnRlZCwgY29tcGFyZSkgPT5cbiAgaXNSYW5rU29ydGVkKHNvcnRlZCwgY29tcGFyZSkgfHxcbiAgLyogVE9ETyBhc3NlcnQgb24gYnVnIGNvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLiBGaXguKi9cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgRmFpbGBNdXN0IGJlIHJhbmsgc29ydGVkOiAke3NvcnRlZH0gdnMgJHtzb3J0QnlSYW5rKHNvcnRlZCwgY29tcGFyZSl9YDskaM2PX29uY2UuYXNzZXJ0UmFua1NvcnRlZChhc3NlcnRSYW5rU29ydGVkKTtcbmhhcmRlbihhc3NlcnRSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbiAgICAgICBjb25zdCBzb3J0QnlSYW5rID0gKHBhc3NhYmxlcywgY29tcGFyZSkgPT4ge1xuICAvKiogQHR5cGUge1RbXX0gbXV0YWJsZSBmb3IgaW4tcGxhY2Ugc29ydGluZywgYnV0IHdpdGggaGFyZGVuZWQgZWxlbWVudHMgKi9cbiAgbGV0IHVuc29ydGVkO1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKSB7XG4gICAgaGFyZGVuKHBhc3NhYmxlcyk7XG4gICAgLyogQ2FsbGluZyBpc1JhbmtTb3J0ZWQgZ2l2ZXMgaXQgYSBjaGFuY2UgdG8gZ2V0IG1lbW9pemVkIGZvciovXG4gICAgLyogdGhpcyBgY29tcGFyZWAgZnVuY3Rpb24gZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBtZW1vaXplZCBmb3IgYSBkaWZmZXJlbnQqL1xuICAgIC8qIGBjb21wYXJlYCBmdW5jdGlvbi4qL1xuICAgIGlmIChpc1JhbmtTb3J0ZWQocGFzc2FibGVzLCBjb21wYXJlKSkge1xuICAgICAgcmV0dXJuIHBhc3NhYmxlcztcbiAgICB9XG4gICAgdW5zb3J0ZWQgPSBbLi4ucGFzc2FibGVzXTtcbiAgfSBlbHNlIHtcbiAgICB1bnNvcnRlZCA9IEFycmF5LmZyb20ocGFzc2FibGVzLCBoYXJkZW4pO1xuICB9XG4gIGNvbnN0IHNvcnRlZCA9IHVuc29ydGVkLnNvcnQoY29tcGFyZSk7XG4gIC8qIEZvciByZXZlcnNlIGNvbXBhcmlzb24sIG1vdmUgYHVuZGVmaW5lZGAgdmFsdWVzIGZyb20gdGhlIGVuZCB0byB0aGUgc3RhcnQuKi9cbiAgLyogTm90ZSB0aGF0IHBhc3NTdHlsZVByZWZpeGVzIChAc2VlIHtAbGluayAuL2VuY29kZVBhc3NhYmxlLmpzfSkgTVVTVCBOT1QqL1xuICAvKiBzb3J0IGFueSBjYXRlZ29yeSBhZnRlciBgdW5kZWZpbmVkYC4qL1xuICBpZiAoY29tcGFyZSh0cnVlLCB1bmRlZmluZWQpID4gMCkge1xuICAgIGxldCBpID0gc29ydGVkLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKGkgPj0gMCAmJiBzb3J0ZWRbaV0gPT09IHVuZGVmaW5lZCkgaSAtPSAxO1xuICAgIGNvbnN0IG4gPSBzb3J0ZWQubGVuZ3RoIC0gaSAtIDE7XG4gICAgaWYgKG4gPiAwICYmIG4gPCBzb3J0ZWQubGVuZ3RoKSB7XG4gICAgICBzb3J0ZWQuY29weVdpdGhpbihuLCAwKTtcbiAgICAgIHNvcnRlZC5maWxsKC8qKiBAdHlwZSB7VH0gKi8gKHVuZGVmaW5lZCksIDAsIG4pO1xuICAgIH1cbiAgfVxuICBoYXJkZW4oc29ydGVkKTtcbiAgY29uc3Qgc3ViTWVtb09mU29ydGVkID0gbWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbiAgYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCAhPT0gdW5kZWZpbmVkKTtcbiAgc3ViTWVtb09mU29ydGVkLmFkZChzb3J0ZWQpO1xuICByZXR1cm4gc29ydGVkO1xufTskaM2PX29uY2Uuc29ydEJ5UmFuayhzb3J0QnlSYW5rKTtcbmhhcmRlbihzb3J0QnlSYW5rKTtcblxuLyoqXG4gKiBTZWVcbiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpbmFyeV9zZWFyY2hfYWxnb3JpdGhtI1Byb2NlZHVyZV9mb3JfZmluZGluZ190aGVfbGVmdG1vc3RfZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBrZXlcbiAqIEBwYXJhbSB7KFwibGVmdE1vc3RcIiB8IFwicmlnaHRNb3N0XCIpPX0gYmlhc1xuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgcmFua1NlYXJjaCA9IChzb3J0ZWQsIGNvbXBhcmUsIGtleSwgYmlhcyA9ICdsZWZ0TW9zdCcpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpO1xuICBsZXQgbGVmdCA9IDA7XG4gIGxldCByaWdodCA9IHNvcnRlZC5sZW5ndGg7XG4gIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlKHNvcnRlZFttXSwga2V5KTtcbiAgICBpZiAoY29tcCA8PSAtMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAncmlnaHRNb3N0JykpIHtcbiAgICAgIGxlZnQgPSBtICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGNvbXAgPj0gMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAnbGVmdE1vc3QnKSk7XG4gICAgICByaWdodCA9IG07XG4gICAgfVxuICB9XG4gIHJldHVybiBiaWFzID09PSAnbGVmdE1vc3QnID8gbGVmdCA6IHJpZ2h0IC0gMTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSByYW5rQ292ZXJcbiAqIEByZXR1cm5zIHtJbmRleENvdmVyfVxuICovXG4gICAgICAgY29uc3QgZ2V0SW5kZXhDb3ZlciA9IChzb3J0ZWQsIGNvbXBhcmUsIFtsZWZ0S2V5LCByaWdodEtleV0pID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpO1xuICBjb25zdCBsZWZ0SW5kZXggPSByYW5rU2VhcmNoKHNvcnRlZCwgY29tcGFyZSwgbGVmdEtleSwgJ2xlZnRNb3N0Jyk7XG4gIGNvbnN0IHJpZ2h0SW5kZXggPSByYW5rU2VhcmNoKHNvcnRlZCwgY29tcGFyZSwgcmlnaHRLZXksICdyaWdodE1vc3QnKTtcbiAgcmV0dXJuIFtsZWZ0SW5kZXgsIHJpZ2h0SW5kZXhdO1xufTskaM2PX29uY2UuZ2V0SW5kZXhDb3ZlcihnZXRJbmRleENvdmVyKTtcbmhhcmRlbihnZXRJbmRleENvdmVyKTtcblxuLyoqIEB0eXBlIHtSYW5rQ292ZXJ9ICovXG4gICAgICAgY29uc3QgRnVsbFJhbmtDb3ZlciA9IGhhcmRlbihbJycsICd7J10pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge0luZGV4Q292ZXJ9IGluZGV4Q292ZXJcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fVxuICovJGjNj19vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG4gICAgICAgY29uc3QgY292ZXJlZEVudHJpZXMgPSAoc29ydGVkLCBbbGVmdEluZGV4LCByaWdodEluZGV4XSkgPT4ge1xuICAvKiogQHR5cGUge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59ICovXG4gIGNvbnN0IGl0ZXJhYmxlID0gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgbGV0IGkgPSBsZWZ0SW5kZXg7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChpIDw9IHJpZ2h0SW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBzb3J0ZWRbaV07XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWU6IFtpLCBlbGVtZW50XSwgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gaXRlcmFibGU7XG59OyRozY9fb25jZS5jb3ZlcmVkRW50cmllcyhjb3ZlcmVkRW50cmllcyk7XG5oYXJkZW4oY292ZXJlZEVudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7VH0gYVxuICogQHBhcmFtIHtUfSBiXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgbWF4UmFuayA9IChjb21wYXJlLCBhLCBiKSA9PiAoY29tcGFyZShhLCBiKSA+PSAwID8gYSA6IGIpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7VH0gYVxuICogQHBhcmFtIHtUfSBiXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgbWluUmFuayA9IChjb21wYXJlLCBhLCBiKSA9PiAoY29tcGFyZShhLCBiKSA8PSAwID8gYSA6IGIpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuICAgICAgIGNvbnN0IHVuaW9uUmFua0NvdmVycyA9IChjb21wYXJlLCBjb3ZlcnMpID0+IHtcbiAgLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbiAgY29uc3QgdW5pb25SYW5rQ292ZXJQYWlyID0gKFtsZWZ0QSwgcmlnaHRBXSwgW2xlZnRCLCByaWdodEJdKSA9PiBbXG4gICAgbWluUmFuayhjb21wYXJlLCBsZWZ0QSwgbGVmdEIpLFxuICAgIG1heFJhbmsoY29tcGFyZSwgcmlnaHRBLCByaWdodEIpLFxuICBdO1xuICByZXR1cm4gY292ZXJzLnJlZHVjZSh1bmlvblJhbmtDb3ZlclBhaXIsIFsneycsICcnXSk7XG59OyRozY9fb25jZS51bmlvblJhbmtDb3ZlcnModW5pb25SYW5rQ292ZXJzKTtcbmhhcmRlbih1bmlvblJhbmtDb3ZlcnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuICAgICAgIGNvbnN0IGludGVyc2VjdFJhbmtDb3ZlcnMgPSAoY29tcGFyZSwgY292ZXJzKSA9PiB7XG4gIC8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG4gIGNvbnN0IGludGVyc2VjdFJhbmtDb3ZlclBhaXIgPSAoW2xlZnRBLCByaWdodEFdLCBbbGVmdEIsIHJpZ2h0Ql0pID0+IFtcbiAgICBtYXhSYW5rKGNvbXBhcmUsIGxlZnRBLCBsZWZ0QiksXG4gICAgbWluUmFuayhjb21wYXJlLCByaWdodEEsIHJpZ2h0QiksXG4gIF07XG4gIHJldHVybiBjb3ZlcnMucmVkdWNlKGludGVyc2VjdFJhbmtDb3ZlclBhaXIsIFsnJywgJ3snXSk7XG59OyRozY9fb25jZS5pbnRlcnNlY3RSYW5rQ292ZXJzKGludGVyc2VjdFJhbmtDb3ZlcnMpO1xuXG4gICAgICAgY29uc3QgeyBjb21wYXJhdG9yOiBjb21wYXJlUmFuaywgYW50aUNvbXBhcmF0b3I6IGNvbXBhcmVBbnRpUmFuayB9ID1cbiAgbWFrZUNvbXBhcmF0b3JLaXQoKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb21wYXJhdG9yIGtpdCBpbiB3aGljaCByZW1vdGFibGVzIGFyZSBmdWxseSBvcmRlcmVkXG4gKiBieSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZmlyc3Qgc2VlbiBieSAqdGhpcyogY29tcGFyYXRvciBraXQuXG4gKiBCRVdBUkU6IFRoaXMgaXMgb2JzZXJ2YWJsZSBtdXRhYmxlIHN0YXRlLCBzbyBzdWNoIGEgY29tcGFyYXRvciBraXRcbiAqIHNob3VsZCBuZXZlciBiZSBzaGFyZWQgYW1vbmcgc3Vic3lzdGVtcyB0aGF0IHNob3VsZCBub3QgYmUgYWJsZVxuICogdG8gY29tbXVuaWNhdGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgb3JkZXIgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIGZvciBzdG9yZVxuICogb3JkZXJpbmcsIHNpbmNlIGl0IGhhcyBubyBtZW1vcnkgb2YgZGVsZXRlZCBrZXlzLlxuICpcbiAqIFRoZXNlIGZ1bGwgb3JkZXIgY29tcGFyYXRvciBraXQgaXMgc3RyaWN0bHkgbW9yZSBwcmVjaXNlIHRoYXQgdGhlXG4gKiByYW5rIG9yZGVyIGNvbXBhcmF0b3Iga2l0cyBhYm92ZS4gQXMgYSByZXN1bHQsIGFueSBhcnJheSB3aGljaCBpc1xuICogc29ydGVkIGJ5IHN1Y2ggYSBmdWxsIG9yZGVyIHdpbGwgcGFzcyB0aGUgaXNSYW5rU29ydGVkIHRlc3Qgd2l0aFxuICogYSBjb3JyZXNwb25kaW5nIHJhbmsgb3JkZXIuXG4gKlxuICogQW4gYXJyYXkgd2hpY2ggaXMgc29ydGVkIGJ5IGEgKmZyZXNoKiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIGkuZS4sXG4gKiBvbmUgdGhhdCBoYXMgbm90IHlldCBzZWVuIGFueSByZW1vdGFibGVzLCB3aWxsIG9mIGNvdXJzZSByZW1haW5cbiAqIHNvcnRlZCBieSBhY2NvcmRpbmcgdG8gKnRoYXQqIGZ1bGwgb3JkZXIgY29tcGFyYXRvci4gQW4gYXJyYXkgKm9mXG4gKiBzY2FsYXJzKiBzb3J0ZWQgYnkgYSBmcmVzaCBmdWxsIG9yZGVyIHdpbGwgcmVtYWluIHNvcnRlZCBldmVuXG4gKiBhY2NvcmRpbmcgdG8gYSBuZXcgZnJlc2ggZnVsbCBvcmRlciBjb21wYXJhdG9yLCBzaW5jZSBpdCB3aWxsIHNlZVxuICogdGhlIHJlbW90YWJsZXMgaW4gdGhlIHNhbWUgb3JkZXIgYWdhaW4uIFVuZm9ydHVuYXRlbHksIHRoaXMgaXNcbiAqIG5vdCB0cnVlIG9mIGFycmF5cyBvZiBwYXNzYWJsZXMgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsb25nTGl2ZWRcbiAqIEByZXR1cm5zIHtGdWxsQ29tcGFyYXRvcktpdH1cbiAqLyRozY9fb25jZS5jb21wYXJlUmFuayhjb21wYXJlUmFuayk7JGjNj19vbmNlLmNvbXBhcmVBbnRpUmFuayhjb21wYXJlQW50aVJhbmspO1xuICAgICAgIGNvbnN0IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gKGxvbmdMaXZlZCA9IGZhbHNlKSA9PiB7XG4gIGxldCBudW1TZWVuID0gMDtcbiAgLyogV2hlbiBkeW5hbWljYWxseSBjcmVhdGVkIHdpdGggc2hvcnQgbGlmZXRpbWVzICh0aGUgZGVmYXVsdCkgYSBXZWFrTWFwKi9cbiAgLyogd291bGQgcGVyZm9ybSBwb29ybHksIGFuZCB0aGUgbGVhayBjcmVhdGVkIGJ5IGEgTWFwIG9ubHkgbGFzdHMgYXMgbG9uZyovXG4gIC8qIGFzIHRoZSBNYXAuKi9cbiAgY29uc3QgTWFwQ29uc3RydWN0b3IgPSBsb25nTGl2ZWQgPyBXZWFrTWFwIDogTWFwO1xuICBjb25zdCBzZWVuID0gbmV3IE1hcENvbnN0cnVjdG9yKCk7XG4gIGNvbnN0IHRhZyA9IHIgPT4ge1xuICAgIGlmIChzZWVuLmhhcyhyKSkge1xuICAgICAgcmV0dXJuIHNlZW4uZ2V0KHIpO1xuICAgIH1cbiAgICBudW1TZWVuICs9IDE7XG4gICAgc2Vlbi5zZXQociwgbnVtU2Vlbik7XG4gICAgcmV0dXJuIG51bVNlZW47XG4gIH07XG4gIGNvbnN0IGNvbXBhcmVSZW1vdGFibGVzID0gKHgsIHkpID0+IGNvbXBhcmVSYW5rKHRhZyh4KSwgdGFnKHkpKTtcbiAgcmV0dXJuIG1ha2VDb21wYXJhdG9yS2l0KGNvbXBhcmVSZW1vdGFibGVzKTtcbn07JGjNj19vbmNlLm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbmhhcmRlbihtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb21wYXJlQnlDb2RlUG9pbnRzIjpbImNvbXBhcmVCeUNvZGVQb2ludHMiXSwiY29tcGFyZU51bWVyaWNzIjpbImNvbXBhcmVOdW1lcmljcyJdLCJnZXRQYXNzU3R5bGVDb3ZlciI6WyJnZXRQYXNzU3R5bGVDb3ZlciJdLCJtYWtlQ29tcGFyYXRvcktpdCI6WyJtYWtlQ29tcGFyYXRvcktpdCJdLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiOlsiY29tcGFyYXRvck1pcnJvckltYWdlIl0sImlzUmFua1NvcnRlZCI6WyJpc1JhbmtTb3J0ZWQiXSwiYXNzZXJ0UmFua1NvcnRlZCI6WyJhc3NlcnRSYW5rU29ydGVkIl0sInNvcnRCeVJhbmsiOlsic29ydEJ5UmFuayJdLCJnZXRJbmRleENvdmVyIjpbImdldEluZGV4Q292ZXIiXSwiRnVsbFJhbmtDb3ZlciI6WyJGdWxsUmFua0NvdmVyIl0sImNvdmVyZWRFbnRyaWVzIjpbImNvdmVyZWRFbnRyaWVzIl0sInVuaW9uUmFua0NvdmVycyI6WyJ1bmlvblJhbmtDb3ZlcnMiXSwiaW50ZXJzZWN0UmFua0NvdmVycyI6WyJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sImNvbXBhcmVSYW5rIjpbImNvbXBhcmVSYW5rIl0sImNvbXBhcmVBbnRpUmFuayI6WyJjb21wYXJlQW50aVJhbmsiXSwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiOlsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAIQAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADjEN0jSQwAAEkMAAAdAAAAQGVuZG8vbmF0LXY1LjEuMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIk5hdCIsImlzTmF0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwnbmFtZScse3ZhbHVlOlwiaXNOYXRcIn0pOyRozY9fb25jZS5pc05hdChpc05hdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdCwnbmFtZScse3ZhbHVlOlwiTmF0XCJ9KTskaM2PX29uY2UuTmF0KE5hdCk7LyogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuKi9cbi8qIENvcHlyaWdodCAoQykgMjAxOCBBZ29yaWMqL1xuLyoqL1xuLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsqL1xuLyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiovXG4vKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQqL1xuLyoqL1xuLyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKi9cbi8qKi9cbi8qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUqL1xuLyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCovXG4vKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qL1xuLyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCovXG4vKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4qL1xuXG4vKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIElzIGBhbGxlZ2VkTnVtYCBhIG51bWJlciBpbiB0aGUgW2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXhhY3RseSBhbmRcbiAqIHVuYW1iaWd1b3VzbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqICBuYXR1cmFsIG51bWJlcnMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycyk/XG4gKlxuICogVG8gcXVhbGlmeSBgYWxsZWdlZE51bWAgbXVzdCBlaXRoZXIgYmUgYVxuICogbm9uLW5lZ2F0aXZlIGBiaWdpbnRgLCBvciBhIG5vbi1uZWdhdGl2ZSBgbnVtYmVyYCByZXByZXNlbnRpbmcgYW4gaW50ZWdlclxuICogd2l0aGluIHJhbmdlIG9mIFtpbnRlZ2VycyBzYWZlbHkgcmVwcmVzZW50YWJsZSBpblxuICogZmxvYXRpbmcgcG9pbnRdKGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIpLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTmF0KGFsbGVnZWROdW0pIHtcbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBhbGxlZ2VkTnVtID49IDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSAmJiBhbGxlZ2VkTnVtID49IDA7XG59XG5cbi8qKlxuICogSWYgYGFsbGVnZWROdW1iZXJgIHBhc3NlcyB0aGUgYGlzTmF0YCB0ZXN0LCB0aGVuIHJldHVybiBpdCBhcyBhIGJpZ2ludC5cbiAqIE90aGVyd2lzZSB0aHJvdyBhbiBhcHByb3ByaWF0ZSBlcnJvci5cbiAqXG4gKiBJZiBgYWxsZWdlZE51bWAgaXMgbmVpdGhlciBhIGJpZ2ludCBub3IgYSBudW1iZXIsIGBOYXRgIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpZiBpdCBpcyBub3QgYSBbc2FmZWx5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiBub24tbmVnYXRpdmUgaW50ZWdlciwgYE5hdGAgdGhyb3dzIGEgYFJhbmdlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBiaWdpbnQgaWYgbmVjZXNzYXJ5IGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKSB7XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ2JpZ2ludCcpIHtcbiAgICBpZiAoYWxsZWdlZE51bSA8IDBuKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gICAgfVxuICAgIHJldHVybiBhbGxlZ2VkTnVtO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtID09PSAnbnVtYmVyJykge1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG4gICAgfVxuICAgIGlmIChhbGxlZ2VkTnVtIDwgMCkge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuICAgIH1cbiAgICByZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuICB9XG5cbiAgdGhyb3cgVHlwZUVycm9yKFxuICAgIGAke2FsbGVnZWROdW19IGlzIGEgJHt0eXBlb2YgYWxsZWdlZE51bX0gYnV0IG11c3QgYmUgYSBiaWdpbnQgb3IgYSBudW1iZXJgLFxuICApO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABubt5zNgsAADYLAAAgAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIiwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3NyYy9lcnJvci5qcyIsIi4vc3JjL3JlbW90YWJsZS5qcyIsIi4vc3JjL3N5bWJvbC5qcyIsIi4vc3JjL3N0cmluZy5qcyIsIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIiwiLi9zcmMvbWFrZVRhZ2dlZC5qcyIsIi4vc3JjL21ha2UtZmFyLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiRmFyIiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIiwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiLCJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyIsImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiLCJpc09iamVjdCIsImlzT2JqZWN0IiwiaXNQYXNzYWJsZSIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9pdGVyLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9lcnJvci5qc1wiLCBbXV0sW1wiLi9zcmMvcmVtb3RhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9zeW1ib2wuanNcIiwgW11dLFtcIi4vc3JjL3N0cmluZy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlT2YuanNcIiwgW11dLFtcIi4vc3JjL21ha2VUYWdnZWQuanNcIiwgW11dLFtcIi4vc3JjL21ha2UtZmFyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjpbWyJtYXBJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sWyJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIl1dLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6W1siUEFTU19TVFlMRSIsIlBBU1NfU1RZTEUiXSxbImlzT2JqZWN0IiwiaXNPYmplY3QiXSxbImlzUHJpbWl0aXZlIiwiaXNQcmltaXRpdmUiXSxbImFzc2VydENoZWNrZXIiLCJhc3NlcnRDaGVja2VyIl0sWyJnZXRUYWciLCJnZXRUYWciXSxbImhhc093blByb3BlcnR5T2YiLCJoYXNPd25Qcm9wZXJ0eU9mIl1dLCIuL3NyYy9lcnJvci5qcyI6W1siZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEVycm9yQ29uc3RydWN0b3IiXSxbImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiXV0sIi4vc3JjL3JlbW90YWJsZS5qcyI6W1siZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdLFsiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiLCJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyJdXSwiLi9zcmMvc3ltYm9sLmpzIjpbWyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sWyJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCJdLFsibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sWyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSxbInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIiwidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiXV0sIi4vc3JjL3N0cmluZy5qcyI6W1siaXNXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLFsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRQYXNzYWJsZVN0cmluZyJdXSwiLi9zcmMvcGFzc1N0eWxlT2YuanMiOltbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXSxbImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIl0sWyJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIl0sWyJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSxbInRvVGhyb3dhYmxlIiwidG9UaHJvd2FibGUiXV0sIi4vc3JjL21ha2VUYWdnZWQuanMiOltbIm1ha2VUYWdnZWQiLCJtYWtlVGFnZ2VkIl1dLCIuL3NyYy9tYWtlLWZhci5qcyI6W1siUmVtb3RhYmxlIiwiUmVtb3RhYmxlIl0sWyJGYXIiLCJGYXIiXSxbIlRvRmFyRnVuY3Rpb24iLCJUb0ZhckZ1bmN0aW9uIl0sWyJHRVRfTUVUSE9EX05BTUVTIiwiR0VUX01FVEhPRF9OQU1FUyJdXSwiLi9zcmMvdHlwZUd1YXJkcy5qcyI6W1siYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVjb3JkIl0sWyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiXSxbImFzc2VydFJlbW90YWJsZSIsImFzc2VydFJlbW90YWJsZSJdLFsiaXNSZW1vdGFibGUiLCJpc1JlbW90YWJsZSJdLFsiaXNSZWNvcmQiLCJpc1JlY29yZCJdLFsiaXNDb3B5QXJyYXkiLCJpc0NvcHlBcnJheSJdLFsiaXNBdG9tIiwiaXNBdG9tIl0sWyJhc3NlcnRBdG9tIiwiYXNzZXJ0QXRvbSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAToVuIxUNAAAVDQAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9ieXRlQXJyYXkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiQnl0ZUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJztcbiAqL1xuXG5jb25zdCB7IGdldFByb3RvdHlwZU9mLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cywgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qIERldGVjdHMgdGhlIHByZXNlbmNlIG9mIGEgaW1tdXRhYmxlIEFycmF5QnVmZmVyIHN1cHBvcnQgaW4gdGhlIHVuZGVybHlpbmcqL1xuLyogcGxhdGZvcm0gYW5kIHByb3ZpZGVzIGVpdGhlciBzdWl0YWJsZSB2YWx1ZXMgZnJvbSB0aGF0IGltcGxlbWVudGF0aW9uIG9yKi9cbi8qIHZhbHVlcyB0aGF0IHdpbGwgY29uc2lzdGVudGx5IGRlbnkgdGhhdCBpbW11dGFibGUgQXJyYXlCdWZmZXJzIGV4aXN0LiovXG5jb25zdCBhZGFwdEltbXV0YWJsZUFycmF5QnVmZmVyID0gKCkgPT4ge1xuICBjb25zdCBhbkFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDApO1xuXG4gIC8qIE9uIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHNsaWNlVG9JbW11dGFibGUsIHBhc3Mtc3R5bGUgYnl0ZUFycmF5Ki9cbiAgLyogY2Fubm90IGJlIGNvbnN0cnVjdGVkLiovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgVE9ETyBUaGlzIGVycm9yIHdpbGwgYmUgYWRkcmVzc2VkIHdoZW4gdXBkYXRpbmcqL1xuICAvKiBUeXBlU2NyaXB0J3MgbmF0aXZlIHR5cGVzIHRvIGEgdmVyc2lvbiByZWNvZ25pemluZyB0aGUgdXBjb21pbmcgc3RhbmRhcmQuKi9cbiAgaWYgKGFuQXJyYXlCdWZmZXIuc2xpY2VUb0ltbXV0YWJsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlOiBudWxsLFxuICAgICAgaW1tdXRhYmxlR2V0dGVyOiAoKSA9PiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBUT0RPIFRoaXMgZXJyb3Igd2lsbCBiZSBhZGRyZXNzZWQgd2hlbiB1cGRhdGluZyovXG4gIC8qIFR5cGVTY3JpcHQncyBuYXRpdmUgdHlwZXMgdG8gYSB2ZXJzaW9uIHJlY29nbml6aW5nIHRoZSB1cGNvbWluZyBzdGFuZGFyZC4qL1xuICBjb25zdCBhbkltbXV0YWJsZUFycmF5QnVmZmVyID0gYW5BcnJheUJ1ZmZlci5zbGljZVRvSW1tdXRhYmxlKCk7XG5cbiAgLyoqXG4gKiBBcyBwcm9wb3NlZCwgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIGBBcnJheUJ1ZmZlci5wcm90b3R5cGVgLiBBcyBzaGltbWVkLFxuICogdGhpcyB3aWxsIGJlIGEgaGlkZGVuIGludHJpbnNpYyB0aGF0IGluaGVyaXRzIGZyb20gYEFycmF5QnVmZmVyLnByb3RvdHlwZWAuXG4gKiBFaXRoZXIgd2F5LCBnZXQgdGhpcyBpbiBhIHdheSB0aGF0IHdlIGNhbiB0cnVzdCBpdCBhZnRlciBsb2NrZG93biwgYW5kXG4gKiByZXF1aXJlIHRoYXQgYWxsIGltbXV0YWJsZSBBcnJheUJ1ZmZlcnMgZGlyZWN0bHkgaW5oZXJpdCBmcm9tIGl0LlxuICovXG4gIGNvbnN0IGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW5JbW11dGFibGVBcnJheUJ1ZmZlcik7XG5cbiAgY29uc3QgaW1tdXRhYmxlR2V0dGVyID0gLyoqIEB0eXBlIHsodGhpczogQXJyYXlCdWZmZXIpID0+IGJvb2xlYW59ICovIChcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgdGhlIGRlc2NpcHRvciBpcyB0aGVyZS4qL1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZSwgJ2ltbXV0YWJsZScpLmdldFxuICApO1xuXG4gIHJldHVybiB7IGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlLCBpbW11dGFibGVHZXR0ZXIgfTtcbn07XG5cbmNvbnN0IHsgaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUsIGltbXV0YWJsZUdldHRlciB9ID1cbiAgYWRhcHRJbW11dGFibGVBcnJheUJ1ZmZlcigpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBCeXRlQXJyYXlIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdieXRlQXJyYXknLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PlxuICAgIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciAmJlxuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBUT0RPIEhvdyBkbyBJIGFkZCBpdCB0byB0aGUgQXJyYXlCdWZmZXIgdHlwZT8qL1xuICAgICAgY2FuZGlkYXRlLmltbXV0YWJsZSkgfHxcbiAgICAoISFjaGVjayAmJiBjaGVjayhmYWxzZSwgWGBJbW11dGFibGUgQXJyYXlCdWZmZXIgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIF9wYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUgfHxcbiAgICAgIGFzc2VydC5mYWlsKFhgTWFsZm9ybWVkIEJ5dGVBcnJheSAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICAgIGFwcGx5KGltbXV0YWJsZUdldHRlciwgY2FuZGlkYXRlLCBbXSkgfHxcbiAgICAgIEZhaWxgTXVzdCBiZSBhbiBpbW11dGFibGUgQXJyYXlCdWZmZXI6ICR7Y2FuZGlkYXRlfWA7XG4gICAgb3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgIFhgQnl0ZUFycmF5cyBtdXN0IG5vdCBoYXZlIG93biBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gLFxuICAgICAgICBUeXBlRXJyb3IsXG4gICAgICApO1xuICB9LFxufSk7JGjNj19vbmNlLkJ5dGVBcnJheUhlbHBlcihCeXRlQXJyYXlIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnl0ZUFycmF5SGVscGVyIjpbIkJ5dGVBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACZp73SCAgAAAgIAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxhc3NlcnRDaGVja2VyLGdldE93bkRhdGFEZXNjcmlwdG9yOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCB7IGdldFByb3RvdHlwZU9mIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXksIHByb3RvdHlwZTogYXJyYXlQcm90b3R5cGUgfSA9IEFycmF5O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG4gICAgICAgY29uc3QgQ29weUFycmF5SGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAnY29weUFycmF5JyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT5cbiAgICBpc0FycmF5KGNhbmRpZGF0ZSkgfHxcbiAgICAoISFjaGVjayAmJiBjaGVjayhmYWxzZSwgWGBBcnJheSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpLFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkgPT09IGFycmF5UHJvdG90eXBlIHx8XG4gICAgICBhc3NlcnQuZmFpbChYYE1hbGZvcm1lZCBhcnJheTogJHtjYW5kaWRhdGV9YCwgVHlwZUVycm9yKTtcbiAgICAvKiBTaW5jZSB3ZSdyZSBhbHJlYWR5IGVuc3VyZWQgY2FuZGlkYXRlIGlzIGFuIGFycmF5LCBpdCBzaG91bGQgbm90IGJlKi9cbiAgICAvKiBwb3NzaWJsZSBmb3IgdGhlIGZvbGxvd2luZyBnZXQgdG8gZmFpbC4qL1xuICAgIGNvbnN0IGxlbiA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoXG4gICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsICdsZW5ndGgnLCBmYWxzZSwgYXNzZXJ0Q2hlY2tlcikudmFsdWVcbiAgICApO1xuICAgIC8qIFZhbGlkYXRlIHRoYXQgZWFjaCBpbmRleCBwcm9wZXJ0eSBpcyBvd24vZGF0YS9lbnVtZXJhYmxlKi9cbiAgICAvKiBhbmQgaXRzIGFzc29jaWF0ZWQgdmFsdWUgaXMgcmVjdXJzaXZlbHkgcGFzc2FibGUuKi9cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICBwYXNzU3R5bGVPZlJlY3VyKFxuICAgICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsIGksIHRydWUsIGFzc2VydENoZWNrZXIpLnZhbHVlLFxuICAgICAgKTtcbiAgICB9XG4gICAgLyogRXhwZWN0IG9uZSBrZXkgcGVyIGluZGV4IHBsdXMgb25lIGZvciAnbGVuZ3RoJy4qL1xuICAgIG93bktleXMoY2FuZGlkYXRlKS5sZW5ndGggPT09IGxlbiArIDEgfHxcbiAgICAgIGFzc2VydC5mYWlsKFhgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsIFR5cGVFcnJvcik7XG4gIH0sXG59KTskaM2PX29uY2UuQ29weUFycmF5SGVscGVyKENvcHlBcnJheUhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5QXJyYXlIZWxwZXIiOlsiQ29weUFycmF5SGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEcvuh1nCwAAZwsAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvY29weVJlY29yZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixnZXRPd25EYXRhRGVzY3JpcHRvcixDWCxjYW5CZU1ldGhvZDskaM2PX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV0sW1wiQ1hcIixbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJjYW5CZU1ldGhvZFwiLFskaM2PX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBnZXRQcm90b3R5cGVPZiwgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKi9cbmNvbnN0IGNoZWNrT2JqZWN0UHJvdG90eXBlID0gKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIChcbiAgICBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YClcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7UHJvcGVydHlLZXl9IGtleVxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKi9cbmNvbnN0IGNoZWNrUHJvcGVydHlDYW5CZVZhbGlkID0gKGNhbmRpZGF0ZSwga2V5LCB2YWx1ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIChcbiAgICAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKCFjYW5CZU1ldGhvZCh2YWx1ZSkgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIC8qIFRPRE86IFVwZGF0ZSBtZXNzYWdlIG5vdyB0aGF0IHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgXCJpbXBsaWNpdCBSZW1vdGFibGVcIi4qL1xuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKVxuICApO1xufTtcblxuLyoqXG4gKlxuICogQHR5cGUge0lNUE9SVCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuICAgICAgIGNvbnN0IENvcHlSZWNvcmRIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdjb3B5UmVjb3JkJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBjaGVja09iamVjdFByb3RvdHlwZShjYW5kaWRhdGUsIGNoZWNrKSAmJlxuICAgICAgLyogUmVqZWN0IGFueSBjYW5kaWRhdGUgd2l0aCBhIHN5bWJvbC1rZXllZCBwcm9wZXJ0eSBvciBtZXRob2QtbGlrZSBwcm9wZXJ0eSovXG4gICAgICAvKiAoc3VjaCBpbnB1dCBpcyBwb3RlbnRpYWxseSBhIFJlbW90YWJsZSkuKi9cbiAgICAgIG93bktleXMoY2FuZGlkYXRlKS5ldmVyeShrZXkgPT5cbiAgICAgICAgY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQoY2FuZGlkYXRlLCBrZXksIGNhbmRpZGF0ZVtrZXldLCBjaGVjayksXG4gICAgICApXG4gICAgKTtcbiAgfSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICAvKiBWYWxpZGF0ZSB0aGF0IGVhY2ggb3duIHByb3BlcnR5IGhhcyBhIHJlY3Vyc2l2ZWx5IHBhc3NhYmxlIGFzc29jaWF0ZWQqL1xuICAgIC8qIHZhbHVlICh3ZSBhbHJlYWR5IGtub3cgZnJvbSBjYW5CZVZhbGlkIHRoYXQgdGhlIG90aGVyIGNvbnN0cmFpbnRzIGFyZSovXG4gICAgLyogc2F0aXNmaWVkKS4qL1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGdldE93bkRhdGFEZXNjcmlwdG9yKFxuICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHRydWUsXG4gICAgICAgIGFzc2VydENoZWNrZXIsXG4gICAgICApO1xuICAgICAgcGFzc1N0eWxlT2ZSZWN1cih2YWx1ZSk7XG4gICAgfVxuICB9LFxufSk7JGjNj19vbmNlLkNvcHlSZWNvcmRIZWxwZXIoQ29weVJlY29yZEhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5UmVjb3JkSGVscGVyIjpbIkNvcHlSZWNvcmRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnjrC09gZAADYGQAALgAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9kZWVwbHlGdWxmaWxsZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJkZWVwbHlGdWxmaWxsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHEsRSxpc1Byb21pc2UsZ2V0VGFnLHBhc3NTdHlsZU9mLG1ha2VUYWdnZWQsaXNBdG9tOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJpc0F0b21cIixbJGjNj19hID0+IChpc0F0b20gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1JlbW90YWJsZUJyYW5kfSBmcm9tICdAZW5kby9ldmVudHVhbC1zZW5kJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBCeXRlQXJyYXksIENvcHlSZWNvcmQsIENvcHlBcnJheSwgQ29weVRhZ2dlZCwgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJ1xuICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBDdXJyZW50bHkgY29waWVkIGZyb20gQGFnb3JpYy9pbnRlcm5hbCB1dGlscy5qcy5cbiAqIFRPRE8gU2hvdWxkIG1pZ3JhdGUgaGVyZSBhbmQgdGhlbiwgaWYgbmVlZGVkLCByZWV4cG9ydGVkIHRoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7eyBbS2V5VHlwZSBpbiBrZXlvZiBUXTogVFtLZXlUeXBlXSB9ICYge319IFNpbXBsaWZ5IGZsYXR0ZW4gdGhlXG4gKiAgIHR5cGUgb3V0cHV0IHRvIGltcHJvdmUgdHlwZSBoaW50cyBzaG93biBpbiBlZGl0b3JzXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0L2Jsb2IvbWFpbi9zb3VyY2Uvc2ltcGxpZnkuZC50c1xuICovXG5cbi8qKlxuICogQ3VycmVudGx5IGNvcGllZCBmcm9tIEBhZ29yaWMvaW50ZXJuYWwgdXRpbHMuanMuXG4gKiBUT0RPIFNob3VsZCBtaWdyYXRlIGhlcmUgYW5kIHRoZW4sIGlmIG5lZWRlZCwgcmVleHBvcnRlZCB0aGVyZS5cbiAqXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IENhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBDdXJyZW50bHkgY29waWVkIGZyb20gQGFnb3JpYy9pbnRlcm5hbCB1dGlscy5qcy5cbiAqIFRPRE8gU2hvdWxkIG1pZ3JhdGUgaGVyZSBhbmQgdGhlbiwgaWYgbmVlZGVkLCByZWV4cG9ydGVkIHRoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ2FsbGFibGUgPyBUW0tdIDogRGVlcGx5QXdhaXRlZDxUW0tdPjtcbiAqIH19IERlZXBseUF3YWl0ZWRPYmplY3RcbiAqL1xuXG4vKipcbiAqIEN1cnJlbnRseSBjb3BpZWQgZnJvbSBAYWdvcmljL2ludGVybmFsIHV0aWxzLmpzLlxuICogVE9ETyBTaG91bGQgbWlncmF0ZSBoZXJlIGFuZCB0aGVuLCBpZiBuZWVkZWQsIHJlZXhwb3J0ZWQgdGhlcmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgUHJvbWlzZUxpa2U8YW55PlxuICogICAgID8gQXdhaXRlZDxUPlxuICogICAgIDogVCBleHRlbmRzIChSZW1vdGFibGVCcmFuZDxhbnksIGFueT4gfCBSZW1vdGFibGVPYmplY3QpXG4gKiAgICAgICA/IFRcbiAqICAgICAgIDogVCBleHRlbmRzIHt9XG4gKiAgICAgICAgID8gU2ltcGxpZnk8RGVlcGx5QXdhaXRlZE9iamVjdDxUPj5cbiAqICAgICAgICAgOiBBd2FpdGVkPFQ+fSBEZWVwbHlBd2FpdGVkXG4gKi9cblxuLyoqXG4gKiBHaXZlbiBhIFBhc3NhYmxlIGB2YWxgIHdob3NlIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgbWF5IGNvbnRhaW4gbGVhZlxuICogcHJvbWlzZXMsIHJldHVybiBhIHByb21pc2UgZm9yIGEgcmVwbGFjZW1lbnQgUGFzc2FibGUsXG4gKiB3aGVyZSB0aGF0IHJlcGxhY2VtZW50IGlzICpkZWVwbHkgZnVsZmlsbGVkKiwgaS5lLiwgaXRzXG4gKiBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIGRvZXMgbm90IGNvbnRhaW4gYW55IHByb21pc2VzLlxuICpcbiAqIFRoaXMgaXMgYSBkZWVwIGZvcm0gb2YgYFByb21pc2UuYWxsYCBzcGVjaWFsaXplZCBmb3IgUGFzc2FibGVzLiBGb3IgZWFjaFxuICogZW5jb3VudGVyZWQgcHJvbWlzZSwgcmVwbGFjZSBpdCB3aXRoIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm0gb2ZcbiAqIGl0cyBmdWxmaWxsbWVudC5cbiAqIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgcmVqZWN0LCB0aGVuIHRoZSBwcm9taXNlIGZvciB0aGUgcmVwbGFjZW1lbnRcbiAqIHJlamVjdHMuIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgbmV2ZXIgc2V0dGxlLCB0aGVuIHRoZSBwcm9taXNlIGZvclxuICogdGhlIHJlcGxhY2VtZW50IG5ldmVyIHNldHRsZXMuXG4gKlxuICogSWYgdGhlIHJlcGxhY2VtZW50IHdvdWxkIG5vdCBiZSBQYXNzYWJsZSwgaS5lLiwgaWYgYHZhbGAgaXMgbm90XG4gKiBQYXNzYWJsZSwgb3IgaWYgYW55IG9mIHRoZSB0cmFuc2l0aXZlIHByb21pc2VzIGZ1bGZpbGwgdG8gc29tZXRoaW5nXG4gKiB0aGF0IGlzIG5vdCBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSByZWplY3RzLlxuICpcbiAqIElmIGB2YWxgIG9yIGl0cyBwYXJ0cyBhcmUgbm9uLWtleSBQYXNzYWJsZXMgb25seSAqYmVjYXVzZSogdGhleSBjb250YWluXG4gKiBwcm9taXNlcywgdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybXMgb2YgdmFsIG9yIGl0cyBwYXJ0cyBtYXkgYmUga2V5cy4gVGhpc1xuICogaXMgZm9yIHRoZSBoaWdoZXIgXCJAZW5kby9wYXR0ZXJuc1wiIGxldmVsIG9mIGFic3RyYWN0aW9uIHRvIGRldGVybWluZSxcbiAqIGJlY2F1c2UgaXQgZGVmaW5lcyB0aGUgYEtleWAgbm90aW9uIGluIHF1ZXN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFtUPVBhc3NhYmxlXVxuICogQHBhcmFtIHtUfSB2YWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPERlZXBseUF3YWl0ZWQ8VD4+fVxuICovXG4gICAgICAgY29uc3QgZGVlcGx5RnVsZmlsbGVkID0gYXN5bmMgdmFsID0+IHtcbiAgLyogVE9ETyBGaWd1cmUgb3V0IHdoeSB3ZSBuZWVkIHRoZXNlIGF0LWV4cGVjdC1lcnJvciBkaXJlY3RpdmVzIGJlbG93Ki9cbiAgLyogYW5kIGZpeCBpZiBwb3NzaWJsZS4qL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzEyNTcgbWF5IGJlIHJlbGV2YW50LiovXG5cbiAgLyogSWYgYHZhbGAgaXMgbm90IFBhc3NhYmxlLCBgaXNBdG9tYCB3aWxsIHJldHVybiBmYWxzZSByYXRoZXIgdGhhbiovXG4gIC8qIHRocm93aW5nLiovXG4gIGlmIChpc0F0b20odmFsKSkge1xuICAgIHJldHVybiAvKiogQHR5cGUge0RlZXBseUF3YWl0ZWQ8VD59ICovICh2YWwpO1xuICB9XG4gIC8qIGlmIGB2YWxgIGlzIGEgcHJvbWlzZSBidXQgbm90IGEgcGFzc2FibGUgcHJvbWlzZSwgZm9yIGV4YW1wbGUsKi9cbiAgLyogYmVjYXVzZSBpdCBpcyBub3QgaGFyZGVuZWQsIGBpc1Byb21pc2VgIHdpbGwgcmV0dXJuIHRydWUsIHdoaWNoIGlzKi9cbiAgLyogb2sgaGVyZSBiYWNhdXNlIHdlIHVud3JhcCBpdCB0byBpdHMgc2V0dGxlbWVudCBhbmQgZGlzcGVuc2Ugd2l0aCB0aGUqL1xuICAvKiBwcm9taXNlKi9cbiAgaWYgKGlzUHJvbWlzZSh2YWwpKSB7XG4gICAgcmV0dXJuIEUud2hlbih2YWwsIG5vbnAgPT4gZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiAgfVxuICAvKiBJZiBgdmFsYCBpcyBhbnkgb3RoZXIgbm9uLVBhc3NhYmxlLCB0aGUgYHBhc3NTdHlsZU9mKHZhbClgIHdpbGwgdGhyb3cuKi9cbiAgLyogU28gdGhpcyBleGVtcHRpb24gZm9yIG5vbi1QYXNzYWJsZSBwcm9taXNlcyBpcyBvbmx5IGZvciB0aGUgdG9wLWxldmVsLiovXG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIGNvbnN0IHJlYyA9IC8qKiBAdHlwZSB7Q29weVJlY29yZH0gKi8gKHZhbCk7XG4gICAgICBjb25zdCBuYW1lcyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChvd25LZXlzKHJlYykpO1xuICAgICAgY29uc3QgdmFsUHMgPSBuYW1lcy5tYXAobmFtZSA9PiBkZWVwbHlGdWxmaWxsZWQocmVjW25hbWVdKSk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCB2YWxzID0+XG4gICAgICAgIGhhcmRlbihmcm9tRW50cmllcyh2YWxzLm1hcCgoYywgaSkgPT4gW25hbWVzW2ldLCBjXSkpKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgIGNvbnN0IGFyciA9IC8qKiBAdHlwZSB7Q29weUFycmF5fSAqLyAodmFsKTtcbiAgICAgIGNvbnN0IHZhbFBzID0gYXJyLm1hcChwID0+IGRlZXBseUZ1bGZpbGxlZChwKSk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCB2YWxzID0+IGhhcmRlbih2YWxzKSk7XG4gICAgfVxuICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgIGNvbnN0IGJ5dGVBcnJheSA9IC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAodmFsKSk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiBieXRlQXJyYXk7XG4gICAgfVxuICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgIGNvbnN0IHRnZCA9IC8qKiBAdHlwZSB7Q29weVRhZ2dlZH0gKi8gKHZhbCk7XG4gICAgICBjb25zdCB0YWcgPSBnZXRUYWcodGdkKTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3Igbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnRGVlcGx5QXdhaXRlZDxUPicqL1xuICAgICAgcmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodGdkLnBheWxvYWQpLCBwYXlsb2FkID0+XG4gICAgICAgIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgIGNvbnN0IHJlbSA9IC8qKiBAdHlwZSB7UmVtb3RhYmxlT2JqZWN0fSAqLyAodmFsKTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3Igbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnRGVlcGx5QXdhaXRlZDxUPicqL1xuICAgICAgcmV0dXJuIHJlbTtcbiAgICB9XG4gICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICBjb25zdCBlcnIgPSAvKiogQHR5cGUge0Vycm9yfSAqLyAodmFsKTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3Igbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnRGVlcGx5QXdhaXRlZDxUPicqL1xuICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG4gICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgIGNvbnN0IHByb20gPSAvKiogQHR5cGUge1Byb21pc2V9ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh2YWwpKTtcbiAgICAgIHJldHVybiBFLndoZW4ocHJvbSwgbm9ucCA9PiBkZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBhc3NlcnQuZmFpbChYYFVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsIFR5cGVFcnJvcik7XG4gICAgfVxuICB9XG59OyRozY9fb25jZS5kZWVwbHlGdWxmaWxsZWQoZGVlcGx5RnVsZmlsbGVkKTtcbmhhcmRlbihkZWVwbHlGdWxmaWxsZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVlcGx5RnVsZmlsbGVkIjpbImRlZXBseUZ1bGZpbGxlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABqyyZGzR0AAM0dAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2Vycm9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJFcnJvckhlbHBlciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIiwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwiaXNFcnJvckxpa2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLGFzc2VydENoZWNrZXIsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiQ1hcIixbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnICovXG4vKiogQGltcG9ydCB7Q2hlY2tlciwgUGFzc1N0eWxlLCBQYXNzU3R5bGVPZn0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgeyBnZXRQcm90b3R5cGVPZiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgaGFzT3duLCBlbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qIFRPRE86IE1haW50ZW5hbmNlIGhhemFyZDogQ29vcmRpbmF0ZSB3aXRoIHRoZSBsaXN0IG9mIGVycm9ycyBpbiB0aGUgU0VTKi9cbi8qIHdoaWxlbGlzdC4qL1xuY29uc3QgZXJyb3JDb25zdHJ1Y3RvcnMgPSBuZXcgTWFwKFxuICAvKiBDYXN0IGJlY2F1c2Ugb3RoZXJ3aXNlIFRTIGlzIGNvbmZ1c2VkIGJ5IEFnZ3JlZ2F0ZUVycm9yKi9cbiAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzIwNDIjZGlzY3Vzc2lvbl9yMTQ4NDkzMzAyOCovXG4gIC8qKiBAdHlwZSB7QXJyYXk8W3N0cmluZywgSU1QT1JUKCdzZXMnKS5HZW5lcmljRXJyb3JDb25zdHJ1Y3Rvcl0+fSAqL1xuICAoW1xuICAgIFsnRXJyb3InLCBFcnJvcl0sXG4gICAgWydFdmFsRXJyb3InLCBFdmFsRXJyb3JdLFxuICAgIFsnUmFuZ2VFcnJvcicsIFJhbmdlRXJyb3JdLFxuICAgIFsnUmVmZXJlbmNlRXJyb3InLCBSZWZlcmVuY2VFcnJvcl0sXG4gICAgWydTeW50YXhFcnJvcicsIFN5bnRheEVycm9yXSxcbiAgICBbJ1R5cGVFcnJvcicsIFR5cGVFcnJvcl0sXG4gICAgWydVUklFcnJvcicsIFVSSUVycm9yXVxuXG4gICAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy81NTAqL1xuICAgIC8qIFRvIGFjY29tbW9kYXRlIHBsYXRmb3JtcyBwcmlvciB0byBBZ2dyZWdhdGVFcnJvciwgd2UgY29tbWVudCBvdXQgdGhlKi9cbiAgICAvKiBmb2xsb3dpbmcgbGluZSBhbmQgaW5zdGVhZCBjb25kaXRpb25hbGx5IGFkZCBpdCB0byB0aGUgbWFwIGJlbG93LiovXG4gICAgLyogWydBZ2dyZWdhdGVFcnJvcicsIEFnZ3JlZ2F0ZUVycm9yXSwqL1xuICBdKSxcbik7XG5cbmlmICh0eXBlb2YgQWdncmVnYXRlRXJyb3IgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8qIENvbmRpdGlvbmFsLCB0byBhY2NvbW1vZGF0ZSBwbGF0Zm9ybXMgcHJpb3IgdG8gQWdncmVnYXRlRXJyb3IqL1xuICBlcnJvckNvbnN0cnVjdG9ycy5zZXQoJ0FnZ3JlZ2F0ZUVycm9yJywgQWdncmVnYXRlRXJyb3IpO1xufVxuXG4vKipcbiAqIEJlY2F1c2UgdGhlIGVycm9yIGNvbnN0cnVjdG9yIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gbWlnaHQgYmVcbiAqIGBBZ2dyZWdhdGVFcnJvcmAsIHdoaWNoIGhhcyBkaWZmZXJlbnQgY29uc3RydWN0aW9uIHBhcmFtZXRlcnNcbiAqIGZyb20gdGhlIG90aGVyIGVycm9yIGNvbnN0cnVjdG9ycywgZG8gbm90IHVzZSBpdCBkaXJlY3RseSB0byB0cnlcbiAqIHRvIG1ha2UgYW4gZXJyb3IgaW5zdGFuY2UuIFJhdGhlciwgdXNlIGBtYWtlRXJyb3JgIHdoaWNoIGVuY2Fwc3VsYXRlc1xuICogdGhpcyBub24tdW5pZm9ybWl0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0lNUE9SVCgnc2VzJykuR2VuZXJpY0Vycm9yQ29uc3RydWN0b3IgfCB1bmRlZmluZWR9XG4gKi9cbiAgICAgICBjb25zdCBnZXRFcnJvckNvbnN0cnVjdG9yID0gbmFtZSA9PiBlcnJvckNvbnN0cnVjdG9ycy5nZXQobmFtZSk7JGjNj19vbmNlLmdldEVycm9yQ29uc3RydWN0b3IoZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5oYXJkZW4oZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrRXJyb3JMaWtlID0gKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgLyogVE9ETzogTmVlZCBhIGJldHRlciB0ZXN0IHRoYW4gaW5zdGFuY2VvZiovXG4gIHJldHVybiAoXG4gICAgY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICAoISFjaGVjayAmJiBDWChjaGVjaylgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuaGFyZGVuKGNoZWNrRXJyb3JMaWtlKTtcbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogVmFsaWRhdGluZyBlcnJvciBvYmplY3RzIGFyZSBwYXNzYWJsZSByYWlzZXMgYSB0ZW5zaW9uIGJldHdlZW4gc2VjdXJpdHlcbiAqIHZzIHByZXNlcnZpbmcgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbi4gRm9yIGVycm9ycywgd2UgbmVlZCB0byByZW1lbWJlclxuICogdGhlIGVycm9yIGl0c2VsZiBleGlzdHMgdG8gaGVscCB1cyBkaWFnbm9zZSBhIGJ1ZyB0aGF0J3MgbGlrZWx5IG1vcmVcbiAqIHByZXNzaW5nIHRoYW4gYSB2YWxpZGl0eSBidWcgaW4gdGhlIGVycm9yIGl0c2VsZi4gVGh1cywgd2hlbmV2ZXIgaXQgaXMgc2FmZVxuICogdG8gZG8gc28sIHdlIHByZWZlciB0byBsZXQgdGhlIGVycm9yLWxpa2UgdGVzdCBzdWNjZWVkIGFuZCB0byBjb3VjaCB0aGVzZVxuICogY29tcGxhaW50cyBhcyBub3RlcyBvbiB0aGUgZXJyb3IuXG4gKlxuICogVG8gcmVzb2x2ZSB0aGlzLCBzdWNoIGEgbWFsZm9ybWVkIGVycm9yIG9iamVjdCB3aWxsIHN0aWxsIHBhc3NcbiAqIGBpc0Vycm9yTGlrZWAgc28gbWFyc2hhbCBjYW4gdXNlIHRoaXMgZm9yIHRvcCBsZXZlbCBlcnJvciB0byByZXBvcnQgZnJvbSxcbiAqIGV2ZW4gaWYgaXQgd291bGQgbm90IGFjdHVhbGx5IHZhbGlkYXRlLlxuICogSW5zdGVhZCwgdGhlIGRpYWdub3N0aWNzIHRoYXQgYGFzc2VydEVycm9yYCB3b3VsZCBoYXZlIHJlcG9ydGVkIGFyZVxuICogYXR0YWNoZWQgYXMgbm90ZXMgdG8gdGhlIG1hbGZvcm1lZCBlcnJvci4gVGh1cywgYSBtYWxmb3JtZWRcbiAqIGVycm9yIGlzIHBhc3NhYmxlIGJ5IGl0c2VsZiwgYnV0IG5vdCBhcyBwYXJ0IG9mIGEgcGFzc2FibGUgc3RydWN0dXJlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGlzRXJyb3JMaWtlID0gY2FuZGlkYXRlID0+IGNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjNj19vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BOYW1lXG4gKiBAcGFyYW0ge1Byb3BlcnR5RGVzY3JpcHRvcn0gZGVzY1xuICogQHBhcmFtIHsodmFsOiBhbnkpID0+IFBhc3NTdHlsZX0gcGFzc1N0eWxlT2ZSZWN1clxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gKFxuICBwcm9wTmFtZSxcbiAgZGVzYyxcbiAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgY2hlY2sgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKGRlc2MuZW51bWVyYWJsZSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlOiAke2Rlc2N9YFxuICAgICk7XG4gIH1cbiAgaWYgKCFoYXNPd24oZGVzYywgJ3ZhbHVlJykpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yICR7cShcbiAgICAgICAgcHJvcE5hbWUsXG4gICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIGRhdGEgcHJvcGVydHk6ICR7ZGVzY31gXG4gICAgKTtcbiAgfVxuICBjb25zdCB7IHZhbHVlIH0gPSBkZXNjO1xuICBzd2l0Y2ggKHByb3BOYW1lKSB7XG4gICAgY2FzZSAnbWVzc2FnZSc6XG4gICAgY2FzZSAnc3RhY2snOiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yICR7cShcbiAgICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3ZhbHVlfWApXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlICdjYXVzZSc6IHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICByZXR1cm4gY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IodmFsdWUsIHBhc3NTdHlsZU9mUmVjdXIsIGNoZWNrKTtcbiAgICB9XG4gICAgY2FzZSAnZXJyb3JzJzoge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBwYXNzU3R5bGVPZlJlY3VyKHZhbHVlKSAhPT0gJ2NvcHlBcnJheScpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAhIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yICR7cShcbiAgICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgY29weUFycmF5OiAke3ZhbHVlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZS5ldmVyeShlcnIgPT5cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoZXJyLCBwYXNzU3R5bGVPZlJlY3VyLCBjaGVjayksXG4gICAgICApO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICAhIWNoZWNrICYmXG4gICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yIGhhcyBleHRyYSB1bnBhc3NlZCBwcm9wZXJ0eSAke3EocHJvcE5hbWUpfWBcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKTtcbmhhcmRlbihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7KHZhbDogYW55KSA9PiBQYXNzU3R5bGV9IHBhc3NTdHlsZU9mUmVjdXJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciA9IChcbiAgY2FuZGlkYXRlLFxuICBwYXNzU3R5bGVPZlJlY3VyLFxuICBjaGVjayA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAoIWNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSwgY2hlY2spKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbiAgY29uc3QgeyBuYW1lIH0gPSBwcm90bztcbiAgY29uc3QgZXJyQ29uc3RydWN0b3IgPSBnZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpO1xuICBpZiAoZXJyQ29uc3RydWN0b3IgPT09IHVuZGVmaW5lZCB8fCBlcnJDb25zdHJ1Y3Rvci5wcm90b3R5cGUgIT09IHByb3RvKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKFxuICAgICAgICBjaGVjayxcbiAgICAgIClgUGFzc2FibGUgRXJyb3IgbXVzdCBpbmhlcml0IGZyb20gYW4gZXJyb3IgY2xhc3MgLnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YFxuICAgICk7XG4gIH1cbiAgY29uc3QgZGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG4gIGlmICghKCdtZXNzYWdlJyBpbiBkZXNjcykpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goXG4gICAgICAgIGNoZWNrLFxuICAgICAgKWBQYXNzYWJsZSBFcnJvciBtdXN0IGhhdmUgYW4gb3duIFwibWVzc2FnZVwiIHN0cmluZyBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZW50cmllcyhkZXNjcykuZXZlcnkoKFtwcm9wTmFtZSwgZGVzY10pID0+XG4gICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoXG4gICAgICBwcm9wTmFtZSxcbiAgICAgIGRlc2MsXG4gICAgICBwYXNzU3R5bGVPZlJlY3VyLFxuICAgICAgY2hlY2ssXG4gICAgKSxcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKTtcbmhhcmRlbihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuICAgICAgIGNvbnN0IEVycm9ySGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAnZXJyb3InLFxuXG4gIGNhbkJlVmFsaWQ6IGNoZWNrRXJyb3JMaWtlLFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT5cbiAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIsIGFzc2VydENoZWNrZXIpLFxufSk7JGjNj19vbmNlLkVycm9ySGVscGVyKEVycm9ySGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldEVycm9yQ29uc3RydWN0b3IiOlsiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLCJpc0Vycm9yTGlrZSI6WyJpc0Vycm9yTGlrZSJdLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyI6WyJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyJdLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciI6WyJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciJdLCJFcnJvckhlbHBlciI6WyJFcnJvckhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7Bop6fAkAAHwJAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2l0ZXItaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFrZS1mYXIuanNcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYXMgbWFueSBlbGVtZW50cyBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgYW5kXG4gKiBoYXZlIHRoZSBzYW1lIHRlcm1pbmF0aW9uIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWUgb3IgZmFpbHVyZVxuICogcmVhc29uLiBCdXQgdGhlIG5vbi1maW5hbCB2YWx1ZXMgYXJlIHRoZSBjb3JyZXNwb25kaW5nIG5vbi1maW5hbFxuICogdmFsdWVzIGZyb20gYGJhc2VJdGVyYXRvcmAgYXMgdHJhbnNmb3JtZWQgYnkgYGZ1bmNgLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFVcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IFV9IGZ1bmNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxVPn1cbiAqL1xuICAgICAgIGNvbnN0IG1hcEl0ZXJhYmxlID0gKGJhc2VJdGVyYWJsZSwgZnVuYykgPT5cbiAgLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbiAgRmFyKCdtYXBwZWQgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VJdGVyYXRvciA9IGJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICByZXR1cm4gRmFyKCdtYXBwZWQgaXRlcmF0b3InLCB7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHZhbHVlOiBiYXNlVmFsdWUsIGRvbmUgfSA9IGJhc2VJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBkb25lID8gYmFzZVZhbHVlIDogZnVuYyhiYXNlVmFsdWUpO1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyB2YWx1ZSwgZG9uZSB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pOyRozY9fb25jZS5tYXBJdGVyYWJsZShtYXBJdGVyYWJsZSk7XG5oYXJkZW4obWFwSXRlcmFibGUpO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGEgc3Vic2V0IG9mIHRoZSBub24tZmluYWwgdmFsdWVzIGZyb20gdGhlXG4gKiBgYmFzZUl0ZXJhdG9yYCAtLS0gdGhvc2UgZm9yIHdoaWNoIGBwcmVkKHZhbHVlKWAgd2FzIHRydXRoeS4gVGhlIHJlc3VsdFxuICogaGFzIHRoZSBzYW1lIHRlcm1pbmF0aW9uIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlXG4gKiBvciBmYWlsdXJlIHJlYXNvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gYm9vbGVhbn0gcHJlZFxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG4gICAgICAgY29uc3QgZmlsdGVySXRlcmFibGUgPSAoYmFzZUl0ZXJhYmxlLCBwcmVkKSA9PlxuICAvKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuICBGYXIoJ2ZpbHRlcmVkIGl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBiYXNlSXRlcmF0b3IgPSBiYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgcmV0dXJuIEZhcignZmlsdGVyZWQgaXRlcmF0b3InLCB7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBiYXNlSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgaWYgKGRvbmUgfHwgcHJlZCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTskaM2PX29uY2UuZmlsdGVySXRlcmFibGUoZmlsdGVySXRlcmFibGUpO1xuaGFyZGVuKGZpbHRlckl0ZXJhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcEl0ZXJhYmxlIjpbIm1hcEl0ZXJhYmxlIl0sImZpbHRlckl0ZXJhYmxlIjpbImZpbHRlckl0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKEnjMn0JQAA9CUAACcAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvbWFrZS1mYXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3JlbW90YWJsZS5qcyJdLCJleHBvcnRzIjpbIkZhciIsIkdFVF9NRVRIT0RfTkFNRVMiLCJSZW1vdGFibGUiLCJUb0ZhckZ1bmN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0TWV0aG9kTmFtZXMscSxGYWlsLGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxhc3NlcnRJZmFjZSxnZXRJbnRlcmZhY2VPZixSZW1vdGFibGVIZWxwZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLFskaM2PX2EgPT4gKGdldE1ldGhvZE5hbWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcImFzc2VydElmYWNlXCIsWyRozY9fYSA9PiAoYXNzZXJ0SWZhY2UgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRozY9fYSldXSxbXCJSZW1vdGFibGVIZWxwZXJcIixbJGjNj19hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge1JlbW90YWJsZUJyYW5kfSBmcm9tICdAZW5kby9ldmVudHVhbC1zZW5kJyAqL1xuLyoqIEBpbXBvcnQge0ludGVyZmFjZVNwZWMsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgeyBwcm90b3R5cGU6IGZ1bmN0aW9uUHJvdG90eXBlIH0gPSBGdW5jdGlvbjtcbmNvbnN0IHtcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIHNldFByb3RvdHlwZU9mLFxuICBjcmVhdGUsXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbn0gPSBPYmplY3Q7XG5cbi8qKlxuICogTm93IHRoYXQgdGhlIHJlbW90YWJsZVByb3RvIGRvZXMgbm90IHByb3ZpZGUgaXRzIG93biBgdG9TdHJpbmdgIG1ldGhvZCxcbiAqIGVuc3VyZSBpdCBhbHdheXMgaW5oZXJpdHMgZnJvbSBzb21ldGhpbmcuIFRoZSBvcmlnaW5hbCBwcm90b3R5cGUgb2ZcbiAqIGByZW1vdGFibGVgIGlmIHRoZXJlIHdhcyBvbmUsIG9yIGBPYmplY3QucHJvdG90eXBlYCBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlbW90YWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuY29uc3QgbWFrZVJlbW90YWJsZVByb3RvID0gKHJlbW90YWJsZSwgaWZhY2UpID0+IHtcbiAgbGV0IG9sZFByb3RvID0gZ2V0UHJvdG90eXBlT2YocmVtb3RhYmxlKTtcbiAgaWYgKHR5cGVvZiByZW1vdGFibGUgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKG9sZFByb3RvID09PSBudWxsKSB7XG4gICAgICBvbGRQcm90byA9IG9iamVjdFByb3RvdHlwZTtcbiAgICB9XG4gICAgb2xkUHJvdG8gPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgICAgRmFpbGBGb3Igbm93LCByZW1vdGFibGVzIGNhbm5vdCBpbmhlcml0IGZyb20gYW55dGhpbmcgdW51c3VhbCwgaW4gJHtyZW1vdGFibGV9YDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcmVtb3RhYmxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgb2xkUHJvdG8gIT09IG51bGwgfHxcbiAgICAgIEZhaWxgT3JpZ2luYWwgZnVuY3Rpb24gbXVzdCBub3QgaW5oZXJpdCBmcm9tIG51bGw6ICR7cmVtb3RhYmxlfWA7XG4gICAgb2xkUHJvdG8gPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgICBnZXRQcm90b3R5cGVPZihvbGRQcm90bykgPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgICBGYWlsYEZhciBmdW5jdGlvbnMgbXVzdCBvcmlnaW5hbGx5IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGUsIGluICR7cmVtb3RhYmxlfWA7XG4gIH0gZWxzZSB7XG4gICAgRmFpbGB1bnJlY29nbml6ZWQgdHlwZW9mICR7cmVtb3RhYmxlfWA7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbihcbiAgICBjcmVhdGUob2xkUHJvdG8sIHtcbiAgICAgIFtQQVNTX1NUWUxFXTogeyB2YWx1ZTogJ3JlbW90YWJsZScgfSxcbiAgICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7IHZhbHVlOiBpZmFjZSB9LFxuICAgIH0pLFxuICApO1xufTtcblxuY29uc3QgYXNzZXJ0Q2FuQmVSZW1vdGFibGUgPSBjYW5kaWRhdGUgPT5cbiAgUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIGEgUmVtb3RhYmxlLiAgQWZ0ZXIgdGhpcywgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKVxuICogcmV0dXJucyBpZmFjZS5cbiAqXG4gKiAvLyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzgwNFxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0ZW1wbGF0ZSB7SW50ZXJmYWNlU3BlY30gSVxuICogQHBhcmFtIHtJfSBbaWZhY2VdIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3JcbiAqIHRoZSByZW1vdGFibGUuIEZvciBub3csIGEgc3RyaW5nIGlmYWNlIG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoXG4gKiBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIiwgdG8gc2VydmUgYXMgdGhlIGFsbGVnZWQgbmFtZS4gTW9yZVxuICogZ2VuZXJhbCBpZmFjZXMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIFRoaXMgaXMgdGVtcG9yYXJ5LiBXZSBpbmNsdWRlIHRoZVxuICogXCJBbGxlZ2VkXCIgb3IgXCJEZWJ1Z05hbWVcIiBhcyBhIHJlbWluZGVyIHRoYXQgd2UgZG8gbm90IHlldCBoYXZlIFN3aW5nU2V0XG4gKiBvciBDb21tcyBWYXRcbiAqIHN1cHBvcnQgZm9yIGVuc3VyaW5nIHRoaXMgaXMgYWNjb3JkaW5nIHRvIHRoZSB2YXQgaG9zdGluZyB0aGUgb2JqZWN0LlxuICogQ3VycmVudGx5LCBBbGljZSBjYW4gdGVsbCBCb2IgYWJvdXQgQ2Fyb2wsIHdoZXJlIFZhdEEgKG9uIEFsaWNlJ3MgYmVoYWxmKVxuICogbWlzcmVwcmVzZW50cyBDYXJvbCdzIGBpZmFjZWAuIFZhdEIgYW5kIHRoZXJlZm9yZSBCb2Igd2lsbCB0aGVuIHNlZVxuICogQ2Fyb2wncyBgaWZhY2VgIGFzIG1pc3JlcHJlc2VudGVkIGJ5IFZhdEEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZH0gW3Byb3BzXSBDdXJyZW50bHkgbWF5IG9ubHkgYmUgdW5kZWZpbmVkLlxuICogVGhhdCBwbGFuIGlzIHRoYXQgb3duLXByb3BlcnRpZXMgYXJlIGNvcGllZCB0byB0aGUgcmVtb3RhYmxlXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGVdIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZU9iamVjdDxJPiAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn19IHJlbW90YWJsZSwgbW9kaWZpZWQgZm9yIGRlYnVnZ2FiaWxpdHlcbiAqL1xuICAgICAgIGNvbnN0IFJlbW90YWJsZSA9IChcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBJIGNvdWxkIGhhdmUgZGlmZmVyZW50IHN1YnR5cGUgdGhhbiBzdHJpbmcqL1xuICBpZmFjZSA9ICdSZW1vdGFibGUnLFxuICBwcm9wcyA9IHVuZGVmaW5lZCxcbiAgcmVtb3RhYmxlID0gLyoqIEB0eXBlIHtUfSAqLyAoe30pLFxuKSA9PiB7XG4gIGFzc2VydElmYWNlKGlmYWNlKTtcbiAgYXNzZXJ0KGlmYWNlKTtcbiAgLyogVE9ETzogV2hlbiBpZmFjZSBpcyByaWNoZXIgdGhhbiBqdXN0IHN0cmluZywgd2UgbmVlZCB0byBnZXQgdGhlIGFsbGVnZWROYW1lKi9cbiAgLyogaW4gYSBkaWZmZXJlbnQgd2F5LiovXG4gIHByb3BzID09PSB1bmRlZmluZWQgfHwgRmFpbGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWA7XG5cbiAgLyogRmFpbCBmYXN0OiBjaGVjayB0aGF0IHRoZSB1bm1vZGlmaWVkIG9iamVjdCBpcyBhYmxlIHRvIGJlY29tZSBhIFJlbW90YWJsZS4qL1xuICBhc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4gIC8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBtYXJrZWQuKi9cbiAgIShQQVNTX1NUWUxFIGluIHJlbW90YWJsZSkgfHxcbiAgICBGYWlsYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBtYXJrZWQgYXMgYSAke3EoXG4gICAgICByZW1vdGFibGVbUEFTU19TVFlMRV0sXG4gICAgKX1gO1xuICAvKiBgaXNGcm96ZW5gIGFsd2F5cyByZXR1cm5zIHRydWUgd2l0aCBhIGZha2UgYGhhcmRlbmAsIGJ1dCB3ZSB3YW50IHRoYXQgY2FzZSovXG4gIC8qIHRvIHN1Y2NlZWQgYW55d2F5LiBGYWtpbmcgYGhhcmRlbmAgaXMgb25seSBjb3JyZWN0bmVzcyBwcmVzZXJ2aW5nKi9cbiAgLyogaWYgdGhlIGNvZGUgaW4gcXVlc3Rpb24gY29udGFpbnMgbm8gYnVncyB0aGF0IHRoZSByZWFsIGBoYXJkZW5gIHdvdWxkKi9cbiAgLyogaGF2ZSBjYXVnaHQuKi9cbiAgLyogQHRzLWlnbm9yZSBgaXNGYWtlYCBwdXJwb3NlbHkgbm90IGluIHRoZSB0eXBlKi9cbiAgaGFyZGVuLmlzRmFrZSB8fFxuICAgIC8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBmcm96ZW4uKi9cbiAgICAhaXNGcm96ZW4ocmVtb3RhYmxlKSB8fFxuICAgIEZhaWxgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IGZyb3plbmA7XG4gIGNvbnN0IHJlbW90YWJsZVByb3RvID0gbWFrZVJlbW90YWJsZVByb3RvKHJlbW90YWJsZSwgaWZhY2UpO1xuXG4gIC8qIFRha2UgYSBzdGF0aWMgY29weSBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBhcyBkYXRhIHByb3BlcnRpZXMuKi9cbiAgLyogY29uc3QgcHJvcERlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh7IC4uLnByb3BzIH0pOyovXG4gIGNvbnN0IG11dGF0ZUhhcmRlbkFuZENoZWNrID0gdGFyZ2V0ID0+IHtcbiAgICAvKiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcERlc2NzKTsqL1xuICAgIHNldFByb3RvdHlwZU9mKHRhcmdldCwgcmVtb3RhYmxlUHJvdG8pO1xuICAgIGhhcmRlbih0YXJnZXQpO1xuICAgIGFzc2VydENhbkJlUmVtb3RhYmxlKHRhcmdldCk7XG4gIH07XG5cbiAgLyogRmFpbCBmYXN0OiBjaGVjayBhIGZyZXNoIHJlbW90YWJsZSB0byBzZWUgaWYgb3VyIHJ1bGVzIGZpdC4qL1xuICBtdXRhdGVIYXJkZW5BbmRDaGVjayh7fSk7XG5cbiAgLyogQWN0dWFsbHkgZmluaXNoIHRoZSBuZXcgcmVtb3RhYmxlLiovXG4gIG11dGF0ZUhhcmRlbkFuZENoZWNrKHJlbW90YWJsZSk7XG5cbiAgLyogQ09NTUlUVEVEISovXG4gIC8qIFdlJ3JlIGNvbW1pdHRlZCwgc28ga2VlcCB0aGUgaW50ZXJmYWNlIGZvciBmdXR1cmUgcmVmZXJlbmNlLiovXG4gIGFzc2VydChpZmFjZSAhPT0gdW5kZWZpbmVkKTsgLyogVG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5Ki9cbiAgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAocmVtb3RhYmxlKTtcbn07JGjNj19vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGF1dG9tYXRpY2FsbHkgYWRkZWQgZGVmYXVsdCBtZXRhLW1ldGhvZCBmb3Igb2J0YWluaW5nIGFcbiAqIGxpc3Qgb2YgYWxsIG1ldGhvZHMgb2YgYW4gb2JqZWN0IGRlY2xhcmVkIHdpdGggYEZhcmAsIG9yIGFuIG9iamVjdCB0aGF0XG4gKiBpbmhlcml0cyBmcm9tIGFuIG9iamVjdCBkZWNsYXJlZCB3aXRoIGBGYXJgLlxuICpcbiAqIE1vZGVsZWQgb24gYEdFVF9JTlRFUkZBQ0VfR1VBUkRgIGZyb20gYEBlbmRvL2V4b2AuXG4gKlxuICogVE9ETyBOYW1lIHRvIGJlIGJpa2VzaGVkLiBQZXJoYXBzIGV2ZW4gd2hldGhlciBpdCBpcyBhXG4gKiBzdHJpbmcgb3Igc3ltYm9sIHRvIGJlIGJpa2VzaGVkLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE4MDkjZGlzY3Vzc2lvbl9yMTM4ODA1MjQ1NFxuICpcbiAqIEhBWkFSRDogQmV3YXJlIHRoYXQgYW4gZXhvJ3MgaW50ZXJmYWNlIGNhbiBjaGFuZ2UgYWNyb3NzIGFuIHVwZ3JhZGUsXG4gKiBzbyByZW1vdGVzIHRoYXQgY2FjaGUgaXQgY2FuIGJlY29tZSBzdGFsZS5cbiAqL1xuICAgICAgIGNvbnN0IEdFVF9NRVRIT0RfTkFNRVMgPSAnX19nZXRNZXRob2ROYW1lc19fJztcblxuLyoqXG4gKiBOb3RlIHRoYXQgYGdldE1ldGhvZE5hbWVzTWV0aG9kYCBpcyBhIHRoaXNmdWwgbWV0aG9kISBJdCBtdXN0IGJlIHNvIHRoYXRcbiAqIGl0IHdvcmtzIGFzIGV4cGVjdGVkIHdpdGggZmFyLW9iamVjdCBpbmhlcml0YW5jZS5cbiAqXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi8kaM2PX29uY2UuR0VUX01FVEhPRF9OQU1FUyhHRVRfTUVUSE9EX05BTUVTKTtcbmNvbnN0IGdldE1ldGhvZE5hbWVzTWV0aG9kID0gaGFyZGVuKHtcbiAgW0dFVF9NRVRIT0RfTkFNRVNdKCkge1xuICAgIHJldHVybiBnZXRNZXRob2ROYW1lcyh0aGlzKTtcbiAgfSxcbn0pW0dFVF9NRVRIT0RfTkFNRVNdO1xuXG5jb25zdCBnZXRNZXRob2ROYW1lc0Rlc2NyaXB0b3IgPSBoYXJkZW4oe1xuICB2YWx1ZTogZ2V0TWV0aG9kTmFtZXNNZXRob2QsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBjb25maWd1cmFibGU6IGZhbHNlLFxuICB3cml0YWJsZTogZmFsc2UsXG59KTtcblxuLyoqXG4gKiBNYXJrIGFuIG9iamVjdCB0byBiZSBleHBvc2VkIGZvciByZW1vdGUgaW50ZXJhY3Rpb25cbiAqIGFuZCBnaXZlIGl0IGEgc3VnZ2VzdGl2ZSBpbnRlcmZhY2UgbmFtZSBmb3IgZGVidWdnaW5nLlxuICpcbiAqIEFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgaGF2ZSB0byBiZSBtZXRob2RzLCBub3QgZGF0YS5cbiAqXG4gKiBUaGUgb2JqZWN0IG11c3Qgbm90IGJlIGhhcmRlbmVkIGJlZm9yZSBpdCBpcyBtYXJrZWQuXG4gKiBJdCB3aWxsIGJlIGhhcmRlbmVkIGFmdGVyIG1hcmtpbmcuXG4gKlxuICogRm9yIGZhciBvYmplY3RzIChhcyBvcHBvc2VkIHRvIGZhciBmdW5jdGlvbnMpLCBhbHNvIGFkZHNcbiAqIGBfX2dldE1ldGhvZE5hbWVzX19gIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBtZXRob2QgbmFtZXMsXG4gKiBpZiB0aGVyZSBpcyBub3QgeWV0IGFueSBtZXRob2QgbmFtZWQgYF9fZ2V0TWV0aG9kTmFtZXNfX2AuXG4gKlxuICogQGV4YW1wbGVcbiAqIEZhcignRW1wbG95ZWUnLCB7IGdldE1hbmFnZXIgfSlcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIFRoaXMgbmFtZSB3aWxsIGJlIHByZXBlbmRlZCB3aXRoIGBBbGxlZ2VkOiBgXG4gKiBmb3Igbm93IHRvIGZvcm0gdGhlIGBSZW1vdGFibGVgIGBpZmFjZWAgYXJndW1lbnQuXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGVdIFRoZSBvYmplY3QgdG8gYmUgbWFya2VkIGFzIHJlbW90YWJsZVxuICovXG4gICAgICAgY29uc3QgRmFyID0gKGZhck5hbWUsIHJlbW90YWJsZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCByID0gcmVtb3RhYmxlID09PSB1bmRlZmluZWQgPyAvKiogQHR5cGUge1R9ICovICh7fSkgOiByZW1vdGFibGU7XG4gIGlmICh0eXBlb2YgciA9PT0gJ29iamVjdCcgJiYgIShHRVRfTUVUSE9EX05BTUVTIGluIHIpKSB7XG4gICAgLyogVGhpcyB0ZXN0IGV4Y2x1ZGVzIGZhciBmdW5jdGlvbnMsIHNpbmNlIHdlIGN1cnJlbnRseSBjb25zaWRlciB0aGVtKi9cbiAgICAvKiB0byBvbmx5IGhhdmUgYSBjYWxsLWJlaGF2aW9yLCB3aXRoIG5vIGNhbGxhYmxlIG1ldGhvZHMuKi9cbiAgICAvKiBCZXdhcmU6IE11dGF0ZXMgdGhlIGlucHV0IGFyZ3VtZW50ISBCdXQgYFJlbW90YWJsZWAqL1xuICAgIC8qICogcmVxdWlyZXMgdGhlIG9iamVjdCB0byBiZSBtdXRhYmxlKi9cbiAgICAvKiAqIGRvZXMgZnVydGhlciBtdXRhdGlvbnMsKi9cbiAgICAvKiAqIGhhcmRlbnMgdGhlIG11dGF0ZWQgb2JqZWN0IGJlZm9yZSByZXR1cm5pbmcgaXQuKi9cbiAgICAvKiBzbyB0aGlzIG11dGF0aW9uIGlzIG5vdCB1bnByZWNlZGVudGVkLiBCdXQgaXQgaXMgc3VycHJpc2luZyEqL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBHRVRfTUVUSE9EX05BTUVTLCBnZXRNZXRob2ROYW1lc0Rlc2NyaXB0b3IpO1xuICB9XG4gIHJldHVybiBSZW1vdGFibGUoYEFsbGVnZWQ6ICR7ZmFyTmFtZX1gLCB1bmRlZmluZWQsIHIpO1xufTskaM2PX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLyoqXG4gKiBDb2VyY2UgYGZ1bmNgIHRvIGEgZmFyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIGl0cyBjYWxsIGJlaGF2aW9yLlxuICogSWYgaXQgaXMgYWxyZWFkeSBhIGZhciBmdW5jdGlvbiwgcmV0dXJuIGl0LiBPdGhlcndpc2UgbWFrZSBhbmQgcmV0dXJuIGFcbiAqIG5ldyBmYXIgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGZvcndhcmRzIGNhbGxzIHRvIGl0LiBUaGlzXG4gKiB3b3JrcyBldmVuIGlmIGBmdW5jYCBpcyBhbHJlYWR5IGZyb3plbi4gYFRvRmFyRnVuY3Rpb25gIGlzIHRvIGJlIHVzZWRcbiAqIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20gZWxzZXdoZXJlIHVuZGVyIGxlc3MgY29udHJvbC4gRm9yIGZ1bmN0aW9uc1xuICogeW91IGF1dGhvciBpbiBwbGFjZSwgYmV0dGVyIHRvIHVzZSBgRmFyYCBvbiB0aGVpciBmdW5jdGlvbiBsaXRlcmFsIGRpcmVjdGx5LlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEZcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIHRvIGJlIHVzZWQgb25seSBpZiBgZnVuY2AgaXMgbm90IGFscmVhZHkgYVxuICogZmFyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGfSBmdW5jXG4gKiBAcmV0dXJucyB7RiAmIFJlbW90YWJsZU9iamVjdCAmIFJlbW90YWJsZUJyYW5kPHt9LCBGPn1cbiAqL1xuICAgICAgIGNvbnN0IFRvRmFyRnVuY3Rpb24gPSAoZmFyTmFtZSwgZnVuYykgPT4ge1xuICBpZiAoZ2V0SW50ZXJmYWNlT2YoZnVuYykgIT09IHVuZGVmaW5lZCkge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY2hlY2tlZCBjYXN0Ki9cbiAgICByZXR1cm4gZnVuYztcbiAgfVxuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGRpZmZlcmVudCBzdWJ0eXBlKi9cbiAgcmV0dXJuIEZhcihmYXJOYW1lLCAoLi4uYXJncykgPT4gZnVuYyguLi5hcmdzKSk7XG59OyRozY9fb25jZS5Ub0ZhckZ1bmN0aW9uKFRvRmFyRnVuY3Rpb24pO1xuaGFyZGVuKFRvRmFyRnVuY3Rpb24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUmVtb3RhYmxlIjpbIlJlbW90YWJsZSJdLCJHRVRfTUVUSE9EX05BTUVTIjpbIkdFVF9NRVRIT0RfTkFNRVMiXSwiRmFyIjpbIkZhciJdLCJUb0ZhckZ1bmN0aW9uIjpbIlRvRmFyRnVuY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnFJgaYMFAACDBQAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlVGFnZ2VkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZVRhZ2dlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsUEFTU19TVFlMRSxhc3NlcnRQYXNzYWJsZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGUsQ29weVRhZ2dlZH0gZnJvbSAnLi90eXBlcy5qcydcbiAqL1xuXG5jb25zdCB7IGNyZWF0ZSwgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gVFxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gUFxuICogQHBhcmFtIHtUfSB0YWdcbiAqIEBwYXJhbSB7UH0gcGF5bG9hZFxuICogQHJldHVybnMge0NvcHlUYWdnZWQ8VCxQPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VUYWdnZWQgPSAodGFnLCBwYXlsb2FkKSA9PiB7XG4gIHR5cGVvZiB0YWcgPT09ICdzdHJpbmcnIHx8XG4gICAgRmFpbGBUaGUgdGFnIG9mIGEgdGFnZ2VkIHJlY29yZCBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ31gO1xuICBhc3NlcnRQYXNzYWJsZShoYXJkZW4ocGF5bG9hZCkpO1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGNyZWF0ZShvYmplY3RQcm90b3R5cGUsIHtcbiAgICAgIFtQQVNTX1NUWUxFXTogeyB2YWx1ZTogJ3RhZ2dlZCcgfSxcbiAgICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7IHZhbHVlOiB0YWcgfSxcbiAgICAgIHBheWxvYWQ6IHsgdmFsdWU6IHBheWxvYWQsIGVudW1lcmFibGU6IHRydWUgfSxcbiAgICB9KSxcbiAgKTtcbn07JGjNj19vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfCXq/eohAADqIQAAMAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJDWCIsIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCIsImNoZWNrUGFzc1N0eWxlIiwiY2hlY2tUYWdSZWNvcmQiLCJnZXRPd25EYXRhRGVzY3JpcHRvciIsImdldFRhZyIsImhhc093blByb3BlcnR5T2YiLCJpc09iamVjdCIsImlzUHJpbWl0aXZlIiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NoZWNrZXIsIFBhc3NTdHlsZSwgSlNQcmltaXRpdmV9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGdldFByb3RvdHlwZU9mLFxuICBoYXNPd24sXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbn0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuY29uc3QgeyB0b1N0cmluZ1RhZzogdG9TdHJpbmdUYWdTeW1ib2wgfSA9IFN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gIHR5cGVkQXJyYXlQcm90b3R5cGUsXG4gIHRvU3RyaW5nVGFnU3ltYm9sLFxuKTtcbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyA9IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcgPT09ICdmdW5jdGlvbicpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgT2JqZWN0Lmhhc093bmAgaW5zdGVhZFxuICovXG4gICAgICAgY29uc3QgaGFzT3duUHJvcGVydHlPZiA9IGhhc093bjtcblxuLyoqXG4gKiBAdHlwZSB7KHZhbDogdW5rbm93bikgPT4gdmFsIGlzIEpTUHJpbWl0aXZlfVxuICovJGjNj19vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG4gICAgICAgY29uc3QgaXNQcmltaXRpdmUgPSB2YWwgPT5cbiAgLyogU2FmZXIgd291bGQgYmUgYE9iamVjdCh2YWwpICE9PSB2YWxgIGJ1dCBpcyB0b28gZXhwZW5zaXZlIG9uIFhTLiovXG4gIC8qIFNvIGluc3RlYWQgd2UgdXNlIHRoaXMgYWRob2Mgc2V0IG9mIHR5cGUgdGVzdHMuIEJ1dCB0aGlzIGlzIG5vdCBzYWZlIGluKi9cbiAgLyogdGhlIGZhY2Ugb2YgcG9zc2libGUgZXZvbHV0aW9uIG9mIHRoZSBsYW5ndWFnZS4gQmV3YXJlISovXG4gICF2YWwgfHwgKHR5cGVvZiB2YWwgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwgIT09ICdmdW5jdGlvbicpOyRozY9fb25jZS5pc1ByaW1pdGl2ZShpc1ByaW1pdGl2ZSk7XG5oYXJkZW4oaXNQcmltaXRpdmUpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBgIWlzUHJpbWl0aXZlYCBpbnN0ZWFkXG4gKiBAdHlwZSB7KHZhbDogdW5rbm93bikgPT4gdmFsIGlzIChGdW5jdGlvbiB8IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KX1cbiAqL1xuICAgICAgIGNvbnN0IGlzT2JqZWN0ID0gdmFsID0+XG4gIC8qIFNhZmVyIHdvdWxkIGJlIGBPYmplY3QodmFsKSAtPT0gdmFsYCBidXQgaXMgdG9vIGV4cGVuc2l2ZSBvbiBYUy4qL1xuICAvKiBTbyBpbnN0ZWFkIHdlIHVzZSB0aGlzIGFkaG9jIHNldCBvZiB0eXBlIHRlc3RzLiBCdXQgdGhpcyBpcyBub3Qgc2FmZSBpbiovXG4gIC8qIHRoZSBmYWNlIG9mIHBvc3NpYmxlIGV2b2x1dGlvbiBvZiB0aGUgbGFuZ3VhZ2UuIEJld2FyZSEqL1xuICAhIXZhbCAmJiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJyk7JGjNj19vbmNlLmlzT2JqZWN0KGlzT2JqZWN0KTtcbmhhcmRlbihpc09iamVjdCk7XG5cbi8qKlxuICogRHVwbGljYXRlcyBwYWNrYWdlcy9zZXMvc3JjL21ha2UtaGFyZGVuZXIuanMgdG8gYXZvaWQgYSBkZXBlbmRlbmN5LlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gb2JqZWN0XG4gKi9cbiAgICAgICBjb25zdCBpc1R5cGVkQXJyYXkgPSBvYmplY3QgPT4ge1xuICAvKiBUaGUgb2JqZWN0IG11c3QgcGFzcyBhIGJyYW5kIGNoZWNrIG9yIHRvU3RyaW5nVGFnIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC4qL1xuICBjb25zdCB0YWcgPSBhcHBseShnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcsIG9iamVjdCwgW10pO1xuICByZXR1cm4gdGFnICE9PSB1bmRlZmluZWQ7XG59OyRozY9fb25jZS5pc1R5cGVkQXJyYXkoaXNUeXBlZEFycmF5KTtcbmhhcmRlbihpc1R5cGVkQXJyYXkpO1xuXG4vKipcbiAqIFdlIGNhc3Qgb3VyIGBTeW1ib2wuZm9yKClgIHRvIGEgc3RyaW5nIGNvbnN0YW50IGhlcmUgdG8gYXZvaWQgZXhwb3NpbmcgdGhlXG4gKiBgdW5pcXVlIHN5bWJvbGAgdHlwZSBwdWJsaWNseS4gIFRoZSBjYXN0IGRvZXNuJ3QgY2hhbmdlIGFueSBydW50aW1lXG4gKiBiZWhhdmlvci4uLiBpdCdzIHN0aWxsIGFjdHVhbGx5IGEgc3ltYm9sLlxuICpcbiAqIFdpdGhvdXQgdGhpcyB3b3JrYXJvdW5kLCB3ZSd2ZSBvYnNlcnZlZCBlcnJvcnMgd2hlbiB1c2luZ1xuICogYHR5cGVzY3JpcHRANS45LjNgJ3MgYHRzY2AgdG8gZ2VuZXJhdGUgZGVjbGFyYXRpb24gZmlsZXMgKC5kLnRzKSBmb3JcbiAqIGNvbnN1bWVycyBvZiBtb2R1bGVzIHRoYXQgaW1wb3J0IGBQQVNTX1NUWUxFYDpcbiAqIEBleGFtcGxlXG4gKiAgIGVycm9yIFRTOTAwNjogRGVjbGFyYXRpb24gZW1pdCBmb3IgdGhpcyBmaWxlIHJlcXVpcmVzIHVzaW5nIHByaXZhdGUgbmFtZVxuICogICAnUEFTU19TVFlMRScgZnJvbSBtb2R1bGUgJy4uLi9AZW5kby9wYXNzLXN0eWxlL3NyYy90eXBlc1wiJy4gQW4gZXhwbGljaXRcbiAqICAgdHlwZSBhbm5vdGF0aW9uIG1heSB1bmJsb2NrIGRlY2xhcmF0aW9uIGVtaXQuXG4gKi9cbiAgICAgICBjb25zdCBQQVNTX1NUWUxFID0gLyoqIEB0eXBlIHsnU3ltYm9sKHBhc3NTdHlsZSknfSAqLyAoXG4gIC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKFN5bWJvbC5mb3IoJ3Bhc3NTdHlsZScpKVxuKTtcblxuLyoqXG4gKiBCZWxvdyB3ZSBoYXZlIGEgc2VyaWVzIG9mIHByZWRpY2F0ZSBmdW5jdGlvbnMgYW5kIHRoZWlyIChjdXJyaWVkKSBhc3NlcnRpb25cbiAqIGZ1bmN0aW9ucy4gVGhlIHNlbWFudGljcyBvZiB0aGUgYXNzZXJ0aW9uIGZ1bmN0aW9uIGlzIGp1c3QgdG8gYXNzZXJ0IHRoYXRcbiAqIHRoZSBjb3JyZXNwb25kaW5nIHByZWRpY2F0ZSBmdW5jdGlvbiB3b3VsZCBoYXZlIHJldHVybmVkIHRydWUuIEJ1dCBpdFxuICogcmVwcm9kdWNlcyB0aGUgaW50ZXJuYWwgdGVzdHMgc28gZmFpbHVyZXMgY2FuIGdpdmUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqLyRozY9fb25jZS5QQVNTX1NUWUxFKFBBU1NfU1RZTEUpO1xuICAgICAgIGNvbnN0IGFzc2VydENoZWNrZXIgPSAoY29uZCwgZGV0YWlscykgPT4ge1xuICBhc3NlcnQoY29uZCwgZGV0YWlscyk7XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgZnVuY3Rpb24gdG8gZmFpbCB0aGUgcHJvdmlkZWQgQ2hlY2tlciB3aXRoIGRldGFpbHMuXG4gKiBUaGUgbmFtZSBtdXN0IGJlIHNob3J0IGZvciBlcmdvbm9taWMgaW5saW5lIHVzZSBhcyBpbjpcbiAqIGBgYFxuICogcmV0dXJuIGNoZWNrQ29uZGl0aW9uKC4uLikgfHwgKCEhY2hlY2sgJiYgQ1goY2hlY2spYC4uLmApO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG4gICAgICAgY29uc3QgQ1ggPSBjaGVjayA9PiB7XG4gIGNvbnN0IHJlamVjdCA9IChULCAuLi5zdWJzKSA9PiBjaGVjayhmYWxzZSwgWChULCAuLi5zdWJzKSk7XG4gIHJldHVybiByZWplY3Q7XG59OyRozY9fb25jZS5DWChDWCk7XG5oYXJkZW4oQ1gpO1xuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBwcmVzZW5jZSBhbmQgZW51bWVyYWJpbGl0eSBvZiBhbiBvd24gZGF0YSBwcm9wZXJ0eVxuICogYW5kIHJldHVybnMgaXRzIGRlc2NyaXB0b3IuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfHN5bWJvbH0gcHJvcE5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkQmVFbnVtZXJhYmxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlc2NyaXB0b3J9XG4gKi9cbiAgICAgICBjb25zdCBnZXRPd25EYXRhRGVzY3JpcHRvciA9IChcbiAgY2FuZGlkYXRlLFxuICBwcm9wTmFtZSxcbiAgc2hvdWxkQmVFbnVtZXJhYmxlLFxuICBjaGVjayxcbikgPT4ge1xuICBjb25zdCBkZXNjID0gLyoqIEB0eXBlIHtQcm9wZXJ0eURlc2NyaXB0b3J9ICovIChcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2FuZGlkYXRlLCBwcm9wTmFtZSlcbiAgKTtcbiAgcmV0dXJuIChkZXNjICE9PSB1bmRlZmluZWQgfHxcbiAgICAoISFjaGVjayAmJiBDWChjaGVjaylgJHtxKHByb3BOYW1lKX0gcHJvcGVydHkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgIChoYXNPd24oZGVzYywgJ3ZhbHVlJykgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoc2hvdWxkQmVFbnVtZXJhYmxlXG4gICAgICA/IGRlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApXG4gICAgICA6ICFkZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpXG4gICAgPyBkZXNjXG4gICAgOiAvKiogQHR5cGUge1Byb3BlcnR5RGVzY3JpcHRvcn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHVuZGVmaW5lZCkpO1xufTskaM2PX29uY2UuZ2V0T3duRGF0YURlc2NyaXB0b3IoZ2V0T3duRGF0YURlc2NyaXB0b3IpO1xuaGFyZGVuKGdldE93bkRhdGFEZXNjcmlwdG9yKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IFRcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlZDxhbnksIFQ+fSB0YWdSZWNvcmRcbiAqIEByZXR1cm5zIHtUfVxuICovXG4gICAgICAgY29uc3QgZ2V0VGFnID0gdGFnUmVjb3JkID0+IHRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRozY9fb25jZS5nZXRUYWcoZ2V0VGFnKTtcbmhhcmRlbihnZXRUYWcpO1xuXG4gICAgICAgY29uc3QgY2hlY2tQYXNzU3R5bGUgPSAob2JqLCBwYXNzU3R5bGUsIGV4cGVjdGVkUGFzc1N0eWxlLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIHBhc3NTdHlsZSA9PT0gZXhwZWN0ZWRQYXNzU3R5bGUgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYEV4cGVjdGVkICR7cShleHBlY3RlZFBhc3NTdHlsZSl9LCBub3QgJHtxKHBhc3NTdHlsZSl9OiAke29ian1gKVxuICApO1xufTskaM2PX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkID0gY2hlY2tQcm90byA9PiB7XG4gIC8qKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVkPGFueSwgYW55Pn0gdGFnUmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gZXhwZWN0ZWRQYXNzU3R5bGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgY2hlY2tUYWdSZWNvcmQgPSAodGFnUmVjb3JkLCBleHBlY3RlZFBhc3NTdHlsZSwgY2hlY2spID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgKCFpc1ByaW1pdGl2ZSh0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYEEgbm9uLW9iamVjdCBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSAmJlxuICAgICAgKGlzRnJvemVuKHRhZ1JlY29yZCkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYEEgdGFnUmVjb3JkIG11c3QgYmUgZnJvemVuOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgICghaXNBcnJheSh0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBBbiBhcnJheSBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSAmJlxuICAgICAgY2hlY2tQYXNzU3R5bGUoXG4gICAgICAgIHRhZ1JlY29yZCxcbiAgICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IodGFnUmVjb3JkLCBQQVNTX1NUWUxFLCBmYWxzZSwgY2hlY2spLnZhbHVlLFxuICAgICAgICBleHBlY3RlZFBhc3NTdHlsZSxcbiAgICAgICAgY2hlY2ssXG4gICAgICApICYmXG4gICAgICAodHlwZW9mIGdldE93bkRhdGFEZXNjcmlwdG9yKHRhZ1JlY29yZCwgU3ltYm9sLnRvU3RyaW5nVGFnLCBmYWxzZSwgY2hlY2spXG4gICAgICAgIC52YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgQSBbU3ltYm9sLnRvU3RyaW5nVGFnXS1uYW1lZCBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIGNoZWNrUHJvdG8odGFnUmVjb3JkLCBnZXRQcm90b3R5cGVPZih0YWdSZWNvcmQpLCBjaGVjaylcbiAgICApO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcbn07XG5cbiAgICAgICBjb25zdCBjaGVja1RhZ1JlY29yZCA9IG1ha2VDaGVja1RhZ1JlY29yZChcbiAgKHZhbCwgcHJvdG8sIGNoZWNrKSA9PlxuICAgIHByb3RvID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgY2hlY2soZmFsc2UsIFhgQSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHt2YWx9YCkpLFxuKTskaM2PX29uY2UuY2hlY2tUYWdSZWNvcmQoY2hlY2tUYWdSZWNvcmQpO1xuaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcblxuICAgICAgIGNvbnN0IGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSBtYWtlQ2hlY2tUYWdSZWNvcmQoXG4gICh2YWwsIHByb3RvLCBjaGVjaykgPT5cbiAgICBwcm90byA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAocHJvdG8gIT09IG51bGwgJiYgZ2V0UHJvdG90eXBlT2YocHJvdG8pID09PSBmdW5jdGlvblByb3RvdHlwZSkgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEZvciBmdW5jdGlvbnMsIGEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZTogJHt2YWx9YCxcbiAgICAgICkpLFxuKTskaM2PX29uY2UuY2hlY2tGdW5jdGlvblRhZ1JlY29yZChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcbmhhcmRlbihjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiJdLCJpc1ByaW1pdGl2ZSI6WyJpc1ByaW1pdGl2ZSJdLCJpc09iamVjdCI6WyJpc09iamVjdCJdLCJpc1R5cGVkQXJyYXkiOlsiaXNUeXBlZEFycmF5Il0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSJdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiXSwiQ1giOlsiQ1giXSwiZ2V0T3duRGF0YURlc2NyaXB0b3IiOlsiZ2V0T3duRGF0YURlc2NyaXB0b3IiXSwiZ2V0VGFnIjpbImdldFRhZyJdLCJjaGVja1Bhc3NTdHlsZSI6WyJjaGVja1Bhc3NTdHlsZSJdLCJjaGVja1RhZ1JlY29yZCI6WyJjaGVja1RhZ1JlY29yZCJdLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIjpbImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJgKOt2I/AABiPwAAKgAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9wYXNzU3R5bGVPZi5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2NvcHlBcnJheS5qcyIsIi4vYnl0ZUFycmF5LmpzIiwiLi9jb3B5UmVjb3JkLmpzIiwiLi90YWdnZWQuanMiLCIuL2Vycm9yLmpzIiwiLi9yZW1vdGFibGUuanMiLCIuL3N5bWJvbC5qcyIsIi4vc2FmZS1wcm9taXNlLmpzIiwiLi9zdHJpbmcuanMiXSwiZXhwb3J0cyI6WyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCIsImFzc2VydFBhc3NhYmxlIiwiaXNQYXNzYWJsZSIsInBhc3NTdHlsZU9mIiwidG9QYXNzYWJsZUVycm9yIiwidG9UaHJvd2FibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpc1Byb21pc2UsWCxGYWlsLHEsYW5ub3RhdGVFcnJvcixtYWtlRXJyb3IsaXNQcmltaXRpdmUsaXNUeXBlZEFycmF5LFBBU1NfU1RZTEUsYXNzZXJ0Q2hlY2tlcixDb3B5QXJyYXlIZWxwZXIsQnl0ZUFycmF5SGVscGVyLENvcHlSZWNvcmRIZWxwZXIsVGFnZ2VkSGVscGVyLEVycm9ySGVscGVyLGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjLGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yLGdldEVycm9yQ29uc3RydWN0b3IsaXNFcnJvckxpa2UsUmVtb3RhYmxlSGVscGVyLGFzc2VydFBhc3NhYmxlU3ltYm9sLGFzc2VydFNhZmVQcm9taXNlLGFzc2VydFBhc3NhYmxlU3RyaW5nOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXSxbXCJpc1R5cGVkQXJyYXlcIixbJGjNj19hID0+IChpc1R5cGVkQXJyYXkgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlBcnJheS5qc1wiLCBbW1wiQ29weUFycmF5SGVscGVyXCIsWyRozY9fYSA9PiAoQ29weUFycmF5SGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9ieXRlQXJyYXkuanNcIiwgW1tcIkJ5dGVBcnJheUhlbHBlclwiLFskaM2PX2EgPT4gKEJ5dGVBcnJheUhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsWyRozY9fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIixbJGjNj19hID0+IChFcnJvckhlbHBlciA9ICRozY9fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzY1wiLFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gJGjNj19hKV1dLFtcImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yXCIsWyRozY9fYSA9PiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAkaM2PX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIixbJGjNj19hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIi4vc2FmZS1wcm9taXNlLmpzXCIsIFtbXCJhc3NlcnRTYWZlUHJvbWlzZVwiLFskaM2PX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi9zdHJpbmcuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3RyaW5nXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTdHJpbmcgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnICovXG4vKiogQGltcG9ydCB7Q29weUFycmF5LCBDb3B5UmVjb3JkLCBDb3B5VGFnZ2VkLCBQYXNzYWJsZX0gZnJvbSAnLi90eXBlcy5qcycgKi9cbi8qKiBAaW1wb3J0IHtQYXNzU3R5bGV9IGZyb20gJy4vdHlwZXMuanMnICovXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlT2Z9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNGcm96ZW4sIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIHZhbHVlcyB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFBhc3NTdHlsZSwgUGFzc1N0eWxlSGVscGVyPn0gSGVscGVyc1JlY29yZFxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVyc1xuICogQHJldHVybnMge0hlbHBlcnNSZWNvcmR9XG4gKi9cbmNvbnN0IG1ha2VIZWxwZXJUYWJsZSA9IHBhc3NTdHlsZUhlbHBlcnMgPT4ge1xuICBjb25zdCBIZWxwZXJUYWJsZSA9IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgY29weUFycmF5OiB1bmRlZmluZWQsXG4gICAgYnl0ZUFycmF5OiB1bmRlZmluZWQsXG4gICAgY29weVJlY29yZDogdW5kZWZpbmVkLFxuICAgIHRhZ2dlZDogdW5kZWZpbmVkLFxuICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgcmVtb3RhYmxlOiB1bmRlZmluZWQsXG4gIH07XG4gIGZvciAoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpIHtcbiAgICBjb25zdCB7IHN0eWxlTmFtZSB9ID0gaGVscGVyO1xuICAgIHN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZSB8fCBGYWlsYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBGYWlsYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSA9IGhlbHBlcjtcbiAgfVxuICBmb3IgKGNvbnN0IHN0eWxlTmFtZSBvZiBvd25LZXlzKEhlbHBlclRhYmxlKSkge1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgRmFpbGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiAgfVxuXG4gIHJldHVybiAvKiogQHR5cGUge0hlbHBlcnNSZWNvcmR9ICovIChcbiAgICAvKiogQHR5cGUge3Vua25vd259ICovIChoYXJkZW4oSGVscGVyVGFibGUpKVxuICApO1xufTtcblxuLyoqXG4gKiBUaGUgYGFzc2VydFJlc3RWYWxpZGAgYXNzdW1lcyB0aGF0IHRoZSBgY2FuQmVWYWxpZGAgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICogQ29udGV4dHMgd2hlcmUgd2UgY2Fubm90IGFzc3VtZSB0aGF0IHNob3VsZCBjYWxsIGBhc3NlcnRWYWxpZGAgaW5zdGVhZCxcbiAqIHdoaWNoIGNoZWNrcyBib3RoIGNvbmRpdGlvbnMgaW4gdGhlIHJpZ2h0IG9yZGVyLlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyfSBoZWxwZXJcbiAqIEBwYXJhbSB7YW55fSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7KHZhbDogYW55KSA9PiBQYXNzU3R5bGV9IHBhc3NTdHlsZU9mUmVjdXJcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBhc3NlcnRWYWxpZCA9IChoZWxwZXIsIGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICBoZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsIGFzc2VydENoZWNrZXIpO1xuICBoZWxwZXIuYXNzZXJ0UmVzdFZhbGlkKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cik7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnMgVGhlIHBhc3NTdHlsZUhlbHBlcnMgdG8gcmVnaXN0ZXIsXG4gKiBpbiBwcmlvcml0eSBvcmRlci5cbiAqIE5PVEUgVGhlc2UgbXVzdCBhbGwgYmUgXCJ0cnVzdGVkXCIsXG4gKiBjb21wbGV0ZSwgYW5kIG5vbi1jb2xsaWRpbmcuIGBtYWtlUGFzc1N0eWxlT2ZgIG1heSAqYXNzdW1lKiB0aGF0IGVhY2ggaGVscGVyXG4gKiBkb2VzIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uIGBtYWtlUGFzc1N0eWxlT2ZgIGlzIG5vdCB0cnlpbmcgdG8gZGVmZW5kXG4gKiBpdHNlbGYgYWdhaW5zdCBtYWxpY2lvdXMgaGVscGVycywgdGhvdWdoIGl0IGRvZXMgZGVmZW5kIGFnYWluc3Qgc29tZVxuICogYWNjaWRlbnRzLlxuICogQHJldHVybnMge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2YgPSBwYXNzU3R5bGVIZWxwZXJzID0+IHtcbiAgY29uc3QgSGVscGVyVGFibGUgPSBtYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG4gIGNvbnN0IHJlbW90YWJsZUhlbHBlciA9IEhlbHBlclRhYmxlLnJlbW90YWJsZTtcblxuICAvKipcbiAqIFB1cmVseSBmb3IgcGVyZm9ybWFuY2UuIEhvd2V2ZXIgaXQgaXMgbXV0YWJsZSBzdGF0aWMgc3RhdGUsIGFuZFxuICogaXQgZG9lcyBoYXZlIHNvbWUgb2JzZXJ2YWJpbGl0eSBvbiBwcm94aWVzLiBUT0RPIG5lZWQgdG8gYXNzZXNzXG4gKiB3aGV0aGVyIHRoaXMgY3JlYXRlcyBhIHN0YXRpYyBjb21tdW5pY2F0aW9ucyBjaGFubmVsLlxuICpcbiAqIHBhc3NTdHlsZU9mIGRvZXMgYSBmdWxsIHJlY3Vyc2l2ZSB3YWxrIG9mIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgaW4gb3JkZXIgdG8gdmFsaWRhdGUgdGhhdCB0aGV5IGFyZSBhY3ljbGljLiBJbiBhZGRpdGlvblxuICogaXQgaXMgdXNlZCBieSBvdGhlciBhbGdvcml0aG1zIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2UgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBzbyB3aXRob3V0IHRoaXMgY2FjaGUsIHRoZXNlIGFsZ29yaXRobXMgY291bGQgYmVcbiAqIE8oTioqMikgb3Igd29yc2UuXG4gKlxuICogQHR5cGUge1dlYWtNYXA8V2Vha0tleSwgUGFzc1N0eWxlPn1cbiAqL1xuICBjb25zdCBwYXNzU3R5bGVNZW1vID0gbmV3IFdlYWtNYXAoKTtcblxuICAvKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICBjb25zdCBwYXNzU3R5bGVPZiA9IHBhc3NhYmxlID0+IHtcbiAgICAvKiBFdmVuIHdoZW4gYSBXZWFrU2V0IGlzIGNvcnJlY3QsIHdoZW4gdGhlIHNldCBoYXMgYSBzaG9ydGVyIGxpZmV0aW1lKi9cbiAgICAvKiB0aGFuIGl0cyBrZXlzLCB3ZSBwcmVmZXIgYSBTZXQgZHVlIHRvIGV4cGVjdGVkIGltcGxlbWVudGF0aW9uKi9cbiAgICAvKiB0cmFkZW9mZnMuKi9cbiAgICBjb25zdCBpblByb2dyZXNzID0gbmV3IFNldCgpO1xuXG4gICAgY29uc3QgcGFzc1N0eWxlT2ZSZWN1ciA9IGlubmVyID0+IHtcbiAgICAgIGNvbnN0IGlubmVySXNPYmplY3QgPSAhaXNQcmltaXRpdmUoaW5uZXIpO1xuICAgICAgaWYgKGlubmVySXNPYmplY3QpIHtcbiAgICAgICAgY29uc3QgaW5uZXJTdHlsZSA9IHBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbiAgICAgICAgaWYgKGlubmVyU3R5bGUpIHtcbiAgICAgICAgICByZXR1cm4gaW5uZXJTdHlsZTtcbiAgICAgICAgfVxuICAgICAgICAhaW5Qcm9ncmVzcy5oYXMoaW5uZXIpIHx8XG4gICAgICAgICAgRmFpbGBQYXNzLWJ5LWNvcHkgZGF0YSBjYW5ub3QgYmUgY3ljbGljICR7aW5uZXJ9YDtcbiAgICAgICAgaW5Qcm9ncmVzcy5hZGQoaW5uZXIpO1xuICAgICAgfVxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuICAgICAgaWYgKGlubmVySXNPYmplY3QpIHtcbiAgICAgICAgcGFzc1N0eWxlTWVtby5zZXQoaW5uZXIsIHBhc3NTdHlsZSk7XG4gICAgICAgIGluUHJvZ3Jlc3MuZGVsZXRlKGlubmVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXNzU3R5bGU7XG4gICAgfTtcblxuICAgIGNvbnN0IHBhc3NTdHlsZU9mSW50ZXJuYWwgPSBpbm5lciA9PiB7XG4gICAgICBjb25zdCB0eXBlc3RyID0gdHlwZW9mIGlubmVyO1xuICAgICAgc3dpdGNoICh0eXBlc3RyKSB7XG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgcmV0dXJuIHR5cGVzdHI7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICAgIGFzc2VydFBhc3NhYmxlU3RyaW5nKGlubmVyKTtcbiAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sKGlubmVyKTtcbiAgICAgICAgICByZXR1cm4gJ3N5bWJvbCc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgICAgIGlmIChpbm5lciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFpc0Zyb3plbihpbm5lcikpIHtcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICAvKiBUeXBlZEFycmF5cyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgaW4gaGFyZGVuKCkqL1xuICAgICAgICAgICAgICAvKiBhbmQgYSBjb3JyZXNwb25kaW5nIHNwZWNpYWwgZXJyb3IgbWVzc2FnZSBoZXJlLiovXG4gICAgICAgICAgICAgIGlzVHlwZWRBcnJheShpbm5lcilcbiAgICAgICAgICAgICAgICA/IFhgQ2Fubm90IHBhc3MgbXV0YWJsZSB0eXBlZCBhcnJheXMgbGlrZSAke2lubmVyfS5gXG4gICAgICAgICAgICAgICAgOiBYYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzUHJvbWlzZShpbm5lcikpIHtcbiAgICAgICAgICAgIGFzc2VydFNhZmVQcm9taXNlKGlubmVyKTtcbiAgICAgICAgICAgIHJldHVybiAncHJvbWlzZSc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHR5cGVvZiBpbm5lci50aGVuICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICAgICBGYWlsYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG4gICAgICAgICAgY29uc3QgcGFzc1N0eWxlVGFnID0gaW5uZXJbUEFTU19TVFlMRV07XG4gICAgICAgICAgaWYgKHBhc3NTdHlsZVRhZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywgJ3N0cmluZycpO1xuICAgICAgICAgICAgY29uc3QgaGVscGVyID0gSGVscGVyVGFibGVbcGFzc1N0eWxlVGFnXTtcbiAgICAgICAgICAgIGhlbHBlciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIEZhaWxgVW5yZWNvZ25pemVkIFBhc3NTdHlsZTogJHtxKHBhc3NTdHlsZVRhZyl9YDtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkKGhlbHBlciwgaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7UGFzc1N0eWxlfSAqLyAocGFzc1N0eWxlVGFnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycykge1xuICAgICAgICAgICAgaWYgKGhlbHBlci5jYW5CZVZhbGlkKGlubmVyKSkge1xuICAgICAgICAgICAgICBoZWxwZXIuYXNzZXJ0UmVzdFZhbGlkKGlubmVyLCBwYXNzU3R5bGVPZlJlY3VyKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5zdHlsZU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzc2VydFZhbGlkKHJlbW90YWJsZUhlbHBlciwgaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgIHJldHVybiAncmVtb3RhYmxlJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmdW5jdGlvbic6IHtcbiAgICAgICAgICBpc0Zyb3plbihpbm5lcikgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWA7XG4gICAgICAgICAgdHlwZW9mIGlubmVyLnRoZW4gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbiAgICAgICAgICBhc3NlcnRWYWxpZChyZW1vdGFibGVIZWxwZXIsIGlubmVyLCBwYXNzU3R5bGVPZlJlY3VyKTtcbiAgICAgICAgICByZXR1cm4gJ3JlbW90YWJsZSc7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFhgVW5yZWNvZ25pemVkIHR5cGVvZiAke3EodHlwZXN0cil9YCwgVHlwZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gcGFzc1N0eWxlT2ZSZWN1cihwYXNzYWJsZSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4ocGFzc1N0eWxlT2YpO1xufTtcblxuICAgICAgIGNvbnN0IFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sID0gU3ltYm9sLmZvcignQGVuZG8gcGFzc1N0eWxlT2YnKTtcblxuLyoqXG4gKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wgcHJvcGVydHkgb24gdGhlIGdsb2JhbCxcbiAqIHRoZW4gcHJlc3VtYWJseSBpdCB3YXMgZW5kb3dlZCBmb3IgdXMgYnkgbGl2ZXNsb3RzIHdpdGggYSBgcGFzc1N0eWxlT2ZgXG4gKiBmdW5jdGlvbiwgc28gd2Ugc2hvdWxkIHVzZSBhbmQgZXhwb3J0IHRoYXQgb25lIGluc3RlYWQuXG4gKiBPdGhlciBzb2Z0d2FyZSBtYXkgaGF2ZSBsZWZ0IGl0IGZvciB1cyBoZXJlLFxuICogYnV0IGl0IHdvdWxkIHJlcXVpcmUgd3JpdGUgYWNjZXNzIHRvIG91ciBnbG9iYWwsIG9yIHRoZSBhYmlsaXR5IHRvXG4gKiBwcm92aWRlIGVuZG93bWVudHMgdG8gb3VyIGdsb2JhbCwgYm90aCBvZiB3aGljaCBzZWVtcyBhZGVxdWF0ZSBhcyBhIHRlc3Qgb2ZcbiAqIHdoZXRoZXIgaXQgaXMgYXV0aG9yaXplZCB0byBzZXJ2ZSB0aGUgc2FtZSByb2xlIGFzIGxpdmVzbG90cy5cbiAqXG4gKiBOT1RFIEhBWkFSRDogVGhpcyB1c2UgYnkgbGl2ZXNsb3RzIGRvZXMgcmVseSBvbiBgcGFzc1N0eWxlT2ZgIGJlaW5nXG4gKiBkZXRlcm1pbmlzdGljLiBJZiBpdCBpcyBub3QsIHRoZW4gaW4gYSBsaXZlc2xvdC1saWtlIHZpcnR1YWxpemVkXG4gKiBlbnZpcm9ubWVudCwgaXQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IEdDLlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqLyRozY9fb25jZS5QYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbChQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCk7XG4gICAgICAgY29uc3QgcGFzc1N0eWxlT2YgPVxuICAoZ2xvYmFsVGhpcyAmJiBnbG9iYWxUaGlzW1Bhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sXSkgfHxcbiAgbWFrZVBhc3NTdHlsZU9mKFtcbiAgICBDb3B5QXJyYXlIZWxwZXIsXG4gICAgQnl0ZUFycmF5SGVscGVyLFxuICAgIENvcHlSZWNvcmRIZWxwZXIsXG4gICAgVGFnZ2VkSGVscGVyLFxuICAgIEVycm9ySGVscGVyLFxuICAgIFJlbW90YWJsZUhlbHBlcixcbiAgXSk7JGjNj19vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlID0gdmFsID0+IHtcbiAgcGFzc1N0eWxlT2YodmFsKTsgLyogdGhyb3dzIGlmIHZhbCBpcyBub3QgYSBwYXNzYWJsZSovXG59OyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZShhc3NlcnRQYXNzYWJsZSk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGUpO1xuXG4vKipcbiAqIElzIGBzcGVjaW1lbmAgUGFzc2FibGU/IFRoaXMgcmV0dXJucyB0cnVlIGlmZiBgcGFzc1N0eWxlT2Yoc3BlY2ltZW4pYFxuICogcmV0dXJucyBhIHN0cmluZy4gVGhpcyByZXR1cm5zIGBmYWxzZWAgaWZmIGBwYXNzU3R5bGVPZihzcGVjaW1lbilgIHRocm93cy5cbiAqIFVuZGVyIG5vIG5vcm1hbCBjaXJjdW1zdGFuY2Ugc2hvdWxkIGBpc1Bhc3NhYmxlKHNwZWNpbWVuKWAgdGhyb3cuXG4gKlxuICogVE9ETyBEZXByZWNhdGUgYW5kIHVsdGltYXRlbHkgZGVsZXRlIEBhZ29yaWMvYmFzZS16b25lJ3MgYGlzUGFzc2FibGUnIGluXG4gKiBmYXZvciBvZiB0aGlzIG9uZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzIwOTZcbiAqXG4gKiBUT0RPIGltcGxlbWVudCBhbiBpc1Bhc3NhYmxlIHRoYXQgZG9lcyBub3QgcmVseSBvbiB0cnkvY2F0Y2guXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGp1c3QgYSBzdGFuZGluIHVudGlsIHRoZW4uXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8yMDk2XG4gKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7c3BlY2ltZW4gaXMgUGFzc2FibGV9XG4gKi9cbiAgICAgICBjb25zdCBpc1Bhc3NhYmxlID0gc3BlY2ltZW4gPT4ge1xuICB0cnkge1xuICAgIC8qIEluIGZhY3QsIGl0IG5ldmVyIHJldHVybnMgdW5kZWZpbmVkLiBJdCBlaXRoZXIgcmV0dXJucyBhKi9cbiAgICAvKiBzdHJpbmcgb3IgdGhyb3dzLiovXG4gICAgcmV0dXJuIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSAhPT0gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59OyRozY9fb25jZS5pc1Bhc3NhYmxlKGlzUGFzc2FibGUpO1xuaGFyZGVuKGlzUGFzc2FibGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1Byb3BlcnR5RGVzY3JpcHRvcn0gZGVzY1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9IChuYW1lLCBkZXNjKSA9PlxuICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhuYW1lLCBkZXNjLCBwYXNzU3R5bGVPZik7XG5cbi8qKlxuICogQWZ0ZXIgaGFyZGVuaW5nLCBpZiBgZXJyYCBpcyBhIHBhc3NhYmxlIGVycm9yLCByZXR1cm4gaXQuXG4gKlxuICogT3RoZXJ3aXNlLCByZXR1cm4gYSBuZXcgcGFzc2FibGUgZXJyb3IgdGhhdCBwcm9wYWdhdGVzIHRoZSBkaWFnbm9zdGljXG4gKiBpbmZvIG9mIHRoZSBvcmlnaW5hbCwgYW5kIGlzIGxpbmtlZCB0byB0aGUgb3JpZ2luYWwgYXMgYSBub3RlLlxuICpcbiAqIFRPRE8gQWRvcHQgYSBtb3JlIGZsZXhpYmxlIG5vdGlvbiBvZiBwYXNzYWJsZSBlcnJvciwgaW4gd2hpY2hcbiAqIGEgcGFzc2FibGUgZXJyb3IgY2FuIGNvbnRhaW4gb3RoZXIgb3duIGRhdGEgcHJvcGVydGllcyB3aXRoXG4gKiB0aHJvd2FibGUgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHJldHVybnMge0Vycm9yfVxuICovXG4gICAgICAgY29uc3QgdG9QYXNzYWJsZUVycm9yID0gZXJyID0+IHtcbiAgaGFyZGVuKGVycik7XG4gIGlmIChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIsIHBhc3NTdHlsZU9mKSkge1xuICAgIHJldHVybiBlcnI7XG4gIH1cbiAgY29uc3QgeyBuYW1lLCBtZXNzYWdlIH0gPSBlcnI7XG4gIGNvbnN0IHsgY2F1c2U6IGNhdXNlRGVzYywgZXJyb3JzOiBlcnJvcnNEZXNjIH0gPVxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoZXJyKTtcbiAgbGV0IGNhdXNlO1xuICBsZXQgZXJyb3JzO1xuICBpZiAoY2F1c2VEZXNjICYmIGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYygnY2F1c2UnLCBjYXVzZURlc2MpKSB7XG4gICAgY2F1c2UgPSBjYXVzZURlc2MudmFsdWU7XG4gIH1cbiAgaWYgKGVycm9yc0Rlc2MgJiYgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKCdlcnJvcnMnLCBlcnJvcnNEZXNjKSkge1xuICAgIGVycm9ycyA9IGVycm9yc0Rlc2MudmFsdWU7XG4gIH1cblxuICBjb25zdCBlcnJDb25zdHJ1Y3RvciA9IGdldEVycm9yQ29uc3RydWN0b3IoYCR7bmFtZX1gKSB8fCBFcnJvcjtcbiAgY29uc3QgbmV3RXJyb3IgPSBtYWtlRXJyb3IoYCR7bWVzc2FnZX1gLCBlcnJDb25zdHJ1Y3Rvciwge1xuICAgIC8qIEB0cy1pZ25vcmUgQXNzdW1pbmcgY2F1c2UgaXMgRXJyb3IgfCB1bmRlZmluZWQqL1xuICAgIGNhdXNlLFxuICAgIGVycm9ycyxcbiAgfSk7XG4gIC8qIFN0aWxsIG5lZWRlZCwgYmVjYXVzZSBgbWFrZUVycm9yYCBvbmx5IGRvZXMgYSBzaGFsbG93IGZyZWV6ZS4qL1xuICBoYXJkZW4obmV3RXJyb3IpO1xuICAvKiBFdmVuIHRoZSBjbGVhbmVkIHVwIGVycm9yIGNvcHksIGlmIHNlbnQgdG8gdGhlIGNvbnNvbGUsIHNob3VsZCovXG4gIC8qIGNhdXNlIGhpZGRlbiBkaWFnbm9zdGljIGluZm9ybWF0aW9uIG9mIHRoZSBvcmlnaW5hbCBlcnJvciovXG4gIC8qIHRvIGJlIGxvZ2dlZC4qL1xuICBhbm5vdGF0ZUVycm9yKG5ld0Vycm9yLCBYYGNvcGllZCBmcm9tIGVycm9yICR7ZXJyfWApO1xuICBwYXNzU3R5bGVPZihuZXdFcnJvcikgPT09ICdlcnJvcicgfHxcbiAgICBGYWlsYEV4cGVjdGVkICR7bmV3RXJyb3J9IHRvIGJlIGEgcGFzc2FibGUgZXJyb3JgO1xuICByZXR1cm4gbmV3RXJyb3I7XG59OyRozY9fb25jZS50b1Bhc3NhYmxlRXJyb3IodG9QYXNzYWJsZUVycm9yKTtcbmhhcmRlbih0b1Bhc3NhYmxlRXJyb3IpO1xuXG4vKipcbiAqIEFmdGVyIGhhcmRlbmluZywgaWYgYHNwZWNpbWVuYCBpcyB0aHJvd2FibGUsIHJldHVybiBpdC5cbiAqIEEgc3BlY2ltZW4gaXMgdGhyb3dhYmxlIGlmZiBpdCBpcyBQYXNzYWJsZSBhbmQgY29udGFpbnMgbm8gUGFzc2FibGVDYXBzLFxuICogaS5lLiwgbm8gUmVtb3RhYmxlcyBvciBQcm9taXNlcy5cbiAqIElPVywgaWYgaXQgY29udGFpbnMgb25seSBjb3B5LWRhdGEgYW5kIHBhc3NhYmxlIGVycm9ycy5cbiAqXG4gKiBPdGhlcndpc2UsIGlmIGBzcGVjaW1lbmAgaXMgKmFsbW9zdCogdGhyb3dhYmxlLCBmb3IgZXhhbXBsZSwgaXQgaXNcbiAqIGFuIGVycm9yIHRoYXQgY2FuIGJlIG1hZGUgdGhyb3dhYmxlIGJ5IGB0b1Bhc3NhYmxlRXJyb3JgLCB0aGVuXG4gKiByZXR1cm4gYHNwZWNpbWVuYCBjb252ZXJ0ZWQgdG8gYSB0aHJvd2FibGUuXG4gKlxuICogT3RoZXJ3aXNlLCB0aHJvdyBhIGRpYWdub3N0aWMgaW5kaWNhdGluZyBhIGZhaWx1cmUgdG8gY29lcmNlLlxuICpcbiAqIFRoaXMgaXMgaW4gc3VwcG9ydCBvZiB0aGUgZXhvIGJvdW5kYXJ5IHRocm93aW5nIG9ubHkgdGhyb3dhYmxlcywgdG8gZWFzZVxuICogc2VjdXJpdHkgcmV2aWV3LlxuICpcbiAqIFRPRE8gQWRvcHQgYSBtb3JlIGZsZXhpdGJsZSBub3Rpb24gb2YgdGhyb3dhYmxlLCBpbiB3aGljaFxuICogZGF0YSBjb250YWluZXJzIGNvbnRhaW5pbmcgbm9uLXBhc3NhYmxlIGVycm9ycyBjYW4gdGhlbXNlbHZlcyBiZSBjb2VyY2VkXG4gKiB0byB0aHJvd2FibGUgYnkgY29lcmNpbmcgdG8gYSBzaW1pbGFyIGNvbnRhaW5lcnMgY29udGFpbmluZ1xuICogdGhlIHJlc3VsdHMgb2YgY29lcmNpbmcgdGhvc2UgZXJyb3JzIHRvIHBhc3NhYmxlIGVycm9ycy5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7UGFzc2FibGU8bmV2ZXIsIEVycm9yPn1cbiAqL1xuICAgICAgIGNvbnN0IHRvVGhyb3dhYmxlID0gc3BlY2ltZW4gPT4ge1xuICBoYXJkZW4oc3BlY2ltZW4pO1xuICBpZiAoaXNFcnJvckxpa2Uoc3BlY2ltZW4pKSB7XG4gICAgcmV0dXJuIHRvUGFzc2FibGVFcnJvcigvKiogQHR5cGUge0Vycm9yfSAqLyAoc3BlY2ltZW4pKTtcbiAgfVxuICBpZiAoIWlzUHJpbWl0aXZlKHNwZWNpbWVuKSkge1xuICAgIC8qIE5vdGUgdGhhdCB0aGlzIHN0ZXAgd2lsbCBmYWlsIGlmIGBzcGVjaW1lbmAgd291bGQgYmUgYSBwYXNzYWJsZSBjb250YWluZXIqL1xuICAgIC8qIGV4Y2VwdCB0aGF0IGl0IGNvbnRhaW5zIG5vbi1wYXNzYWJsZSBlcnJvcnMgdGhhdCBjb3VsZCBiZSBjb252ZXJ0ZWQuKi9cbiAgICAvKiBUaGlzIHdpbGwgbmVlZCB0byBiZSBmaXhlZCB0byBkbyB0aGUgVE9ETyBhYm92ZS4qL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IC8qKiBAdHlwZSB7UGFzc1N0eWxlfSAqLyAocGFzc1N0eWxlT2Yoc3BlY2ltZW4pKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IC8qKiBAdHlwZSB7Q29weUFycmF5fSAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICBlbGVtZW50ID09PSB0b1Rocm93YWJsZShlbGVtZW50KSB8fFxuICAgICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtlbGVtZW50fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICBjb25zdCByZWMgPSAvKiogQHR5cGUge0NvcHlSZWNvcmR9ICovIChzcGVjaW1lbik7XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlcyhyZWMpKSB7XG4gICAgICAgICAgdmFsID09PSB0b1Rocm93YWJsZSh2YWwpIHx8XG4gICAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke3ZhbH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICBjb25zdCB0ZyA9IC8qKiBAdHlwZSB7Q29weVRhZ2dlZH0gKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgY29uc3QgeyBwYXlsb2FkIH0gPSB0ZztcbiAgICAgICAgcGF5bG9hZCA9PT0gdG9UaHJvd2FibGUocGF5bG9hZCkgfHxcbiAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke3BheWxvYWR9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgY29uc3QgZXIgPSAvKiogQHR5cGUge0Vycm9yfSAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBlciA9PT0gdG9UaHJvd2FibGUoZXIpIHx8XG4gICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtlcn1gO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRmFpbGBBICR7cShwYXNzU3R5bGUpfSBpcyBub3QgdGhyb3dhYmxlOiAke3NwZWNpbWVufWA7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAvKiogQHR5cGUge1Bhc3NhYmxlPG5ldmVyLG5ldmVyPn0gKi8gKHNwZWNpbWVuKTtcbn07JGjNj19vbmNlLnRvVGhyb3dhYmxlKHRvVGhyb3dhYmxlKTtcbmhhcmRlbih0b1Rocm93YWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCI6WyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCJdLCJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiJdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSJdLCJpc1Bhc3NhYmxlIjpbImlzUGFzc2FibGUiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdLCJ0b1Rocm93YWJsZSI6WyJ0b1Rocm93YWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD7nJ+yMC4AADAuAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3JlbW90YWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlJlbW90YWJsZUhlbHBlciIsImFzc2VydElmYWNlIiwiY2FuQmVNZXRob2QiLCJnZXRJbnRlcmZhY2VPZiIsImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLGdldE1ldGhvZE5hbWVzLGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxjaGVja1RhZ1JlY29yZCxjaGVja0Z1bmN0aW9uVGFnUmVjb3JkLGlzUHJpbWl0aXZlLGdldFRhZyxDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLFskaM2PX2EgPT4gKGdldE1ldGhvZE5hbWVzID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja1RhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkXCIsWyRozY9fYSA9PiAoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDaGVja2VyLCBSZW1vdGFibGVNZXRob2ROYW1lfSBmcm9tICcuL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7SW50ZXJmYWNlU3BlYywgUGFzc1N0eWxlZH0gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge1Bhc3NTdHlsZUhlbHBlcn0gZnJvbSAnLi9pbnRlcm5hbC10eXBlcy5qcydcbiAqIEBpbXBvcnQge1JlbW90YWJsZU9iamVjdH0gZnJvbSAnLi90eXBlcy5qcydcbiAqL1xuXG4vKipcbiAqIEZvciBhIGZ1bmN0aW9uIHRvIGJlIGEgdmFsaWQgbWV0aG9kLCBpdCBtdXN0IG5vdCBiZSBwYXNzYWJsZS5cbiAqIE90aGVyd2lzZSwgd2UgcmlzayBjb25mdXNpbmcgcGFzcy1ieS1jb3B5IGRhdGEgY2FycnlpbmdcbiAqIGZhciBmdW5jdGlvbnMgd2l0aCBhdHRlbXB0cyBhdCBmYXIgb2JqZWN0cyB3aXRoIG1ldGhvZHMuXG4gKlxuICogVE9ETyBIQVpBUkQgQmVjYXVzZSB3ZSBjaGVjayB0aGlzIG9uIHRoZSB3YXkgdG8gaGFyZGVuaW5nIGEgcmVtb3RhYmxlLFxuICogd2UgY2Fubm90IHlldCBjaGVjayB0aGF0IGBmdW5jYCBpcyBoYXJkZW5lZC4gSG93ZXZlciwgd2l0aG91dFxuICogZG9pbmcgc28sIGl0J3MgaW5oZXJpdGFuY2UgbWlnaHQgY2hhbmdlIGFmdGVyIHRoZSBgUEFTU19TVFlMRWBcbiAqIGNoZWNrIGJlbG93LlxuICpcbiAqIEBwYXJhbSB7YW55fSBmdW5jXG4gKiBAcmV0dXJucyB7ZnVuYyBpcyBDYWxsYWJsZUZ1bmN0aW9ufVxuICovXG4gICAgICAgY29uc3QgY2FuQmVNZXRob2QgPSBmdW5jID0+XG4gIHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nICYmICEoUEFTU19TVFlMRSBpbiBmdW5jKTskaM2PX29uY2UuY2FuQmVNZXRob2QoY2FuQmVNZXRob2QpO1xuaGFyZGVuKGNhbkJlTWV0aG9kKTtcblxuLyogVE9ETyBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzI4ODQqL1xuLyogQWJzdHJhY3Qgb3V0IGNhbkJlTWV0aG9kTmFtZSBzbyBsYXRlciBQUnMgYWdyZWUgb24gbWV0aG9kIG5hbWUgcmVzdHJpY3Rpb25zLiovXG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGtleVxuICogQHJldHVybnMge2tleSBpcyBSZW1vdGFibGVNZXRob2ROYW1lfVxuICovXG5jb25zdCBjYW5CZU1ldGhvZE5hbWUgPSBrZXkgPT5cbiAgLyogdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGtleSA9PT0gJ3N5bWJvbCc7Ki9cbiAgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGtleSA9PT0gJ3N5bWJvbCcgfHwgdHlwZW9mIGtleSA9PT0gJ251bWJlcic7XG5oYXJkZW4oY2FuQmVNZXRob2ROYW1lKTtcblxuLyoqXG4gKiBVc2VzIHRoZSBgZ2V0TWV0aG9kTmFtZXNgIGZyb20gdGhlIGV2ZW50dWFsLXNlbmQgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gdGhhdFxuICogZG9lcyBub3Qga25vdyBhbnl0aGluZyBhYm91dCByZW1vdGFibGVzLlxuICpcbiAqIEN1cnJlbnRseSwganVzdCBhbGlhcyBgZ2V0TWV0aG9kTmFtZXNgIGJ1dCB0aGlzIGFic3RyYWN0aW9uIGV4aXN0cyBzb1xuICogYSBmdXR1cmUgUFIgY2FuIGVuZm9yY2UgcmVzdHJpY3Rpb25zIG9uIG1ldGhvZCBuYW1lcyBvZiByZW1vdGFibGVzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgQ2FsbGFibGVGdW5jdGlvbj59IFRcbiAqIEBwYXJhbSB7VH0gYmVoYXZpb3JNZXRob2RzXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlTWV0aG9kTmFtZVtdfVxuICovXG4gICAgICAgY29uc3QgZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMgPSBiZWhhdmlvck1ldGhvZHMgPT5cbiAgZ2V0TWV0aG9kTmFtZXMoYmVoYXZpb3JNZXRob2RzKTskaM2PX29uY2UuZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMoZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMpO1xuaGFyZGVuKGdldFJlbW90YWJsZU1ldGhvZE5hbWVzKTtcblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHtcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgaGFzT3duLFxufSA9IE9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tJZmFjZSA9IChpZmFjZSwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICAvKiBUT0RPIG90aGVyIHBvc3NpYmxlIGlmYWNlcywgb25jZSB3ZSBoYXZlIHRoaXJkIHBhcnR5IHZlcmFjaXR5Ki9cbiAgICAodHlwZW9mIGlmYWNlID09PSAnc3RyaW5nJyB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkgJiZcbiAgICAoaWZhY2UgPT09ICdSZW1vdGFibGUnIHx8XG4gICAgICBpZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKSB8fFxuICAgICAgaWZhY2Uuc3RhcnRzV2l0aCgnRGVidWdOYW1lOiAnKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goY2hlY2spYEZvciBub3csIGlmYWNlICR7cShcbiAgICAgICAgICBpZmFjZSxcbiAgICAgICAgKX0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCI7IHVuaW1wbGVtZW50ZWRgKSlcbiAgKTtcbn07XG5cbi8qKlxuICogQW4gYGlmYWNlYCBtdXN0IGJlIHB1cmUuIFJpZ2h0IG5vdyBpdCBtdXN0IGJlIGEgc3RyaW5nLCB3aGljaCBpcyBwdXJlLlxuICogTGF0ZXIgd2UgZXhwZWN0IHRvIGluY2x1ZGUgc29tZSBvdGhlciB2YWx1ZXMgdGhhdCBxdWFsaWZ5IGFzIGBQdXJlRGF0YWAsXG4gKiB3aGljaCBpcyBhIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBlbmRpbmcgb25seSBpbiBwcmltaXRpdmVzIG9yXG4gKiBlbXB0eSBwYXNzLWJ5LWNvcHkgY29tcG9zaXRlcy4gTm8gcmVtb3RhYmxlcywgcHJvbWlzZXMsIG9yIGVycm9ycy5cbiAqIFdlICphc3N1bWUqIGZvciBub3cgdGhhdCB0aGUgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGNvbnRhaW5zIG5vXG4gKiBwcm94aWVzLlxuICpcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydElmYWNlID0gaWZhY2UgPT4gY2hlY2tJZmFjZShpZmFjZSwgYXNzZXJ0Q2hlY2tlcik7JGjNj19vbmNlLmFzc2VydElmYWNlKGFzc2VydElmYWNlKTtcbmhhcmRlbihhc3NlcnRJZmFjZSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3QgfCBGdW5jdGlvbn0gb3JpZ2luYWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlUHJvdG9PZiA9IChvcmlnaW5hbCwgY2hlY2spID0+IHtcbiAgIWlzUHJpbWl0aXZlKG9yaWdpbmFsKSB8fFxuICAgIEZhaWxgUmVtb3RhYmxlcyBtdXN0IGJlIG9iamVjdHMgb3IgZnVuY3Rpb25zOiAke29yaWdpbmFsfWA7XG5cbiAgLyogQSB2YWxpZCByZW1vdGFibGUgb2JqZWN0IG11c3QgaW5oZXJpdCBmcm9tIGEgXCJ0YWcgcmVjb3JkXCIgLS0gYSovXG4gIC8qIHBsYWluLW9iamVjdCBwcm90b3R5cGUgY29uc2lzdGluZyBvZiBvbmx5Ki9cbiAgLyogYSBgUEFTU19TVFlMRWAgcHJvcGVydHkgd2l0aCB2YWx1ZSBcInJlbW90YWJsZVwiIGFuZCBhIHN1aXRhYmxlIGBTeW1ib2wudG9TdHJpbmdUYWdgKi9cbiAgLyogcHJvcGVydHkuIFRoZSByZW1vdGFibGUgY291bGQgaW5oZXJpdCBkaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLCBvciovXG4gIC8qIGl0IGNvdWxkIGluaGVyaXQgZnJvbSBhbm90aGVyIHZhbGlkIHJlbW90YWJsZSwgdGhhdCB0aGVyZWZvcmUgaXRzZWxmKi9cbiAgLyogaW5oZXJpdHMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLiovXG4gIC8qKi9cbiAgLyogVE9ETzogSXQgd291bGQgYmUgbmljZSB0byB0eXBlZGVmIHRoaXMgc2hhcGUsIGJ1dCB3ZSBjYW4ndCBkZWNsYXJlIGEgdHlwZSovXG4gIC8qIHdpdGggUEFTU19TVFlMRSBmcm9tIEpTRG9jLiovXG4gIC8qKi9cbiAgLyogQHR5cGUge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcsKi9cbiAgLyogW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZywqL1xuICAvKiB9fSovXG4gIC8qKi9cbiAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG4gIGlmIChcbiAgICBwcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgcHJvdG8gPT09IG51bGwgfHxcbiAgICBwcm90byA9PT0gRnVuY3Rpb24ucHJvdG90eXBlXG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUmVtb3RhYmxlcyBtdXN0IGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQ6ICR7cShvcmlnaW5hbCl9YFxuICAgICk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9yaWdpbmFsID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IHByb3RvUHJvdG8gPSBnZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgaWYgKHByb3RvUHJvdG8gIT09IG9iamVjdFByb3RvdHlwZSAmJiBwcm90b1Byb3RvICE9PSBudWxsKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgcmV0dXJuIGNoZWNrUmVtb3RhYmxlKHByb3RvLCBjaGVjayk7XG4gICAgfVxuICAgIGlmICghY2hlY2tUYWdSZWNvcmQocHJvdG8sICdyZW1vdGFibGUnLCBjaGVjaykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9yaWdpbmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCAncmVtb3RhYmxlJywgY2hlY2spKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbiAgY29uc3QgcGFzc1N0eWxlS2V5ID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoUEFTU19TVFlMRSk7XG4gIGNvbnN0IHRhZ0tleSA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKFN5bWJvbC50b1N0cmluZ1RhZyk7XG4gIGNvbnN0IHtcbiAgICAvKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG4gICAgWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFzc1N0eWxlS2V5KV06IF9wYXNzU3R5bGVEZXNjLFxuICAgIFsvKiogQHR5cGUge3N0cmluZ30gKi8gKHRhZ0tleSldOiB7IHZhbHVlOiBpZmFjZSB9LFxuICAgIC4uLnJlc3REZXNjc1xuICB9ID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbiAgcmV0dXJuIChcbiAgICAob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkgJiZcbiAgICBjaGVja0lmYWNlKGlmYWNlLCBjaGVjaylcbiAgKTtcbn07XG5cbi8qKlxuICogS2VlcCBhIHdlYWsgc2V0IG9mIGNvbmZpcm1lZCByZW1vdGFibGVzIGZvciBtYXJzaGFsIHBlcmZvcm1hbmNlXG4gKiAod2l0aG91dCB3aGljaCB3ZSB3b3VsZCBpbmN1ciBhIHJlZHVuZGFudCB2ZXJpZmljYXRpb24gaW5cbiAqIGdldEludGVyZmFjZU9mKS5cbiAqIFdlIGRvbid0IHJlbWVtYmVyIHJlamVjdGlvbnMgYmVjYXVzZSB0aGV5IGFyZSBwb3NzaWJsZSB0byBjb3JyZWN0XG4gKiB3aXRoIGUuZy4gYGhhcmRlbmAuXG4gKlxuICogQHR5cGUge1dlYWtTZXQ8UmVtb3RhYmxlT2JqZWN0Pn1cbiAqL1xuY29uc3QgY29uZmlybWVkUmVtb3RhYmxlcyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7dmFsIGlzIFJlbW90YWJsZU9iamVjdH1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGUgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghaXNGcm96ZW4odmFsKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7dmFsfWBcbiAgICApO1xuICB9XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gIGlmICghUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQodmFsLCBjaGVjaykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBTaW1wbGUgc2VtYW50aWNzLCBqdXN0IHRlbGwgd2hhdCBpbnRlcmZhY2Ugc3BlYyBhIFJlbW90YWJsZSBoYXMsXG4gKiBvciB1bmRlZmluZWQgaWYgbm90IGRlZW1lZCB0byBiZSBhIFJlbW90YWJsZS5cbiAqXG4gKiBAdHlwZSB7e1xuICogPFQgZXh0ZW5kcyBzdHJpbmc+KHZhbDogUGFzc1N0eWxlZDxhbnksIFQ+KTogVDtcbiAqICh2YWw6IGFueSk6IEludGVyZmFjZVNwZWMgfCB1bmRlZmluZWQ7XG4gKiB9fVxuICovXG4gICAgICAgY29uc3QgZ2V0SW50ZXJmYWNlT2YgPSB2YWwgPT4ge1xuICBpZiAoXG4gICAgaXNQcmltaXRpdmUodmFsKSB8fFxuICAgIHZhbFtQQVNTX1NUWUxFXSAhPT0gJ3JlbW90YWJsZScgfHxcbiAgICAhY2hlY2tSZW1vdGFibGUodmFsKVxuICApIHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICByZXR1cm4gZ2V0VGFnKHZhbCk7XG59OyRozY9fb25jZS5nZXRJbnRlcmZhY2VPZihnZXRJbnRlcmZhY2VPZik7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlT2YpO1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAncmVtb3RhYmxlJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IHZhbGlkVHlwZSA9XG4gICAgICAoIWlzUHJpbWl0aXZlKGNhbmRpZGF0ZSkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAoIWlzQXJyYXkoY2FuZGlkYXRlKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIGFycmF5cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuICAgIGlmICghdmFsaWRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG4gICAgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvKiBFdmVyeSBvd24gcHJvcGVydHkgKHJlZ2FyZGxlc3Mgb2YgZW51bWVyYWJpbGl0eSkqL1xuICAgICAgLyogbXVzdCBoYXZlIGEgZnVuY3Rpb24gdmFsdWUuKi9cbiAgICAgIHJldHVybiBvd25LZXlzKGRlc2NzKS5ldmVyeShrZXkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8qIFR5cGVjYXN0IG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbiAgICAgICAgICAoaGFzT3duKGRlc2NzWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoa2V5KV0sICd2YWx1ZScpIHx8XG4gICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuICAgICAgICAgICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgICAgICAgICApfSBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgICAoKGtleSA9PT0gU3ltYm9sLnRvU3RyaW5nVGFnICYmIGNoZWNrSWZhY2UoY2FuZGlkYXRlW2tleV0sIGNoZWNrKSkgfHxcbiAgICAgICAgICAgICgoY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pIHx8XG4gICAgICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIG5vbi1tZXRob2RzIGxpa2UgJHtxKFxuICAgICAgICAgICAgICAgICAgU3RyaW5nKGtleSksXG4gICAgICAgICAgICAgICAgKX0gaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgICAgIChrZXkgIT09IFBBU1NfU1RZTEUgfHxcbiAgICAgICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICAgICAgQ1goY2hlY2spYEEgcGFzcy1ieS1yZW1vdGUgY2Fubm90IHNoYWRvdyAke3EoUEFTU19TVFlMRSl9YCkpKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLyogRmFyIGZ1bmN0aW9ucyBjYW5ub3QgYmUgbWV0aG9kcywgYW5kIGNhbm5vdCBoYXZlIG1ldGhvZHMuKi9cbiAgICAgIC8qIFRoZXkgbXVzdCBoYXZlIGV4YWN0bHkgZXhwZWN0ZWQgYC5uYW1lYCBhbmQgYC5sZW5ndGhgIHByb3BlcnRpZXMqL1xuICAgICAgY29uc3Qge1xuICAgICAgICBuYW1lOiBuYW1lRGVzYyxcbiAgICAgICAgbGVuZ3RoOiBsZW5ndGhEZXNjLFxuICAgICAgICAvKiBAdHMtaWdub3JlIFRTIGRvZXNuJ3QgbGlrZSBzeW1ib2xzIGFzIGNvbXB1dGVkIGluZGV4ZXM/PyovXG4gICAgICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiB0b1N0cmluZ1RhZ0Rlc2MsXG4gICAgICAgIC4uLnJlc3REZXNjc1xuICAgICAgfSA9IGRlc2NzO1xuICAgICAgY29uc3QgcmVzdEtleXMgPSBvd25LZXlzKHJlc3REZXNjcyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoKG5hbWVEZXNjICYmIHR5cGVvZiBuYW1lRGVzYy52YWx1ZSA9PT0gJ3N0cmluZycpIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKGNoZWNrKWBGYXIgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgKChsZW5ndGhEZXNjICYmIHR5cGVvZiBsZW5ndGhEZXNjLnZhbHVlID09PSAnbnVtYmVyJykgfHxcbiAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgKWBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAodG9TdHJpbmdUYWdEZXNjID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoKHR5cGVvZiB0b1N0cmluZ1RhZ0Rlc2MudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgICAgKWBGYXIgZnVuY3Rpb24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgICAgIGNoZWNrSWZhY2UodG9TdHJpbmdUYWdEZXNjLnZhbHVlLCBjaGVjaykpKSAmJlxuICAgICAgICAocmVzdEtleXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9ucyB1bmV4cGVjdGVkIHByb3BlcnRpZXMgYmVzaWRlcyAubmFtZSBhbmQgLmxlbmd0aCAke3Jlc3RLZXlzfWApKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuICEhY2hlY2sgJiYgQ1goY2hlY2spYHVucmVjb2duaXplZCB0eXBlb2YgJHtjYW5kaWRhdGV9YDtcbiAgfSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IGNhbmRpZGF0ZSA9PiBjaGVja1JlbW90YWJsZShjYW5kaWRhdGUsIGFzc2VydENoZWNrZXIpLFxuXG4gIGV2ZXJ5OiAoX3Bhc3NhYmxlLCBfZm4pID0+IHRydWUsXG59KTskaM2PX29uY2UuUmVtb3RhYmxlSGVscGVyKFJlbW90YWJsZUhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjYW5CZU1ldGhvZCI6WyJjYW5CZU1ldGhvZCJdLCJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyI6WyJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyJdLCJhc3NlcnRJZmFjZSI6WyJhc3NlcnRJZmFjZSJdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiJdLCJSZW1vdGFibGVIZWxwZXIiOlsiUmVtb3RhYmxlSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIeADyhSFgAAUhYAACsAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc2FmZS1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbImFzc2VydFNhZmVQcm9taXNlIiwiaXNTYWZlUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGlzUHJvbWlzZSxxLGFzc2VydENoZWNrZXIsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtDaGVja2VyfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IGlzRnJvemVuLCBnZXRQcm90b3R5cGVPZiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLCBoYXNPd24gfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgdG9TdHJpbmdUYWcgfSA9IFN5bWJvbDtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2V9IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzID0gKHByLCBjaGVjaykgPT4ge1xuICBjb25zdCBrZXlzID0gb3duS2V5cyhwcik7XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAqIFRoaXMgZXhjbHVkZXMgdGhvc2Ugc3ltYm9sLW5hbWVkIG93biBwcm9wZXJ0aWVzIHRoYXQgYXJlIGFsc28gZm91bmQgb25cbiAqIGBQcm9taXNlLnByb3RvdHlwZWAsIHNvIHRoYXQgb3ZlcnJpZGVzIG9mIHRoZXNlIHByb3BlcnRpZXMgY2FuIGJlXG4gKiBleHBsaWNpdGx5IHRvbGVyYXRlZCBpZiB0aGV5IHBhc3MgdGhlIGBjaGVja1NhZmVPd25LZXlgIGNoZWNrIGJlbG93LlxuICogSW4gcGFydGljdWxhciwgd2Ugd2lzaCB0byB0b2xlcmF0ZVxuICogICAqIEFuIG92ZXJyaWRpbmcgYHRvU3RyaW5nVGFnYCBub24tZW51bWVyYWJsZSBkYXRhIHByb3BlcnR5XG4gKiAgICAgd2l0aCBhIHN0cmluZyB2YWx1ZS5cbiAqICAgKiBUaG9zZSBvd24gcHJvcGVydGllcyB0aGF0IG1pZ2h0IGJlIGFkZGVkIGJ5IE5vZGUncyBhc3luY19ob29rcy5cbiAqL1xuICBjb25zdCB1bmtub3duS2V5cyA9IGtleXMuZmlsdGVyKFxuICAgIGtleSA9PiB0eXBlb2Yga2V5ICE9PSAnc3ltYm9sJyB8fCAhaGFzT3duKFByb21pc2UucHJvdG90eXBlLCBrZXkpLFxuICApO1xuXG4gIGlmICh1bmtub3duS2V5cy5sZW5ndGggIT09IDApIHtcbiAgICByZXR1cm4gQ1goXG4gICAgICBjaGVjayxcbiAgICApYCR7cHJ9IC0gTXVzdCBub3QgaGF2ZSBhbnkgb3duIHByb3BlcnRpZXM6ICR7cSh1bmtub3duS2V5cyl9YDtcbiAgfVxuXG4gIC8qKlxuICogRXhwbGljaXRseSB0b2xlcmF0ZSBhIGB0b1N0cmluZ1RhZ2Agc3ltYm9sLW5hbWVkIG5vbi1lbnVtZXJhYmxlXG4gKiBkYXRhIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIGEgc3RyaW5nLiBPdGhlcndpc2UsIHRvbGVyYXRlIHRob3NlXG4gKiBzeW1ib2wtbmFtZWQgcHJvcGVydGllcyB0aGF0IG1pZ2h0IGJlIGFkZGVkIGJ5IE5vZGVKUydzIGFzeW5jX2hvb2tzLFxuICogaWYgdGhleSBvYmV5IHRoZSBleHBlY3RlZCBzYWZldHkgcHJvcGVydGllcy5cbiAqXG4gKiBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIE5vZGUncyBhc3luY19ob29rcyBjb250YWlucyB0aGVcbiAqIGZvbGxvd2luZyBjb2RlLCB3aGljaCB3ZSBjYW4gc2FmZWx5IHRvbGVyYXRlXG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIGRlc3Ryb3lUcmFja2luZyhwcm9taXNlLCBwYXJlbnQpIHtcbiAqICAgdHJhY2tQcm9taXNlKHByb21pc2UsIHBhcmVudCk7XG4gKiAgIGNvbnN0IGFzeW5jSWQgPSBwcm9taXNlW2FzeW5jX2lkX3N5bWJvbF07XG4gKiAgIGNvbnN0IGRlc3Ryb3llZCA9IHsgZGVzdHJveWVkOiBmYWxzZSB9O1xuICogICBwcm9taXNlW2Rlc3Ryb3llZFN5bWJvbF0gPSBkZXN0cm95ZWQ7XG4gKiAgIHJlZ2lzdGVyRGVzdHJveUhvb2socHJvbWlzZSwgYXN5bmNJZCwgZGVzdHJveWVkKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0ga2V5XG4gKi9cbiAgY29uc3QgY2hlY2tTYWZlT3duS2V5ID0ga2V5ID0+IHtcbiAgICBpZiAoa2V5ID09PSB0b1N0cmluZ1RhZykge1xuICAgICAgLyogVE9ETyBzaG91bGQgd2UgYWxzbyBlbmZvcmNlIGFueXRoaW5nIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nLCovXG4gICAgICAvKiBzdWNoIGFzIHRoYXQgaXQgbXVzdCBzdGFydCB3aXRoIGAnUHJvbWlzZSdgPyovXG4gICAgICBjb25zdCB0YWdEZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByLCB0b1N0cmluZ1RhZyk7XG4gICAgICBhc3NlcnQodGFnRGVzYyAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChoYXNPd24odGFnRGVzYywgJ3ZhbHVlJykgfHxcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIGRhdGEgcHJvcGVydHksIG5vdCBhbiBhY2Nlc3NvcjogJHtxKHRhZ0Rlc2MpfWApICYmXG4gICAgICAgICh0eXBlb2YgdGFnRGVzYy52YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgT3duIEBAdG9TdHJpbmdUYWcgdmFsdWUgbXVzdCBiZSBhIHN0cmluZzogJHtxKHRhZ0Rlc2MudmFsdWUpfWApICYmXG4gICAgICAgICghdGFnRGVzYy5lbnVtZXJhYmxlIHx8XG4gICAgICAgICAgQ1goY2hlY2spYE93biBAQHRvU3RyaW5nVGFnIG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7cSh0YWdEZXNjKX1gKVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsID0gcHJba2V5XTtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJlxuICAgICAgdmFsICE9PSBudWxsICYmXG4gICAgICBpc0Zyb3plbih2YWwpICYmXG4gICAgICBnZXRQcm90b3R5cGVPZih2YWwpID09PSBPYmplY3QucHJvdG90eXBlXG4gICAgKSB7XG4gICAgICBjb25zdCBzdWJLZXlzID0gb3duS2V5cyh2YWwpO1xuICAgICAgaWYgKHN1YktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHN1YktleXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIHN1YktleXNbMF0gPT09ICdkZXN0cm95ZWQnICYmXG4gICAgICAgIHZhbC5kZXN0cm95ZWQgPT09IGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBDWChcbiAgICAgIGNoZWNrLFxuICAgIClgVW5leHBlY3RlZCBOb2RlIGFzeW5jX2hvb2tzIGFkZGl0aW9ucyB0byBwcm9taXNlOiAke3ByfS4ke3EoXG4gICAgICBTdHJpbmcoa2V5KSxcbiAgICApfSBpcyAke3ZhbH1gO1xuICB9O1xuXG4gIHJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZU93bktleSk7XG59O1xuXG4vKipcbiAqIFVuZGVyIEhhcmRlbmVkIEpTIGEgcHJvbWlzZSBpcyBcInNhZmVcIiBpZiBpdHMgYHRoZW5gIG1ldGhvZCBjYW4gYmUgY2FsbGVkXG4gKiBzeW5jaHJvbm91c2x5IHdpdGhvdXQgZ2l2aW5nIHRoZSBwcm9taXNlIGFuIG9wcG9ydHVuaXR5IGZvciBhXG4gKiByZWVudHJhbmN5IGF0dGFjayBkdXJpbmcgdGhhdCBjYWxsLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvOVxuICogcmFpc2VzIHRoZSBpc3N1ZSBvZiB0ZXN0aW5nIHRoYXQgYSBzcGVjaW1lbiBpcyBhIHNhZmUgcHJvbWlzZVxuICogc3VjaCB0aGF0IHRoZSB0ZXN0IGFsc28gZG9lcyBub3QgZ2l2ZSB0aGUgc3BlY2ltZW4gYVxuICogcmVlbnRyYW5jeSBvcHBvcnR1bml0eS4gVGhhdCBpcyB3ZWxsIGJleW9uZCB0aGUgYW1iaXRpb24gaGVyZS5cbiAqIFRPRE8gVGhvdWdoIGlmIHdlIGZpZ3VyZSBvdXQgYSBuaWNlIHNvbHV0aW9uLCBpdCBtaWdodCBiZSBnb29kIHRvXG4gKiB1c2UgaXQgaGVyZSBhcyB3ZWxsLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrU2FmZVByb21pc2UgPSAocHIsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgKGlzRnJvemVuKHByKSB8fCBDWChjaGVjaylgJHtwcn0gLSBNdXN0IGJlIGZyb3plbmApICYmXG4gICAgKGlzUHJvbWlzZShwcikgfHwgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBiZSBhIHByb21pc2VgKSAmJlxuICAgIChnZXRQcm90b3R5cGVPZihwcikgPT09IFByb21pc2UucHJvdG90eXBlIHx8XG4gICAgICBDWChjaGVjaylgJHtwcn0gLSBNdXN0IGluaGVyaXQgZnJvbSBQcm9taXNlLnByb3RvdHlwZTogJHtxKFxuICAgICAgICBnZXRQcm90b3R5cGVPZihwciksXG4gICAgICApfWApICYmXG4gICAgY2hlY2tQcm9taXNlT3duS2V5cygvKiogQHR5cGUge1Byb21pc2V9ICovIChwciksIGNoZWNrKVxuICApO1xufTtcbmhhcmRlbihjaGVja1NhZmVQcm9taXNlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuICAgICAgIGNvbnN0IGlzU2FmZVByb21pc2UgPSBwciA9PiBjaGVja1NhZmVQcm9taXNlKHByLCB4ID0+IHgpOyRozY9fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0U2FmZVByb21pc2UgPSBwciA9PiBjaGVja1NhZmVQcm9taXNlKHByLCBhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0U2FmZVByb21pc2UoYXNzZXJ0U2FmZVByb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPyo2QfbDwAA2w8AACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc3RyaW5nLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb24sRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoga25vdyBhYm91dGBpc1dlbGxGb3JtZWRgKi9cbmNvbnN0IGhhc1dlbGxGb3JtZWRTdHJpbmdNZXRob2QgPSAhIVN0cmluZy5wcm90b3R5cGUuaXNXZWxsRm9ybWVkO1xuXG4vKipcbiAqIElzIHRoZSBhcmd1bWVudCBhIHdlbGwtZm9ybWVkIHN0cmluZz9cbiAqXG4gKiBVbmZvcnR1bmF0ZWx5LCB0aGVcbiAqIFtzdGFuZGFyZCBidWlsdC1pbiBgU3RyaW5nLnByb3RvdHlwZS5pc1dlbGxGb3JtZWRgXShodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pcy11c3Ytc3RyaW5nKVxuICogZG9lcyBhIFRvU3RyaW5nIG9uIGl0cyBpbnB1dCwgY2F1c2luZyBpdCB0byBqdWRnZSBub24tc3RyaW5ncyB0byBiZVxuICogd2VsbC1mb3JtZWQgc3RyaW5ncyBpZiB0aGV5IGNvZXJjZSB0byBhIHdlbGwtZm9ybWVkIHN0cmluZ3MuIFRoaXNcbiAqIHJlY2FwaXR1bGF0ZXMgdGhlIG1pc3Rha2UgaW4gaGF2aW5nIHRoZSBnbG9iYWwgYGlzTmFOYCBjb2VyY2UgaXRzIGlucHV0cyxcbiAqIGNhdXNpbmcgaXQgdG8ganVkZ2Ugbm9uLXN0cmluZyB0byBiZSBOYU4gaWYgdGhleSBjb2VyY2UgdG8gTmFOLlxuICpcbiAqIFRoaXMgYGlzV2VsbEZvcm1lZFN0cmluZ2AgZnVuY3Rpb24gb25seSBqdWRnZXMgd2VsbC1mb3JtZWQgc3RyaW5ncyB0byBiZVxuICogd2VsbC1mb3JtZWQgc3RyaW5ncy4gRm9yIGFsbCBub24tc3RyaW5ncyBpdCByZXR1cm5zIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3RyXG4gKiBAcmV0dXJucyB7c3RyIGlzIHN0cmluZ31cbiAqL1xuICAgICAgIGNvbnN0IGlzV2VsbEZvcm1lZFN0cmluZyA9IGhhc1dlbGxGb3JtZWRTdHJpbmdNZXRob2RcbiAgPyBzdHIgPT4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyLmlzV2VsbEZvcm1lZCgpXG4gIDogc3RyID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNoIG9mIHN0cikge1xuICAgICAgICAvKiBUaGUgc3RyaW5nIGl0ZXJhdG9yIGl0ZXJhdGVzIGJ5IFVuaWNvZGUgY29kZSBwb2ludCwgbm90Ki9cbiAgICAgICAgLyogVVRGMTYgY29kZSB1bml0LiBCdXQgaWYgaXQgZW5jb3VudGVycyBhbiB1bnBhaXJlZCBzdXJyb2dhdGUsKi9cbiAgICAgICAgLyogaXQgd2lsbCBwcm9kdWNlIGl0LiovXG4gICAgICAgIGNvbnN0IGNwID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChjaC5jb2RlUG9pbnRBdCgwKSk7XG4gICAgICAgIGlmIChjcCA+PSAweGQ4MDAgJiYgY3AgPD0gMHhkZmZmKSB7XG4gICAgICAgICAgLyogQWxsIHN1cnJvZ2F0ZXMgYXJlIGluIHRoaXMgcmFuZ2UuIFRoZSBzdHJpbmcgaXRlcmF0b3Igb25seSovXG4gICAgICAgICAgLyogcHJvZHVjZXMgYSBjaGFyYWN0ZXIgaW4gdGhpcyByYW5nZSBmb3IgdW5wYWlyZWQgc3Vycm9nYXRlcywqL1xuICAgICAgICAgIC8qIHdoaWNoIG9ubHkgaGFwcGVucyBpZiB0aGUgc3RyaW5nIGlzIG5vdCB3ZWxsLWZvcm1lZC4qL1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTskaM2PX29uY2UuaXNXZWxsRm9ybWVkU3RyaW5nKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oaXNXZWxsRm9ybWVkU3RyaW5nKTtcblxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGx5IHdoZW4gYGlzV2VsbEZvcm1lZFN0cmluZyhzdHIpYCB3b3VsZCByZXR1cm4gdHJ1ZS5cbiAqIFRocm93cyBhIGRpYWdub3N0aWMgZXJyb3Igd2hlbiBgaXNXZWxsRm9ybWVkU3RyaW5nKHN0cilgIHdvdWxkIHJldHVybiBmYWxzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHN0clxuICogQHJldHVybnMge2Fzc2VydHMgc3RyIGlzIHN0cmluZ31cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFdlbGxGb3JtZWRTdHJpbmcgPSBzdHIgPT4ge1xuICBpc1dlbGxGb3JtZWRTdHJpbmcoc3RyKSB8fCBGYWlsYEV4cGVjdGVkIHdlbGwtZm9ybWVkIHVuaWNvZGUgc3RyaW5nOiAke3N0cn1gO1xufTskaM2PX29uY2UuYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyhhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKTtcbmhhcmRlbihhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKTtcblxuY29uc3QgT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFID1cbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24oJ09OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRScsICdkaXNhYmxlZCcsIFtcbiAgICAnZW5hYmxlZCcsXG4gIF0pID09PSAnZW5hYmxlZCc7XG5cbi8qKlxuICogRm9yIG5vdyxcbiAqIGlmIGBPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEVgIGVudmlyb25tZW50IG9wdGlvbiBpcyBgJ2VuYWJsZWQnYCxcbiAqIHRoZW4gYGFzc2VydFBhc3NhYmxlU3RyaW5nYCBpcyB0aGUgc2FtZSBhcyBgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZ2AuXG4gKiBPdGhlcndpc2UgYGFzc2VydFBhc3NhYmxlU3RyaW5nYCBqdXN0IGFzc2VydHMgdGhhdCBgc3RyYCBpcyBhIHN0cmluZy5cbiAqXG4gKiBDdXJyZW50bHksIGBPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEVgIGRlZmF1bHRzIHRvIGAnZGlzYWJsZWQnYFxuICogYmVjYXVzZSB3ZSBkbyBub3QgeWV0IGtub3cgdGhlIHBlcmZvcm1hbmNlIGltcGFjdC4gTGF0ZXIsIGlmIHdlIGRlY2lkZSB3ZVxuICogY2FuIGFmZm9yZCBpdCwgd2UnbGwgZmlyc3QgY2hhbmdlIHRoZSBkZWZhdWx0IHRvIGAnZW5hYmxlZCdgIGFuZCB1bHRpbWF0ZWx5XG4gKiByZW1vdmUgdGhlIHN3aXRjaCBhbHRvZ2V0aGVyLiBCZSBwcmVwYXJlZCBmb3IgdGhlc2UgY2hhbmdlcy5cbiAqXG4gKiBUT0RPIG9uY2UgdGhlIHN3aXRjaCBpcyByZW1vdmVkLCBzaW1wbGlmeSBgYXNzZXJ0UGFzc2FibGVTdHJpbmdgIHRvXG4gKiBzaW1wbHkgYmUgYGFzc2VydFdlbGxGb3JtZWRTdHJpbmdgLlxuICpcbiAqIEBwYXJhbSB7IHVua25vd24gfSBzdHJcbiAqIEByZXR1cm5zIHthc3NlcnRzIHN0ciBpcyBzdHJpbmcgfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UGFzc2FibGVTdHJpbmcgPSBzdHIgPT4ge1xuICB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyB8fCBGYWlsYEV4cGVjdGVkIHN0cmluZyAke3N0cn1gO1xuICAhT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFIHx8IGFzc2VydFdlbGxGb3JtZWRTdHJpbmcoc3RyKTtcbn07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3RyaW5nKGFzc2VydFBhc3NhYmxlU3RyaW5nKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1dlbGxGb3JtZWRTdHJpbmciOlsiaXNXZWxsRm9ybWVkU3RyaW5nIl0sImFzc2VydFdlbGxGb3JtZWRTdHJpbmciOlsiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRQYXNzYWJsZVN0cmluZyI6WyJhc3NlcnRQYXNzYWJsZVN0cmluZyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAC9zQiwxQAAMMUAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3N5bWJvbC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJ1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qKlxuICogVGhlIHdlbGwga25vd24gc3ltYm9scyBhcmUgc3RhdGljIHN5bWJvbCB2YWx1ZXMgb24gdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yLlxuICovXG5jb25zdCB3ZWxsS25vd25TeW1ib2xOYW1lcyA9IG5ldyBNYXAoXG4gIG93bktleXMoU3ltYm9sKVxuICAgIC5maWx0ZXIoXG4gICAgICBuYW1lID0+IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgU3ltYm9sW25hbWVdID09PSAnc3ltYm9sJyxcbiAgICApXG4gICAgLmZpbHRlcihuYW1lID0+IHtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi9cbiAgICAgICFuYW1lLnN0YXJ0c1dpdGgoJ0BAJykgfHxcbiAgICAgICAgRmFpbGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgKX1gO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSlcbiAgICAvKiBAdHMtaWdub3JlIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovXG4gICAgLm1hcChuYW1lID0+IFtTeW1ib2xbbmFtZV0sIGBAQCR7bmFtZX1gXSksXG4pO1xuXG4vKipcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuXG4gKlxuICogQHBhcmFtIHthbnl9IHN5bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBpc1Bhc3NhYmxlU3ltYm9sID0gc3ltID0+XG4gIHR5cGVvZiBzeW0gPT09ICdzeW1ib2wnICYmXG4gICh0eXBlb2YgU3ltYm9sLmtleUZvcihzeW0pID09PSAnc3RyaW5nJyB8fCB3ZWxsS25vd25TeW1ib2xOYW1lcy5oYXMoc3ltKSk7JGjNj19vbmNlLmlzUGFzc2FibGVTeW1ib2woaXNQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oaXNQYXNzYWJsZVN5bWJvbCk7XG5cbiAgICAgICBjb25zdCBhc3NlcnRQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PlxuICBpc1Bhc3NhYmxlU3ltYm9sKHN5bSkgfHxcbiAgRmFpbGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZVN5bWJvbChhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuXG4vKipcbiAqIElmIGBzeW1gIGlzIGEgcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXNcbiAqIHN5bWJvbC4gSWYgYHN5bWAgaXMgYSBub24tcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy4gU2luY2UgdGhlIHJlZ2lzdHJhdGlvbiBzdHJpbmcgb2YgYSByZWdpc3RlcmVkIHN5bWJvbCBjYW4gYmUgYW55XG4gKiBzdHJpbmcsIGlmIHdlIHNpbXBseSB1c2VkIHRoYXQgdG8gaWRlbnRpZnkgdGhvc2Ugc3ltYm9scywgdGhlcmUgd291bGQgbm90XG4gKiBiZSBhbnkgcmVtYWluaW5nIHN0cmluZ3MgbGVmdCBvdmVyIHRvIGlkZW50aWZ5IHRoZSB3ZWxsLWtub3duIHN5bWJvbHMuXG4gKiBJbnN0ZWFkLCB3ZSByZXNlcnZlIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYFwiQEBcImAgZm9yIHB1cnBvc2VzIG9mIHRoaXNcbiAqIGVuY29kaW5nLiBXZSBpZGVudGlmeSBhIHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXMgYFN5bWJvbC5pdGVyYXRvcmBcbiAqIGJ5IHByZWZpeGluZyB0aGUgcHJvcGVydHkgbmFtZSB3aXRoIGBcIkBAXCJgLCBzdWNoIGFzIGBcIkBAaXRlcmF0b3JcImAuXG4gKiBGb3IgcmVnaXN0ZXJlZCBzeW1ib2xzIHdob3NlIG5hbWUgaGFwcGVucyB0byBiZWdpbiB3aXRoIGBcIkBAXCJgLCBzdWNoXG4gKiBhcyBgU3ltYm9sLmZvcignQEBpdGVyYXRvcicpYCBvciBgU3ltYm9sLmZvcignQEBmb28nKWAsIHdlIGlkZW50aWZ5XG4gKiB0aGVtIGJ5IHByZWZpeGluZyB0aGVtIHdpdGggYW4gZXh0cmEgYFwiQEBcImAsIHN1Y2ggYXNcbiAqIGBcIkBAQEBpdGVyYXRvclwiYCBvciBgXCJAQEBAZm9vXCJgLiAoVGhpcyBpcyB0aGUgSGlsYmVydCBIb3RlbCBlbmNvZGluZ1xuICogdGVjaG5pcXVlLilcbiAqXG4gKiBAcGFyYW0ge3N5bWJvbH0gc3ltXG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqL1xuICAgICAgIGNvbnN0IG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PiB7XG4gIGNvbnN0IG5hbWUgPSBTeW1ib2wua2V5Rm9yKHN5bSk7XG4gIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gIH1cbiAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSkge1xuICAgIHJldHVybiBgQEAke25hbWV9YDtcbiAgfVxuICByZXR1cm4gbmFtZTtcbn07JGjNj19vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuID0gL15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogSWYgYG5hbWVgIGlzIGEgc3RyaW5nIHRoYXQgY291bGQgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5XG4gKiBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCwgcmV0dXJuIHRoZSBzeW1ib2wgYXJndW1lbnQgaXQgd2FzIHByb2R1Y2VkIHRvXG4gKiByZXByZXNlbnQuXG4gKlxuICogICAgSWYgYG5hbWVgIGRvZXMgbm90IGJlZ2luIHdpdGggYFwiQEBcImAsIHRoZW4ganVzdCB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgICByZWdpc3RlcmVkIHN5bWJvbCwgYFN5bWJvbC5mb3IobmFtZSlgLlxuICogICAgSWYgYG5hbWVgIGlzIGBcIkBAXCJgIGZvbGxvd2VkIGJ5IGEgd2VsbCBrbm93biBzeW1ib2wncyBwcm9wZXJ0eSBuYW1lIG9uXG4gKiAgICAgIGBTeW1ib2xgIHN1Y2ggYFwiQEBpdGVyYXRvclwiLCByZXR1cm4gdGhhdCB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzXG4gKiAgICAgIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiAgICBJZiBgbmFtZWAgYmVnaW5zIHdpdGggYFwiQEBAQFwiYCBpdCBlbmNvZGVzIHRoZSByZWdpc3RlcmVkIHN5bWJvbCB3aG9zZVxuICogICAgICBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGluc3RlYWQuXG4gKiAgICBPdGhlcndpc2UsIGlmIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaXQgbWF5IGVuY29kZSBhIHJlZ2lzdGVyZWQgc3ltYm9sXG4gKiAgICAgIGZyb20gYSBmdXR1cmUgdmVyc2lvbiBvZiBKYXZhU2NyaXB0LCBidXQgaXQgaXMgbm90IG9uZSB3ZSBjYW4gZGVjb2RlXG4gKiAgICAgIHlldCwgc28gdGhyb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtzeW1ib2x9XG4gKi9cbiAgICAgICBjb25zdCBwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSBuYW1lID0+IHtcbiAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgRmFpbGAke3EobmFtZSl9IG11c3QgYmUgYSBzdHJpbmcsIG5vdCAke3EodHlwZW9mIG5hbWUpfWA7XG4gIGNvbnN0IG1hdGNoID0gQXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gbWF0Y2hbMV07XG4gICAgaWYgKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKSB7XG4gICAgICByZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzeW0gPSBTeW1ib2xbc3VmZml4XTtcbiAgICAgIGlmICh0eXBlb2Ygc3ltID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gc3ltO1xuICAgICAgfVxuICAgICAgRmFpbGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFN5bWJvbC5mb3IobmFtZSk7XG59OyRozY9fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7c3ltYm9sfVxuICovXG4gICAgICAgY29uc3QgdW5wYXNzYWJsZVN5bWJvbEZvck5hbWUgPSBuYW1lID0+IFN5bWJvbChuYW1lKTskaM2PX29uY2UudW5wYXNzYWJsZVN5bWJvbEZvck5hbWUodW5wYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZVN5bWJvbCI6WyJpc1Bhc3NhYmxlU3ltYm9sIl0sImFzc2VydFBhc3NhYmxlU3ltYm9sIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLCJ1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJ1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABcuFDZZAkAAGQJAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsZ2V0T3duRGF0YURlc2NyaXB0b3IsY2hlY2tQYXNzU3R5bGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja1RhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsWyRozY9fYSA9PiAoY2hlY2tQYXNzU3R5bGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NTdHlsZUhlbHBlcn0gZnJvbSAnLi9pbnRlcm5hbC10eXBlcy5qcydcbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgfSA9IE9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuICAgICAgIGNvbnN0IFRhZ2dlZEhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ3RhZ2dlZCcsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG4gICAgY2hlY2tQYXNzU3R5bGUoY2FuZGlkYXRlLCBjYW5kaWRhdGVbUEFTU19TVFlMRV0sICd0YWdnZWQnLCBjaGVjayksXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgY2hlY2tUYWdSZWNvcmQoY2FuZGlkYXRlLCAndGFnZ2VkJywgYXNzZXJ0Q2hlY2tlcik7XG5cbiAgICAvKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuICAgIGNvbnN0IHBhc3NTdHlsZUtleSA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKFBBU1NfU1RZTEUpO1xuICAgIGNvbnN0IHRhZ0tleSA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKFN5bWJvbC50b1N0cmluZ1RhZyk7XG4gICAgY29uc3Qge1xuICAgICAgLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuICAgICAgWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFzc1N0eWxlS2V5KV06IF9wYXNzU3R5bGVEZXNjLFxuICAgICAgWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAodGFnS2V5KV06IF9sYWJlbERlc2MsXG4gICAgICBwYXlsb2FkOiBfcGF5bG9hZERlc2MsIC8qIHZhbHVlIGNoZWNrZWQgYnkgcmVjdXJzaXZlIHdhbGsgYXQgdGhlIGVuZCovXG4gICAgICAuLi5yZXN0RGVzY3NcbiAgICB9ID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICAgIG93bktleXMocmVzdERlc2NzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgIEZhaWxgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuICAgIC8qIFZhbGlkYXRlIHRoYXQgdGhlICdwYXlsb2FkJyBwcm9wZXJ0eSBpcyBvd24vZGF0YS9lbnVtZXJhYmxlKi9cbiAgICAvKiBhbmQgaXRzIGFzc29jaWF0ZWQgdmFsdWUgaXMgcmVjdXJzaXZlbHkgcGFzc2FibGUuKi9cbiAgICBwYXNzU3R5bGVPZlJlY3VyKFxuICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCAncGF5bG9hZCcsIHRydWUsIGFzc2VydENoZWNrZXIpLnZhbHVlLFxuICAgICk7XG4gIH0sXG59KTskaM2PX29uY2UuVGFnZ2VkSGVscGVyKFRhZ2dlZEhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALddPVwmFgAAJhYAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyIsIi4vcGFzc1N0eWxlT2YuanMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0QXRvbSIsImFzc2VydEJ5dGVBcnJheSIsImFzc2VydENvcHlBcnJheSIsImFzc2VydFJlY29yZCIsImFzc2VydFJlbW90YWJsZSIsImlzQXRvbSIsImlzQnl0ZUFycmF5IiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLFgsaWRlbnRDaGVja2VyLHBhc3NTdHlsZU9mLGFzc2VydENoZWNrZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q29weUFycmF5LCBDb3B5UmVjb3JkLCBQYXNzYWJsZSwgUmVtb3RhYmxlT2JqZWN0LCBCeXRlQXJyYXksIENoZWNrZXIsIEF0b219IGZyb20gJy4vdHlwZXMuanMnXG4gKi9cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSBhcnJheSwgQUtBIGEgXCJjb3B5QXJyYXlcIlxuICogaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7YW55fSBhcnJcbiAqIEByZXR1cm5zIHthcnIgaXMgQ29weUFycmF5PGFueT59XG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlBcnJheSA9IGFyciA9PiBwYXNzU3R5bGVPZihhcnIpID09PSAnY29weUFycmF5JzskaM2PX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSBiaW5hcnkgZGF0YSwgQUtBIGEgXCJieXRlQXJyYXlcIlxuICogaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFyclxuICogQHJldHVybnMge2FyciBpcyBCeXRlQXJyYXl9XG4gKi9cbiAgICAgICBjb25zdCBpc0J5dGVBcnJheSA9IGFyciA9PiBwYXNzU3R5bGVPZihhcnIpID09PSAnYnl0ZUFycmF5JzskaM2PX29uY2UuaXNCeXRlQXJyYXkoaXNCeXRlQXJyYXkpO1xuaGFyZGVuKGlzQnl0ZUFycmF5KTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQsIEFLQSBhXG4gKiBcImNvcHlSZWNvcmRcIiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHthbnl9IHJlY29yZFxuICogQHJldHVybnMge3JlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbiAgICAgICBjb25zdCBpc1JlY29yZCA9IHJlY29yZCA9PiBwYXNzU3R5bGVPZihyZWNvcmQpID09PSAnY29weVJlY29yZCc7JGjNj19vbmNlLmlzUmVjb3JkKGlzUmVjb3JkKTtcbmhhcmRlbihpc1JlY29yZCk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSByZW1vdGFibGUuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7cmVtb3RhYmxlIGlzIFJlbW90YWJsZU9iamVjdH1cbiAqL1xuICAgICAgIGNvbnN0IGlzUmVtb3RhYmxlID0gcmVtb3RhYmxlID0+IHBhc3NTdHlsZU9mKHJlbW90YWJsZSkgPT09ICdyZW1vdGFibGUnOyRozY9fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBhcnJcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mQXJyYXlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFyciBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlBcnJheSA9IChhcnIsIG9wdE5hbWVPZkFycmF5ID0gJ0FsbGVnZWQgYXJyYXknKSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKGFycik7XG4gIHBhc3NTdHlsZSA9PT0gJ2NvcHlBcnJheScgfHxcbiAgICBGYWlsYCR7cShvcHROYW1lT2ZBcnJheSl9ICR7YXJyfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxuICAgICAgcGFzc1N0eWxlLFxuICAgICl9YDtcbn07JGjNj19vbmNlLmFzc2VydENvcHlBcnJheShhc3NlcnRDb3B5QXJyYXkpO1xuaGFyZGVuKGFzc2VydENvcHlBcnJheSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZkFycmF5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhcnIgaXMgQnl0ZUFycmF5fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0Qnl0ZUFycmF5ID0gKGFyciwgb3B0TmFtZU9mQXJyYXkgPSAnQWxsZWdlZCBieXRlQXJyYXknKSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKGFycik7XG4gIHBhc3NTdHlsZSA9PT0gJ2J5dGVBcnJheScgfHxcbiAgICBGYWlsYCR7cShcbiAgICAgIG9wdE5hbWVPZkFycmF5LFxuICAgICl9ICR7YXJyfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGJpbmFyeSBkYXRhLCBub3QgJHtxKHBhc3NTdHlsZSl9YDtcbn07JGjNj19vbmNlLmFzc2VydEJ5dGVBcnJheShhc3NlcnRCeXRlQXJyYXkpO1xuaGFyZGVuKGFzc2VydEJ5dGVBcnJheSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlY29yZFxuICogQHBhcmFtIHthbnl9IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZWNvcmRcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRSZWNvcmQgPSAocmVjb3JkLCBvcHROYW1lT2ZSZWNvcmQgPSAnQWxsZWdlZCByZWNvcmQnKSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHJlY29yZCk7XG4gIHBhc3NTdHlsZSA9PT0gJ2NvcHlSZWNvcmQnIHx8XG4gICAgRmFpbGAke3Eob3B0TmFtZU9mUmVjb3JkKX0gJHtyZWNvcmR9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBub3QgJHtxKFxuICAgICAgcGFzc1N0eWxlLFxuICAgICl9YDtcbn07JGjNj19vbmNlLmFzc2VydFJlY29yZChhc3NlcnRSZWNvcmQpO1xuaGFyZGVuKGFzc2VydFJlY29yZCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlbW90YWJsZVxuICogQHJldHVybnMge2Fzc2VydHMgcmVtb3RhYmxlIGlzIFJlbW90YWJsZU9iamVjdH1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFJlbW90YWJsZSA9IChcbiAgcmVtb3RhYmxlLFxuICBvcHROYW1lT2ZSZW1vdGFibGUgPSAnQWxsZWdlZCByZW1vdGFibGUnLFxuKSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHJlbW90YWJsZSk7XG4gIHBhc3NTdHlsZSA9PT0gJ3JlbW90YWJsZScgfHxcbiAgICBGYWlsYCR7cShvcHROYW1lT2ZSZW1vdGFibGUpfSAke3JlbW90YWJsZX0gbXVzdCBiZSBhIHJlbW90YWJsZSwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRSZW1vdGFibGUoYXNzZXJ0UmVtb3RhYmxlKTtcbmhhcmRlbihhc3NlcnRSZW1vdGFibGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWwgTm90IG5lY2Vzc2FyaWx5IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7dmFsIGlzIEF0b219XG4gKi9cbmNvbnN0IGNoZWNrQXRvbSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGxldCBwYXNzU3R5bGU7XG4gIHRyeSB7XG4gICAgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YodmFsKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoZWNrICE9PSBpZGVudENoZWNrZXIgJiZcbiAgICAgIGNoZWNrKGZhbHNlLCBYYE5vdCBldmVuIFBhc3NhYmxlOiAke3EoZXJyKX06ICR7dmFsfWApXG4gICAgKTtcbiAgfVxuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgY2FzZSAnbnVsbCc6XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdiaWdpbnQnOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnYnl0ZUFycmF5JzpcbiAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAvKiBUaGUgQXRvbVN0eWxlIGNhc2VzKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICAvKiBUaGUgb3RoZXIgUGFzc1N0eWxlIGNhc2VzKi9cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrICE9PSBpZGVudENoZWNrZXIgJiZcbiAgICAgICAgY2hlY2soZmFsc2UsIFhgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGFuIGF0b206ICR7dmFsfWApXG4gICAgICApO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7dmFsIGlzIEF0b219XG4gKi9cbiAgICAgICBjb25zdCBpc0F0b20gPSB2YWwgPT4gY2hlY2tBdG9tKHZhbCwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNBdG9tKGlzQXRvbSk7XG5oYXJkZW4oaXNBdG9tKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbCBpcyBBdG9tfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0QXRvbSA9IHZhbCA9PiB7XG4gIGNoZWNrQXRvbSh2YWwsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0QXRvbShhc3NlcnRBdG9tKTtcbmhhcmRlbihhc3NlcnRBdG9tKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzQnl0ZUFycmF5IjpbImlzQnl0ZUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0Qnl0ZUFycmF5IjpbImFzc2VydEJ5dGVBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXSwiaXNBdG9tIjpbImlzQXRvbSJdLCJhc3NlcnRBdG9tIjpbImFzc2VydEF0b20iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1TZLc7w4AAO8OAAAeAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiLCIuL3NyYy9rZXlzL2NvcHlTZXQuanMiLCIuL3NyYy9rZXlzL2NvcHlCYWcuanMiLCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiYmFnVW5pb24iLCJiYWdVbmlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciIsInNldENvbXBhcmUiLCJzZXRDb21wYXJlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2tleXMvY2hlY2tLZXkuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29weVNldC5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5QmFnLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIjpbWyJpc0tleSIsImlzS2V5Il0sWyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiXSxbImFzc2VydFNjYWxhcktleSIsImFzc2VydFNjYWxhcktleSJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il0sWyJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0Q29weVNldCJdLFsibWFrZUNvcHlTZXQiLCJtYWtlQ29weVNldCJdLFsiZ2V0Q29weVNldEtleXMiLCJnZXRDb3B5U2V0S2V5cyJdLFsiaXNDb3B5QmFnIiwiaXNDb3B5QmFnIl0sWyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weUJhZyJdLFsibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZyJdLFsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLFsiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5QmFnRW50cmllcyJdLFsiaXNDb3B5TWFwIiwiaXNDb3B5TWFwIl0sWyJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weU1hcCJdLFsibWFrZUNvcHlNYXAiLCJtYWtlQ29weU1hcCJdLFsiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIjpbWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdXSwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjpbWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXV0sIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOltbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSJdLFsiY29tcGFyZUtleXMiLCJjb21wYXJlS2V5cyJdLFsia2V5TFQiLCJrZXlMVCJdLFsia2V5TFRFIiwia2V5TFRFIl0sWyJrZXlFUSIsImtleUVRIl0sWyJrZXlHVEUiLCJrZXlHVEUiXSxbImtleUdUIiwia2V5R1QiXV0sIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyI6W1siZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOltbImJhZ0lzU3VwZXJiYWciLCJiYWdJc1N1cGVyYmFnIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOltbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJtdXN0TWF0Y2giLCJtdXN0TWF0Y2giXSxbImlzQXdhaXRBcmdHdWFyZCIsImlzQXdhaXRBcmdHdWFyZCJdLFsiYXNzZXJ0QXdhaXRBcmdHdWFyZCIsImFzc2VydEF3YWl0QXJnR3VhcmQiXSxbImlzUmF3R3VhcmQiLCJpc1Jhd0d1YXJkIl0sWyJhc3NlcnRSYXdHdWFyZCIsImFzc2VydFJhd0d1YXJkIl0sWyJhc3NlcnRNZXRob2RHdWFyZCIsImFzc2VydE1ldGhvZEd1YXJkIl0sWyJhc3NlcnRJbnRlcmZhY2VHdWFyZCIsImFzc2VydEludGVyZmFjZUd1YXJkIl0sWyJraW5kT2YiLCJraW5kT2YiXSxbImNvbnRhaW5lckhhc1NwbGl0IiwiY29udGFpbmVySGFzU3BsaXQiXV0sIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiOltbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIiwiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiXSxbImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLFsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl0sWyJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIiwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdXSwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6W1sibGlzdERpZmZlcmVuY2UiLCJsaXN0RGlmZmVyZW5jZSJdXSwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOltbIm9iamVjdE1hcCIsIm9iamVjdE1hcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqiED6QtIAAALSAAAKgAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jaGVja0tleS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiLi9jb3B5U2V0LmpzIiwiLi9jb3B5QmFnLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUJhZyIsImFzc2VydENvcHlNYXAiLCJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0S2V5IiwiYXNzZXJ0U2NhbGFyS2V5IiwiY2hlY2tDb3B5QmFnIiwiY2hlY2tDb3B5TWFwIiwiY2hlY2tDb3B5U2V0IiwiY2hlY2tLZXkiLCJjaGVja1NjYWxhcktleSIsImNvcHlNYXBLZXlTZXQiLCJldmVyeUNvcHlCYWdFbnRyeSIsImV2ZXJ5Q29weU1hcEtleSIsImV2ZXJ5Q29weU1hcFZhbHVlIiwiZXZlcnlDb3B5U2V0S2V5IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyeUFycmF5IiwiZ2V0Q29weU1hcEtleXMiLCJnZXRDb3B5TWFwVmFsdWVzIiwiZ2V0Q29weVNldEtleXMiLCJpc0NvcHlCYWciLCJpc0NvcHlNYXAiLCJpc0NvcHlTZXQiLCJpc0tleSIsImlzU2NhbGFyS2V5IiwibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHEsRmFpbCxpZGVudENoZWNrZXIsYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaXNBdG9tLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGNoZWNrRWxlbWVudHMsbWFrZVNldE9mRWxlbWVudHMsY2hlY2tCYWdFbnRyaWVzLG1ha2VCYWdPZkVudHJpZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0F0b21cIixbJGjNj19hID0+IChpc0F0b20gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiY2hlY2tFbGVtZW50c1wiLFskaM2PX2EgPT4gKGNoZWNrRWxlbWVudHMgPSAkaM2PX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIixbJGjNj19hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRozY9fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiY2hlY2tCYWdFbnRyaWVzXCIsWyRozY9fYSA9PiAoY2hlY2tCYWdFbnRyaWVzID0gJGjNj19hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIixbJGjNj19hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGUsIEF0b20sIENoZWNrZXJ9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKiBAaW1wb3J0IHtDb3B5QmFnLCBDb3B5TWFwLCBDb3B5U2V0LCBLZXksIFNjYWxhcktleX0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vIEF0b20gYW5kIFNjYWxhciBrZXlzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrU2NhbGFyS2V5ID0gKHZhbCwgY2hlY2spID0+IHtcbiAgaWYgKGlzQXRvbSh2YWwpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YodmFsKTtcbiAgaWYgKHBhc3NTdHlsZSA9PT0gJ3JlbW90YWJsZScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEgc2NhbGFyIGtleTogJHt2YWx9YCk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHt2YWwgaXMgU2NhbGFyS2V5fVxuICovJGjNj19vbmNlLmNoZWNrU2NhbGFyS2V5KGNoZWNrU2NhbGFyS2V5KTtcbiAgICAgICBjb25zdCBpc1NjYWxhcktleSA9IHZhbCA9PiBjaGVja1NjYWxhcktleSh2YWwsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzU2NhbGFyS2V5KGlzU2NhbGFyS2V5KTtcbmhhcmRlbihpc1NjYWxhcktleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWwgaXMgU2NhbGFyS2V5fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0U2NhbGFyS2V5ID0gdmFsID0+IHtcbiAgY2hlY2tTY2FsYXJLZXkodmFsLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydFNjYWxhcktleShhc3NlcnRTY2FsYXJLZXkpO1xuaGFyZGVuKGFzc2VydFNjYWxhcktleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogQHRzLWV4cGVjdC1lcnJvciBLZXkgZG9lcyBub3Qgc2F0aXNmeSBXZWFrS2V5Ki9cbi8qKiBAdHlwZSB7V2Vha1NldDxLZXk+fSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBLZXkgZG9lcyBub3Qgc2F0aXNmeSBXZWFrS2V5Ki9cbmNvbnN0IGtleU1lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrS2V5ID0gKHZhbCwgY2hlY2spID0+IHtcbiAgaWYgKGlzQXRvbSh2YWwpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gIGlmIChrZXlNZW1vLmhhcyh2YWwpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tLZXlJbnRlcm5hbCh2YWwsIGNoZWNrKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIC8qIERvbid0IGNhY2hlIHRoZSB1bmRlZmluZWQgY2FzZXMsIHNvIHRoYXQgaWYgaXQgaXMgdHJpZWQgYWdhaW4qL1xuICAgIC8qIHdpdGggYGFzc2VydENoZWNrZXJgIGl0J2xsIHRocm93IGEgZGlhZ25vc3RpYyBhZ2FpbiovXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAga2V5TWVtby5hZGQodmFsKTtcbiAgfVxuICAvKiBOb3RlIHRoYXQgd2UgZG8gbm90IG1lbW9pemUgYSBuZWdhdGl2ZSBqdWRnZW1lbnQsIHNvIHRoYXQgaWYgaXQgaXMgdHJpZWQqL1xuICAvKiBhZ2FpbiB3aXRoIGEgY2hlY2tlciwgaXQgd2lsbCBzdGlsbCBwcm9kdWNlIGEgdXNlZnVsIGRpYWdub3N0aWMuKi9cbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmNoZWNrS2V5KGNoZWNrS2V5KTtcbmhhcmRlbihjaGVja0tleSk7XG5cbi8qKlxuICogQHR5cGUge3tcbiAqICAgKHZhbDogUGFzc2FibGUpOiB2YWwgaXMgS2V5O1xuICogICAodmFsOiBhbnkpOiBib29sZWFuO1xuICogfX1cbiAqL1xuICAgICAgIGNvbnN0IGlzS2V5ID0gdmFsID0+IGNoZWNrS2V5KHZhbCwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNLZXkoaXNLZXkpO1xuaGFyZGVuKGlzS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge0tleX0gdmFsXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWwgaXMgS2V5fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0S2V5ID0gdmFsID0+IHtcbiAgY2hlY2tLZXkodmFsLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEtleShhc3NlcnRLZXkpO1xuaGFyZGVuKGFzc2VydEtleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weVNldCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5U2V0IGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weVNldD59ICovXG5jb25zdCBjb3B5U2V0TWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tDb3B5U2V0ID0gKHMsIGNoZWNrKSA9PiB7XG4gIGlmIChjb3B5U2V0TWVtby5oYXMocykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCByZXN1bHQgPVxuICAgICgocGFzc1N0eWxlT2YocykgPT09ICd0YWdnZWQnICYmIGdldFRhZyhzKSA9PT0gJ2NvcHlTZXQnKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgTm90IGEgY29weVNldDogJHtzfWApKSAmJlxuICAgIGNoZWNrRWxlbWVudHMocy5wYXlsb2FkLCBjaGVjaykgJiZcbiAgICBjaGVja0tleShzLnBheWxvYWQsIGNoZWNrKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvcHlTZXRNZW1vLmFkZChzKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UuY2hlY2tDb3B5U2V0KGNoZWNrQ29weVNldCk7XG5oYXJkZW4oY2hlY2tDb3B5U2V0KTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc1xuICogQHJldHVybnMge3MgaXMgQ29weVNldH1cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weVNldCA9IHMgPT4gY2hlY2tDb3B5U2V0KHMsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuaGFyZGVuKGlzQ29weVNldCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHMgaXMgQ29weVNldH1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlTZXR9ICovXG4gICAgICAgY29uc3QgYXNzZXJ0Q29weVNldCA9IHMgPT4ge1xuICBjaGVja0NvcHlTZXQocywgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRDb3B5U2V0KGFzc2VydENvcHlTZXQpO1xuaGFyZGVuKGFzc2VydENvcHlTZXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5U2V0S2V5cyA9IHMgPT4ge1xuICBhc3NlcnRDb3B5U2V0KHMpO1xuICByZXR1cm4gcy5wYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0Q29weVNldEtleXMoZ2V0Q29weVNldEtleXMpO1xuaGFyZGVuKGdldENvcHlTZXRLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcGFyYW0geyhrZXk6IEssIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGV2ZXJ5Q29weVNldEtleSA9IChzLCBmbikgPT5cbiAgZ2V0Q29weVNldEtleXMocykuZXZlcnkoKGtleSwgaW5kZXgpID0+IGZuKGtleSwgaW5kZXgpKTskaM2PX29uY2UuZXZlcnlDb3B5U2V0S2V5KGV2ZXJ5Q29weVNldEtleSk7XG5oYXJkZW4oZXZlcnlDb3B5U2V0S2V5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUNvcHlTZXQgPSBlbGVtZW50SXRlciA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VTZXRPZkVsZW1lbnRzKGVsZW1lbnRJdGVyKTtcbiAgYXNzZXJ0Q29weVNldChyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubWFrZUNvcHlTZXQobWFrZUNvcHlTZXQpO1xuaGFyZGVuKG1ha2VDb3B5U2V0KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5QmFnIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlCYWcgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5QmFnPn0gKi9cbmNvbnN0IGNvcHlCYWdNZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gYlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja0NvcHlCYWcgPSAoYiwgY2hlY2spID0+IHtcbiAgaWYgKGNvcHlCYWdNZW1vLmhhcyhiKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgKChwYXNzU3R5bGVPZihiKSA9PT0gJ3RhZ2dlZCcgJiYgZ2V0VGFnKGIpID09PSAnY29weUJhZycpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBOb3QgYSBjb3B5QmFnOiAke2J9YCkpICYmXG4gICAgY2hlY2tCYWdFbnRyaWVzKGIucGF5bG9hZCwgY2hlY2spICYmXG4gICAgY2hlY2tLZXkoYi5wYXlsb2FkLCBjaGVjayk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBjb3B5QmFnTWVtby5hZGQoYik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmNoZWNrQ29weUJhZyhjaGVja0NvcHlCYWcpO1xuaGFyZGVuKGNoZWNrQ29weUJhZyk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGJcbiAqIEByZXR1cm5zIHtiIGlzIENvcHlCYWd9XG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlCYWcgPSBiID0+IGNoZWNrQ29weUJhZyhiLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0NvcHlCYWcoaXNDb3B5QmFnKTtcbmhhcmRlbihpc0NvcHlCYWcpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5QmFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiIGlzIENvcHlCYWd9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5QmFnfSAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlCYWcgPSBiID0+IHtcbiAgY2hlY2tDb3B5QmFnKGIsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weUJhZyhhc3NlcnRDb3B5QmFnKTtcbmhhcmRlbihhc3NlcnRDb3B5QmFnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtDb3B5QmFnPEs+fSBiXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPlsncGF5bG9hZCddfVxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weUJhZ0VudHJpZXMgPSBiID0+IHtcbiAgYXNzZXJ0Q29weUJhZyhiKTtcbiAgcmV0dXJuIGIucGF5bG9hZDtcbn07JGjNj19vbmNlLmdldENvcHlCYWdFbnRyaWVzKGdldENvcHlCYWdFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5QmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHBhcmFtIHsoZW50cnk6IFtLLCBiaWdpbnRdLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlCYWdFbnRyeSA9IChiLCBmbikgPT5cbiAgZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LCBpbmRleCkgPT4gZm4oZW50cnksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weUJhZ0VudHJ5KGV2ZXJ5Q29weUJhZ0VudHJ5KTtcbmhhcmRlbihldmVyeUNvcHlCYWdFbnRyeSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weUJhZyA9IGJhZ0VudHJ5SXRlciA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VCYWdPZkVudHJpZXMoYmFnRW50cnlJdGVyKTtcbiAgYXNzZXJ0Q29weUJhZyhyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubWFrZUNvcHlCYWcobWFrZUNvcHlCYWcpO1xuaGFyZGVuKG1ha2VDb3B5QmFnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUNvcHlCYWdGcm9tRWxlbWVudHMgPSBlbGVtZW50SXRlciA9PiB7XG4gIC8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4gIC8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbiAgY29uc3QgZnVsbENvbXBhcmUgPSBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuICBjb25zdCBzb3J0ZWQgPSBzb3J0QnlSYW5rKGVsZW1lbnRJdGVyLCBmdWxsQ29tcGFyZSk7XG4gIC8qKiBAdHlwZSB7W0ssYmlnaW50XVtdfSAqL1xuICBjb25zdCBlbnRyaWVzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkLmxlbmd0aDsgKSB7XG4gICAgY29uc3QgayA9IHNvcnRlZFtpXTtcbiAgICBsZXQgaiA9IGkgKyAxO1xuICAgIHdoaWxlIChqIDwgc29ydGVkLmxlbmd0aCAmJiBmdWxsQ29tcGFyZShrLCBzb3J0ZWRbal0pID09PSAwKSB7XG4gICAgICBqICs9IDE7XG4gICAgfVxuICAgIGVudHJpZXMucHVzaChbaywgQmlnSW50KGogLSBpKV0pO1xuICAgIGkgPSBqO1xuICB9XG4gIHJldHVybiBtYWtlQ29weUJhZyhlbnRyaWVzKTtcbn07JGjNj19vbmNlLm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcbmhhcmRlbihtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weU1hcCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5TWFwJ3Mga2V5cyBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PENvcHlNYXA+fSAqL1xuY29uc3QgY29weU1hcE1lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBtXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrQ29weU1hcCA9IChtLCBjaGVjaykgPT4ge1xuICBpZiAoY29weU1hcE1lbW8uaGFzKG0pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCEocGFzc1N0eWxlT2YobSkgPT09ICd0YWdnZWQnICYmIGdldFRhZyhtKSA9PT0gJ2NvcHlNYXAnKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBOb3QgYSBjb3B5TWFwOiAke219YCk7XG4gIH1cbiAgY29uc3QgeyBwYXlsb2FkIH0gPSBtO1xuICBpZiAocGFzc1N0eWxlT2YocGF5bG9hZCkgIT09ICdjb3B5UmVjb3JkJykge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3QgYmUgYSByZWNvcmQ6ICR7bX1gKTtcbiAgfVxuICBjb25zdCB7IGtleXMsIHZhbHVlcywgLi4ucmVzdCB9ID0gcGF5bG9hZDtcbiAgY29uc3QgcmVzdWx0ID1cbiAgICAob3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3Qgb25seSBoYXZlIC5rZXlzIGFuZCAudmFsdWVzOiAke219YCxcbiAgICAgICkpICYmXG4gICAgY2hlY2tFbGVtZW50cyhrZXlzLCBjaGVjaykgJiZcbiAgICBjaGVja0tleShrZXlzLCBjaGVjaykgJiZcbiAgICAocGFzc1N0eWxlT2YodmFsdWVzKSA9PT0gJ2NvcHlBcnJheScgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgY29weU1hcCdzIC52YWx1ZXMgbXVzdCBiZSBhIGNvcHlBcnJheTogJHttfWApKSAmJlxuICAgIChrZXlzLmxlbmd0aCA9PT0gdmFsdWVzLmxlbmd0aCB8fFxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEEgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGtleXMgYW5kIHZhbHVlczogJHttfWAsXG4gICAgICApKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvcHlNYXBNZW1vLmFkZChtKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UuY2hlY2tDb3B5TWFwKGNoZWNrQ29weU1hcCk7XG5oYXJkZW4oY2hlY2tDb3B5TWFwKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gbVxuICogQHJldHVybnMge20gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weU1hcCA9IG0gPT4gY2hlY2tDb3B5TWFwKG0sIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuaGFyZGVuKGlzQ29weU1hcCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbVxuICogQHJldHVybnMge2Fzc2VydHMgbSBpcyBDb3B5TWFwPEtleSwgUGFzc2FibGU+fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0Q29weU1hcCA9IG0gPT4ge1xuICBjaGVja0NvcHlNYXAobSwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRDb3B5TWFwKGFzc2VydENvcHlNYXApO1xuaGFyZGVuKGFzc2VydENvcHlNYXApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0tbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlNYXBLZXlzID0gbSA9PiB7XG4gIGFzc2VydENvcHlNYXAobSk7XG4gIHJldHVybiBtLnBheWxvYWQua2V5cztcbn07JGjNj19vbmNlLmdldENvcHlNYXBLZXlzKGdldENvcHlNYXBLZXlzKTtcbmhhcmRlbihnZXRDb3B5TWFwS2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7VltdfVxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcFZhbHVlcyA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICByZXR1cm4gbS5wYXlsb2FkLnZhbHVlcztcbn07JGjNj19vbmNlLmdldENvcHlNYXBWYWx1ZXMoZ2V0Q29weU1hcFZhbHVlcyk7XG5oYXJkZW4oZ2V0Q29weU1hcFZhbHVlcyk7XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhIENvcHlNYXAncyBlbnRyaWVzIGluIHN0b3JhZ2Ugb3JkZXIuXG4gKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7QXJyYXk8W0ssVl0+fVxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcEVudHJ5QXJyYXkgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgY29uc3Qge1xuICAgIHBheWxvYWQ6IHsga2V5cywgdmFsdWVzIH0sXG4gIH0gPSBtO1xuICByZXR1cm4gaGFyZGVuKGtleXMubWFwKChrZXksIGkpID0+IFtrZXksIHZhbHVlc1tpXV0pKTtcbn07JGjNj19vbmNlLmdldENvcHlNYXBFbnRyeUFycmF5KGdldENvcHlNYXBFbnRyeUFycmF5KTtcbmhhcmRlbihnZXRDb3B5TWFwRW50cnlBcnJheSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W0ssVl0+fVxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcEVudHJpZXMgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgY29uc3Qge1xuICAgIHBheWxvYWQ6IHsga2V5cywgdmFsdWVzIH0sXG4gIH0gPSBtO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8gKGtleXMpO1xuICByZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIC8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8W0ssVl0sdm9pZD59ICovXG4gICAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBba2V5c1tpXSwgdmFsdWVzW2ldXSB9KTtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLmdldENvcHlNYXBFbnRyaWVzKGdldENvcHlNYXBFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcGFyYW0geyhrZXk6IEssIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGV2ZXJ5Q29weU1hcEtleSA9IChtLCBmbikgPT5cbiAgZ2V0Q29weU1hcEtleXMobSkuZXZlcnkoKGtleSwgaW5kZXgpID0+IGZuKGtleSwgaW5kZXgpKTskaM2PX29uY2UuZXZlcnlDb3B5TWFwS2V5KGV2ZXJ5Q29weU1hcEtleSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwS2V5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEBwYXJhbSB7KHZhbHVlOiBWLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlNYXBWYWx1ZSA9IChtLCBmbikgPT5cbiAgZ2V0Q29weU1hcFZhbHVlcyhtKS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBmbih2YWx1ZSwgaW5kZXgpKTskaM2PX29uY2UuZXZlcnlDb3B5TWFwVmFsdWUoZXZlcnlDb3B5TWFwVmFsdWUpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcFZhbHVlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG4gICAgICAgY29uc3QgY29weU1hcEtleVNldCA9IG0gPT5cbiAgLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUgYWxyZWFkeSBpbiB0aGUgaW50ZXJuYWwgZm9ybSB1c2VkIGJ5IGNvcHlTZXRzLiovXG4gIG1ha2VUYWdnZWQoJ2NvcHlTZXQnLCBtLnBheWxvYWQua2V5cyk7JGjNj19vbmNlLmNvcHlNYXBLZXlTZXQoY29weU1hcEtleVNldCk7XG5oYXJkZW4oY29weU1hcEtleVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIFZdPn0gZW50cmllc1xuICogQHJldHVybnMge0NvcHlNYXA8SyxWPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb3B5TWFwID0gZW50cmllcyA9PiB7XG4gIC8qIFRoaXMgaXMgd2VpcmQsIGJ1dCByZXZlcnNlIHJhbmsgc29ydGluZyB0aGUgZW50cmllcyBpcyBhIGdvb2QgZmlyc3Qgc3RlcCovXG4gIC8qIGZvciBnZXR0aW5nIHRoZSByYW5rIHNvcnRlZCBrZXlzIHRvZ2V0aGVyIHdpdGggdGhlIHZhbHVlcyovXG4gIC8qIG9yZ2FuaXplZCBieSB0aG9zZSBrZXlzLiBBbHNvLCBhbW9uZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoKi9cbiAgLyoga2V5cyBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzcywgdGhvc2UgYXJlIHJhbmsgc29ydGVkLiovXG4gIC8qIFRPRE8gVGhpcyovXG4gIC8qIGNvdWxkIHNvbHZlIHRoZSBjb3B5TWFwIGNvdmVyIGlzc3VlIGV4cGxhaW5lZCBpbiBwYXR0ZXJuTWF0Y2hlcnMuanMuKi9cbiAgLyogQnV0IG9ubHkgaWYgd2UgaW5jbHVkZSB0aGlzIGNyaXRlcmlhIGluIG91ciB2YWxpZGF0aW9uIG9mIGNvcHlNYXBzLCovXG4gIC8qIHdoaWNoIHdlIGN1cnJlbnRseSBkbyBub3QuKi9cbiAgY29uc3Qgc29ydGVkRW50cmllcyA9IHNvcnRCeVJhbmsoZW50cmllcywgY29tcGFyZUFudGlSYW5rKTtcbiAgY29uc3Qga2V5cyA9IHNvcnRlZEVudHJpZXMubWFwKChbaywgX3ZdKSA9PiBrKTtcbiAgY29uc3QgdmFsdWVzID0gc29ydGVkRW50cmllcy5tYXAoKFtfaywgdl0pID0+IHYpO1xuICBjb25zdCByZXN1bHQgPSBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgeyBrZXlzLCB2YWx1ZXMgfSk7XG4gIGFzc2VydENvcHlNYXAocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLm1ha2VDb3B5TWFwKG1ha2VDb3B5TWFwKTtcbmhhcmRlbihtYWtlQ29weU1hcCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIFJlY3VyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBgY2hlY2tLZXlJbnRlcm5hbGAgaXMgb25seSBjYWxsZWQgaWYgYHZhbGAgaXMgUGFzc2FibGUgYnV0IGlzIG5vdCBhbiBBdG9tLlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0tleUludGVybmFsID0gKHZhbCwgY2hlY2spID0+IHtcbiAgY29uc3QgY2hlY2tJdCA9IGNoaWxkID0+IGNoZWNrS2V5KGNoaWxkLCBjaGVjayk7XG5cbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YodmFsKTtcbiAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAvKiBBIHJlbW90YWJsZSBpcyBhIFNjYWxhcktleSBidXQgbm90IGFuIEF0b20sIHNvIHdlIHBpY2sgaXQgdXAgaGVyZS4qL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAvKiBBIGNvcHlSZWNvcmQgaXMgYSBrZXkgaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlIGtleXMqL1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModmFsKS5ldmVyeShjaGVja0l0KTtcbiAgICB9XG4gICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgLyogQSBjb3B5QXJyYXkgaXMgYSBrZXkgaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlIGtleXMqL1xuICAgICAgcmV0dXJuIHZhbC5ldmVyeShjaGVja0l0KTtcbiAgICB9XG4gICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHZhbCk7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgIHJldHVybiBjaGVja0NvcHlTZXQodmFsLCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tDb3B5QmFnKHZhbCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNoZWNrQ29weU1hcCh2YWwsIGNoZWNrKSAmJlxuICAgICAgICAgICAgLyogRm9yIGEgY29weU1hcCB0byBiZSBhIGtleSwgYWxsIGl0cyBrZXlzIGFuZCB2YWx1ZXMgbXVzdCovXG4gICAgICAgICAgICAvKiBiZSBrZXlzLiBLZXlzIGFscmVhZHkgY2hlY2tlZCBieSBgY2hlY2tDb3B5TWFwYCBzaW5jZSovXG4gICAgICAgICAgICAvKiB0aGF0J3MgYSBjb3B5TWFwIHJlcXVpcmVtZW50IGluIGdlbmVyYWwuKi9cbiAgICAgICAgICAgIGV2ZXJ5Q29weU1hcFZhbHVlKHZhbCwgY2hlY2tJdClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY2hlY2sgIT09IGlkZW50Q2hlY2tlciAmJlxuICAgICAgICAgICAgY2hlY2soZmFsc2UsIFhgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHt2YWx9YClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNhc2UgJ2Vycm9yJzpcbiAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIGtleWApO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICAvKiBVbmV4cGVjdGVkIHRhZ3MgYXJlIGp1c3Qgbm9uLWtleXMsIGJ1dCBhbiB1bmV4cGVjdGVkIHBhc3NTdHlsZSovXG4gICAgICAvKiBpcyBhbHdheXMgYW4gZXJyb3IuKi9cbiAgICAgIHRocm93IEZhaWxgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3ZhbH1gO1xuICAgIH1cbiAgfVxufTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNoZWNrU2NhbGFyS2V5IjpbImNoZWNrU2NhbGFyS2V5Il0sImlzU2NhbGFyS2V5IjpbImlzU2NhbGFyS2V5Il0sImFzc2VydFNjYWxhcktleSI6WyJhc3NlcnRTY2FsYXJLZXkiXSwiY2hlY2tLZXkiOlsiY2hlY2tLZXkiXSwiaXNLZXkiOlsiaXNLZXkiXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSJdLCJjaGVja0NvcHlTZXQiOlsiY2hlY2tDb3B5U2V0Il0sImlzQ29weVNldCI6WyJpc0NvcHlTZXQiXSwiYXNzZXJ0Q29weVNldCI6WyJhc3NlcnRDb3B5U2V0Il0sImdldENvcHlTZXRLZXlzIjpbImdldENvcHlTZXRLZXlzIl0sImV2ZXJ5Q29weVNldEtleSI6WyJldmVyeUNvcHlTZXRLZXkiXSwibWFrZUNvcHlTZXQiOlsibWFrZUNvcHlTZXQiXSwiY2hlY2tDb3B5QmFnIjpbImNoZWNrQ29weUJhZyJdLCJpc0NvcHlCYWciOlsiaXNDb3B5QmFnIl0sImFzc2VydENvcHlCYWciOlsiYXNzZXJ0Q29weUJhZyJdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyJdLCJldmVyeUNvcHlCYWdFbnRyeSI6WyJldmVyeUNvcHlCYWdFbnRyeSJdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyJdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLCJjaGVja0NvcHlNYXAiOlsiY2hlY2tDb3B5TWFwIl0sImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiXSwiYXNzZXJ0Q29weU1hcCI6WyJhc3NlcnRDb3B5TWFwIl0sImdldENvcHlNYXBLZXlzIjpbImdldENvcHlNYXBLZXlzIl0sImdldENvcHlNYXBWYWx1ZXMiOlsiZ2V0Q29weU1hcFZhbHVlcyJdLCJnZXRDb3B5TWFwRW50cnlBcnJheSI6WyJnZXRDb3B5TWFwRW50cnlBcnJheSJdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyJdLCJldmVyeUNvcHlNYXBLZXkiOlsiZXZlcnlDb3B5TWFwS2V5Il0sImV2ZXJ5Q29weU1hcFZhbHVlIjpbImV2ZXJ5Q29weU1hcFZhbHVlIl0sImNvcHlNYXBLZXlTZXQiOlsiY29weU1hcEtleVNldCJdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD/2yuQPygAAD8oAAAtAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NoZWNrS2V5LmpzIiwiLi9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyJdLCJleHBvcnRzIjpbImJhZ0NvbXBhcmUiLCJjb21wYXJlS2V5cyIsImtleUVRIiwia2V5R1QiLCJrZXlHVEUiLCJrZXlMVCIsImtleUxURSIsInNldENvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixnZXRUYWcsY29tcGFyZU51bWVyaWNzLGNvbXBhcmVSYW5rLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyxxLEZhaWwsYXNzZXJ0S2V5LGdldENvcHlCYWdFbnRyaWVzLGdldENvcHlNYXBFbnRyeUFycmF5LGdldENvcHlTZXRLZXlzLG1ha2VDb21wYXJlQ29sbGVjdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImNvbXBhcmVOdW1lcmljc1wiLFskaM2PX2EgPT4gKGNvbXBhcmVOdW1lcmljcyA9ICRozY9fYSldXSxbXCJjb21wYXJlUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dLFtcInJlY29yZE5hbWVzXCIsWyRozY9fYSA9PiAocmVjb3JkTmFtZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsWyRozY9fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLFskaM2PX2EgPT4gKGFzc2VydEtleSA9ICRozY9fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlCYWdFbnRyaWVzID0gJGjNj19hKV1dLFtcImdldENvcHlNYXBFbnRyeUFycmF5XCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJ5QXJyYXkgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIixbJGjNj19hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRozY9fYSldXV1dLFtcIi4va2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanNcIiwgW1tcIm1ha2VDb21wYXJlQ29sbGVjdGlvblwiLFskaM2PX2EgPT4gKG1ha2VDb21wYXJlQ29sbGVjdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7Q29weVNldCwgS2V5LCBLZXlDb21wYXJlfSBmcm9tICcuLi90eXBlcy5qcycgKi9cblxuLyoqXG4gKiBDb3B5U2V0IFggaXMgc21hbGxlciB0aGFuIENvcHlTZXQgWSBpZmYgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnMgaG9sZDpcbiAqIDEuIEZvciBldmVyeSB4IGluIFgsIHggaXMgYWxzbyBpbiBZLlxuICogMi4gVGhlcmUgaXMgYSB5IGluIFkgdGhhdCBpcyBub3QgaW4gWC5cbiAqXG4gKiBYIGlzIGVxdWl2YWxlbnQgdG8gWSBpZmYgdGhlIGNvbmRpdGlvbiAxIGhvbGRzIGJ1dCBjb25kaXRpb24gMiBkb2VzIG5vdC5cbiAqL1xuICAgICAgIGNvbnN0IHNldENvbXBhcmUgPSBtYWtlQ29tcGFyZUNvbGxlY3Rpb24oXG4gIC8qKiBAdHlwZSB7PEsgZXh0ZW5kcyBLZXk+KHM6IENvcHlTZXQ8Sz4pID0+IEFycmF5PFtLLCAxXT59ICovIChcbiAgICBzID0+IGhhcmRlbihnZXRDb3B5U2V0S2V5cyhzKS5tYXAoa2V5ID0+IFtrZXksIDFdKSlcbiAgKSxcbiAgMCxcbiAgY29tcGFyZU51bWVyaWNzLFxuKTskaM2PX29uY2Uuc2V0Q29tcGFyZShzZXRDb21wYXJlKTtcbmhhcmRlbihzZXRDb21wYXJlKTtcblxuLyoqXG4gKiBDb3B5QmFnIFggaXMgc21hbGxlciB0aGFuIENvcHlCYWcgWSBpZmYgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnMgaG9sZFxuICogKHdoZXJlIGBjb3VudChBLCBhKWAgaXMgc2hvcnRoYW5kIGZvciB0aGUgY291bnQgYXNzb2NpYXRlZCB3aXRoIGBhYCBpbiBgQWApOlxuICogMS4gRm9yIGV2ZXJ5IHggaW4gWCwgeCBpcyBhbHNvIGluIFkgYW5kIGNvdW50KFgsIHgpIDw9IGNvdW50KFksIHgpLlxuICogMi4gVGhlcmUgaXMgYSB5IGluIFkgc3VjaCB0aGF0IHkgaXMgbm90IGluIFggb3IgY291bnQoWCwgeSkgPCBjb3VudChZLCB5KS5cbiAqXG4gKiBYIGlzIGVxdWl2YWxlbnQgdG8gWSBpZmYgdGhlIGNvbmRpdGlvbiAxIGhvbGRzIGJ1dCBjb25kaXRpb24gMiBkb2VzIG5vdC5cbiAqL1xuICAgICAgIGNvbnN0IGJhZ0NvbXBhcmUgPSBtYWtlQ29tcGFyZUNvbGxlY3Rpb24oXG4gIGdldENvcHlCYWdFbnRyaWVzLFxuICAwbixcbiAgY29tcGFyZU51bWVyaWNzLFxuKTskaM2PX29uY2UuYmFnQ29tcGFyZShiYWdDb21wYXJlKTtcbmhhcmRlbihiYWdDb21wYXJlKTtcblxuLyogVE9ETyBUaGUgZGVzaXJlZCBzZW1hbnRpY3MgZm9yIENvcHlNYXAgY29tcGFyaXNvbiBoYXZlIG5vdCB5ZXQgYmVlbiBkZWNpZGVkLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTczNyNwdWxscmVxdWVzdHJldmlldy0xNTk2NTk1NDExKi9cbi8qIFRoZSBiZWxvdyBpcyBhIGN1cnJlbnRseS11bnVzZWQgZXh0ZW5zaW9uIG9mIENvcHlCYWcgc2VtYW50aWNzIChpLmUuLCBhYnNlbnQqL1xuLyogZW50cmllcyB0cmVhdGVkIGFzIHByZXNlbnQgd2l0aCBhIHZhbHVlIHRoYXQgaXMgc21hbGxlciB0aGFuIGV2ZXJ5dGhpbmcpLiovXG4vKipcbiAqIEEgdW5pcXVlIGxvY2FsIHZhbHVlIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBub3QgZXhpc3QgaW4gYW55IGluYm91bmQgZGF0YVxuICogc3RydWN0dXJlICh3aGljaCB3b3VsZCBub3QgYmUgdGhlIGNhc2UgaWYgd2UgdXNlZCBgU3ltYm9sLmZvcmApLlxuICogTm90ZSB0aGF0IGBBQlNFTlRgIGlzIG5vdCBwYXNzYWJsZSwgYW5kIHNvIG9ubHkgZXhpc3RzIGF0IHRoZSBKUyBsZXZlbCBvZlxuICogYWJzdHJhY3Rpb24sIG5vdCBwYXNzLXN0eWxlLlxuICovXG5jb25zdCBBQlNFTlQgPSBTeW1ib2woJ2Fic2VudCcpO1xuXG4vKipcbiAqIENvcHlNYXAgWCBpcyBzbWFsbGVyIHRoYW4gQ29weU1hcCBZIGlmZiBhbGwgb2YgdGhlc2UgY29uZGl0aW9ucyBob2xkOlxuICogMS4gWCBhbmQgWSBhcmUgYm90aCBLZXlzIChpLmUuLCBuZWl0aGVyIGNvbnRhaW5zIG5vbi1jb21wYXJhYmxlIGRhdGEpLlxuICogMi4gRm9yIGV2ZXJ5IHggaW4gWCwgeCBpcyBhbHNvIGluIFkgYW5kIFhbeF0gaXMgc21hbGxlciB0aGFuIG9yIGVxdWl2YWxlbnQgdG8gWVt4XS5cbiAqIDMuIFRoZXJlIGlzIGEgeSBpbiBZIHN1Y2ggdGhhdCB5IGlzIG5vdCBpbiBYIG9yIFhbeV0gaXMgc21hbGxlciB0aGFuIFlbeV0uXG4gKlxuICogWCBpcyBlcXVpdmFsZW50IHRvIFkgaWZmIGNvbmRpdGlvbnMgMSBhbmQgMiBob2xkIGJ1dCBjb25kaXRpb24gMyBkb2VzIG5vdC5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVyc2NvcmUtZGFuZ2xlKi9cbmNvbnN0IF9tYXBDb21wYXJlID0gbWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuICBnZXRDb3B5TWFwRW50cnlBcnJheSxcbiAgQUJTRU5ULFxuICAobGVmdFZhbHVlLCByaWdodFZhbHVlKSA9PiB7XG4gICAgaWYgKGxlZnRWYWx1ZSA9PT0gQUJTRU5UICYmIHJpZ2h0VmFsdWUgPT09IEFCU0VOVCkge1xuICAgICAgdGhyb3cgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBhYnNlbnQgZW50cnkgcGFpcmA7XG4gICAgfSBlbHNlIGlmIChsZWZ0VmFsdWUgPT09IEFCU0VOVCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gZWxzZSBpZiAocmlnaHRWYWx1ZSA9PT0gQUJTRU5UKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIHJldHVybiBjb21wYXJlS2V5cyhsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpO1xuICAgIH1cbiAgfSxcbik7XG5oYXJkZW4oX21hcENvbXBhcmUpO1xuXG4vKiogQHR5cGUge0tleUNvbXBhcmV9ICovXG4gICAgICAgY29uc3QgY29tcGFyZUtleXMgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgYXNzZXJ0S2V5KGxlZnQpO1xuICBhc3NlcnRLZXkocmlnaHQpO1xuICBjb25zdCBsZWZ0U3R5bGUgPSBwYXNzU3R5bGVPZihsZWZ0KTtcbiAgY29uc3QgcmlnaHRTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0KTtcbiAgaWYgKGxlZnRTdHlsZSAhPT0gcmlnaHRTdHlsZSkge1xuICAgIC8qIERpZmZlcmVudCBwYXNzU3R5bGVzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuICBzd2l0Y2ggKGxlZnRTdHlsZSkge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgY2FzZSAnbnVsbCc6XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnYmlnaW50JzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ2J5dGVBcnJheSc6XG4gICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgLyogZm9yIHRoZXNlLCBrZXlzIGNvbXBhcmUgdGhlIHNhbWUgYXMgcmFuayovXG4gICAgICByZXR1cm4gY29tcGFyZVJhbmsobGVmdCwgcmlnaHQpO1xuICAgIH1cbiAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICBjb25zdCByYW5rQ29tcCA9IGNvbXBhcmVSYW5rKGxlZnQsIHJpZ2h0KTtcbiAgICAgIGlmIChyYW5rQ29tcCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGlmIChOdW1iZXIuaXNOYU4obGVmdCkgfHwgTnVtYmVyLmlzTmFOKHJpZ2h0KSkge1xuICAgICAgICAvKiBOYU4gaXMgZXF1YWwgdG8gaXRzZWxmLCBidXQgaW5jb21tZW5zdXJhdGUgd2l0aCBldmVyeXRoaW5nIGVsc2UqL1xuICAgICAgICBhc3NlcnQoIU51bWJlci5pc05hTihsZWZ0KSB8fCAhTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgICAvKiBBbW9uZyBub24tTmFOIG51bWJlcnMsIGtleSBvcmRlciBpcyB0aGUgc2FtZSBhcyByYW5rIG9yZGVyLiBOb3RlIHRoYXQqL1xuICAgICAgLyogaW4gYm90aCBvcmRlcnMsIGAtMGAgaXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MgYXMgYDBgLiovXG4gICAgICByZXR1cm4gcmFua0NvbXA7XG4gICAgfVxuICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgIGlmIChsZWZ0ID09PSByaWdodCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIC8qIElmIHR3byByZW1vdGFibGVzIGFyZSBub3QgaWRlbnRpY2FsLCB0aGVuIGFzIGtleXMgdGhleSBhcmUqL1xuICAgICAgLyogaW5jb21tZW5zdXJhdGUuKi9cbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgIC8qIExleGljb2dyYXBoaWMgYnkga2V5IG9yZGVyLiBSYW5rIG9yZGVyIG9mIGFycmF5cyBpcyBsZXhpY29ncmFwaGljIGJ5Ki9cbiAgICAgIC8qIHJhbmsgb3JkZXIuKi9cbiAgICAgIC8qIEJlY2F1c2UgdGhlIGludmFyaWFudHMgYWJvdmUgYXBwbHkgdG8gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSwqL1xuICAgICAgLyogdGhleSBhcHBseSB0byB0aGUgYXJyYXkgYXMgYSB3aG9sZS4qL1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCBsZW4gPSBNYXRoLm1pbihsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmVLZXlzKGxlZnRbaV0sIHJpZ2h0W2ldKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyBhcmUga2V5RVEsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbiAgICAgIC8qIFRodXMsIGlmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGlzIHNtYWxsZXIgdGhhbiBZLiovXG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIHJldHVybiBjb21wYXJlUmFuayhsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICB9XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIC8qIFBhcmV0byBwYXJ0aWFsIG9yZGVyIGNvbXBhcmlzb24uKi9cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgbGVmdE5hbWVzID0gcmVjb3JkTmFtZXMobGVmdCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IHJpZ2h0TmFtZXMgPSByZWNvcmROYW1lcyhyaWdodCk7XG5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBpZiAoIWtleUVRKGxlZnROYW1lcywgcmlnaHROYW1lcykpIHtcbiAgICAgICAgLyogSWYgdGhleSBkbyBub3QgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnRpZXMsKi9cbiAgICAgICAgLyogdGhleSBhcmUgaW5jb21tZW5zdXJhdGUuKi9cbiAgICAgICAgLyogTm90ZSB0aGF0IHJhbmsgc29ydGluZyBvZiBjb3B5UmVjb3JkcyBncm91cHMgYWxsIGNvcHlSZWNvcmRzIHdpdGgqL1xuICAgICAgICAvKiB0aGUgc2FtZSBrZXlzIHRvZ2V0aGVyLCBlbmFibGluZyByYW5nZSBzZWFyY2hpbmcgb3ZlciBjb3B5UmVjb3JkcyovXG4gICAgICAgIC8qIHRvIGF2b2lkIG1vcmUgaXJyZWxldmFudCBvbmVzLiovXG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IGxlZnRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMobGVmdCwgbGVmdE5hbWVzKTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgcmlnaHRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMocmlnaHQsIHJpZ2h0TmFtZXMpO1xuICAgICAgLyogUHJlc3VtZSB0aGF0IGJvdGggY29weVJlY29yZHMgaGF2ZSB0aGUgc2FtZSBrZXkgb3JkZXIqL1xuICAgICAgLyogdW50aWwgZW5jb3VudGVyaW5nIGEgcHJvcGVydHkgZGlzcHJvdmluZyB0aGF0IGh5cG90aGVzaXMuKi9cbiAgICAgIGxldCByZXN1bHQgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZWZ0VmFsdWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlS2V5cyhsZWZ0VmFsdWVzW2ldLCByaWdodFZhbHVlc1tpXSk7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4oY29tcCkpIHtcbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQgIT09IGNvbXAgJiYgY29tcCAhPT0gMCkge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbXA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgKHJlc3VsdCA9PT0gLTEgJiYgY29tcCA9PT0gMSkgfHwgKHJlc3VsdCA9PT0gMSAmJiBjb21wID09PSAtMSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qIElmIGNvcHlSZWNvcmQgWCBpcyBzbWFsbGVyIHRoYW4gY29weVJlY29yZCBZLCB0aGVuIHRoZXkgbXVzdCBoYXZlIHRoZSovXG4gICAgICAvKiBzYW1lIHByb3BlcnR5IG5hbWVzIGFuZCBldmVyeSB2YWx1ZSBpbiBYIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byovXG4gICAgICAvKiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiBZICh3aXRoIGF0IGxlYXN0IG9uZSB2YWx1ZSBzbWFsbGVyKS4qL1xuICAgICAgLyogVGhlIHJhbmsgb3JkZXIgb2YgWCBhbmQgWSBpcyBiYXNlZCBvbiBsZXhpY29ncmFwaGljIHJhbmsgb3JkZXIgb2YqL1xuICAgICAgLyogdGhlaXIgdmFsdWVzLCBhcyBvcmdhbml6ZWQgYnkgcmV2ZXJzZSBsZXhpY29ncmFwaGljIG9yZGVyIG9mIHRoZWlyKi9cbiAgICAgIC8qIHByb3BlcnR5IG5hbWVzLiovXG4gICAgICAvKiBUaHVzIGlmIGNvbXBhcmVLZXlzKFgsWSkgPCAwIHRoZW4gY29tcGFyZVJhbmsoWCxZKSA8IDAuKi9cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgbGVmdFRhZyA9IGdldFRhZyhsZWZ0KTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgcmlnaHRUYWcgPSBnZXRUYWcocmlnaHQpO1xuICAgICAgaWYgKGxlZnRUYWcgIT09IHJpZ2h0VGFnKSB7XG4gICAgICAgIC8qIGRpZmZlcmVudCB0YWdzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGxlZnRUYWcpIHtcbiAgICAgICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgICAgICByZXR1cm4gc2V0Q29tcGFyZShsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgICAgICByZXR1cm4gYmFnQ29tcGFyZShsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgICAvKiBUT0RPIFRoZSBkZXNpcmVkIHNlbWFudGljcyBmb3IgQ29weU1hcCBjb21wYXJpc29uIGhhdmUgbm90IHlldCBiZWVuIGRlY2lkZWQuKi9cbiAgICAgICAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTczNyNwdWxscmVxdWVzdHJldmlldy0xNTk2NTk1NDExKi9cbiAgICAgICAgICB0aHJvdyBGYWlsYE1hcCBjb21wYXJpc29uIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7bGVmdH0gdnMgJHtyaWdodH1gO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBGYWlsYHVuZXhwZWN0ZWQgdGFnICR7cShsZWZ0VGFnKX06ICR7bGVmdH1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IEZhaWxgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKGxlZnRTdHlsZSl9OiAke2xlZnR9YDtcbiAgICB9XG4gIH1cbn07JGjNj19vbmNlLmNvbXBhcmVLZXlzKGNvbXBhcmVLZXlzKTtcbmhhcmRlbihjb21wYXJlS2V5cyk7XG5cbiAgICAgICBjb25zdCBrZXlMVCA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpIDwgMDskaM2PX29uY2Uua2V5TFQoa2V5TFQpO1xuaGFyZGVuKGtleUxUKTtcblxuICAgICAgIGNvbnN0IGtleUxURSA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpIDw9IDA7JGjNj19vbmNlLmtleUxURShrZXlMVEUpO1xuaGFyZGVuKGtleUxURSk7XG5cbiAgICAgICBjb25zdCBrZXlFUSA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID09PSAwOyRozY9fb25jZS5rZXlFUShrZXlFUSk7XG5oYXJkZW4oa2V5RVEpO1xuXG4gICAgICAgY29uc3Qga2V5R1RFID0gKGxlZnQsIHJpZ2h0KSA9PiBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPj0gMDskaM2PX29uY2Uua2V5R1RFKGtleUdURSk7XG5oYXJkZW4oa2V5R1RFKTtcblxuICAgICAgIGNvbnN0IGtleUdUID0gKGxlZnQsIHJpZ2h0KSA9PiBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPiAwOyRozY9fb25jZS5rZXlHVChrZXlHVCk7XG5oYXJkZW4oa2V5R1QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0Q29tcGFyZSI6WyJzZXRDb21wYXJlIl0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSJdLCJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyJdLCJrZXlMVCI6WyJrZXlMVCJdLCJrZXlMVEUiOlsia2V5TFRFIl0sImtleUVRIjpbImtleUVRIl0sImtleUdURSI6WyJrZXlHVEUiXSwia2V5R1QiOlsia2V5R1QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANFtTY00VAABNFQAAKQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb3B5QmFnLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRCYWdFbnRyaWVzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIiwiY2hlY2tCYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwibWFrZUJhZ09mRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcImlzUmFua1NvcnRlZFwiLFskaM2PX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKiBAaW1wb3J0IHtDaGVja2VyLCBGdWxsQ29tcGFyZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCdcbiAqIEBpbXBvcnQge0NvcHlCYWcsIEtleX0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeVxuICoga25vd24gdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXRcbiAqIHJhdGhlciB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlXG4gKiBhcnJheSBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZS1rZXlzIGZpbmRpbmcgYXMgd2VsbCwgaW5kZXBlbmRlbnRcbiAqIG9mIHRoZSBgZnVsbE9yZGVyYCB1c2UgdG8gcmVhY2ggdGhpcyBmaW5kaW5nLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVLZXlzID0gKGJhZ0VudHJpZXMsIGZ1bGxDb21wYXJlLCBjaGVjaykgPT4ge1xuICAvKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuICAvKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4gIC8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbiAgLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG4gIGZ1bGxDb21wYXJlID0gZnVsbENvbXBhcmUgfHwgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuICAvKiBTaW5jZSB0aGUga2V5IGlzIG1vcmUgc2lnbmlmaWNhbnQgdGhhbiB0aGUgdmFsdWUgKHRoZSBjb3VudCksKi9cbiAgLyogc29ydGluZyBieSBmdWxsT3JkZXIgaXMgZ3VhcmFudGVlZCB0byBtYWtlIGR1cGxpY2F0ZSBrZXlzKi9cbiAgLyogYWRqYWNlbnQgaW5kZXBlbmRlbnQgb2YgdGhlaXIgY291bnRzLiovXG4gIGJhZ0VudHJpZXMgPSBzb3J0QnlSYW5rKGJhZ0VudHJpZXMsIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGJhZ0VudHJpZXM7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBrMCA9IGJhZ0VudHJpZXNbaSAtIDFdWzBdO1xuICAgIGNvbnN0IGsxID0gYmFnRW50cmllc1tpXVswXTtcbiAgICBpZiAoZnVsbENvbXBhcmUoazAsIGsxKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYHZhbHVlIGhhcyBkdXBsaWNhdGUga2V5czogJHtrMH1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gW2Z1bGxDb21wYXJlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnROb0R1cGxpY2F0ZUtleXMgPSAoYmFnRW50cmllcywgZnVsbENvbXBhcmUgPSB1bmRlZmluZWQpID0+IHtcbiAgY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcywgZnVsbENvbXBhcmUsIGFzc2VydENoZWNrZXIpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1tQYXNzYWJsZSxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjNj19vbmNlLmFzc2VydE5vRHVwbGljYXRlS2V5cyhhc3NlcnROb0R1cGxpY2F0ZUtleXMpO1xuICAgICAgIGNvbnN0IGNoZWNrQmFnRW50cmllcyA9IChiYWdFbnRyaWVzLCBjaGVjaykgPT4ge1xuICBpZiAocGFzc1N0eWxlT2YoYmFnRW50cmllcykgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIGEgY29weUFycmF5OiAke2JhZ0VudHJpZXN9YCxcbiAgICApO1xuICB9XG4gIGlmICghaXNSYW5rU29ydGVkKGJhZ0VudHJpZXMsIGNvbXBhcmVBbnRpUmFuaykpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtiYWdFbnRyaWVzfWAsXG4gICAgKTtcbiAgfVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGJhZ0VudHJpZXMpIHtcbiAgICBpZiAoXG4gICAgICBwYXNzU3R5bGVPZihlbnRyeSkgIT09ICdjb3B5QXJyYXknIHx8XG4gICAgICBlbnRyeS5sZW5ndGggIT09IDIgfHxcbiAgICAgIHR5cGVvZiBlbnRyeVsxXSAhPT0gJ2JpZ2ludCdcbiAgICApIHtcbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBiZSBwYWlyIG9mIGEga2V5IGFuZCBhIGJpZ2ludCByZXByZXNlbnRpbmcgYSBjb3VudDogJHtlbnRyeX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGVudHJ5WzFdIDwgMSkge1xuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBjb3VudDogJHtlbnRyeX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggS2V5IHR5cGVzKi9cbiAgcmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsIHVuZGVmaW5lZCwgY2hlY2spO1xufTskaM2PX29uY2UuY2hlY2tCYWdFbnRyaWVzKGNoZWNrQmFnRW50cmllcyk7XG5oYXJkZW4oY2hlY2tCYWdFbnRyaWVzKTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJucy1jaGVjayAtLSBkb2Vzbid0IHVuZGVyc3RhbmQgYXNzZXJ0cyovXG4vKipcbiAqIEBwYXJhbSB7W1Bhc3NhYmxlLGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHJldHVybnMge2Fzc2VydHMgYmFnRW50cmllcyBpcyBbUGFzc2FibGUsYmlnaW50XVtdfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0QmFnRW50cmllcyA9IGJhZ0VudHJpZXMgPT4ge1xuICBjaGVja0JhZ0VudHJpZXMoYmFnRW50cmllcywgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRCYWdFbnRyaWVzKGFzc2VydEJhZ0VudHJpZXMpO1xuaGFyZGVuKGFzc2VydEJhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLCBiaWdpbnRdPn0gYmFnRW50cmllc0xpc3RcbiAqL1xuICAgICAgIGNvbnN0IGNvZXJjZVRvQmFnRW50cmllcyA9IGJhZ0VudHJpZXNMaXN0ID0+IHtcbiAgY29uc3QgYmFnRW50cmllcyA9IHNvcnRCeVJhbmsoYmFnRW50cmllc0xpc3QsIGNvbXBhcmVBbnRpUmFuayk7XG4gIGFzc2VydEJhZ0VudHJpZXMoYmFnRW50cmllcyk7XG4gIHJldHVybiBiYWdFbnRyaWVzO1xufTskaM2PX29uY2UuY29lcmNlVG9CYWdFbnRyaWVzKGNvZXJjZVRvQmFnRW50cmllcyk7XG5oYXJkZW4oY29lcmNlVG9CYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQmFnT2ZFbnRyaWVzID0gYmFnRW50cnlJdGVyID0+XG4gIG1ha2VUYWdnZWQoJ2NvcHlCYWcnLCBjb2VyY2VUb0JhZ0VudHJpZXMoYmFnRW50cnlJdGVyKSk7JGjNj19vbmNlLm1ha2VCYWdPZkVudHJpZXMobWFrZUJhZ09mRW50cmllcyk7XG5oYXJkZW4obWFrZUJhZ09mRW50cmllcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiOlsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIl0sImNoZWNrQmFnRW50cmllcyI6WyJjaGVja0JhZ0VudHJpZXMiXSwiYXNzZXJ0QmFnRW50cmllcyI6WyJhc3NlcnRCYWdFbnRyaWVzIl0sImNvZXJjZVRvQmFnRW50cmllcyI6WyJjb2VyY2VUb0JhZ0VudHJpZXMiXSwibWFrZUJhZ09mRW50cmllcyI6WyJtYWtlQmFnT2ZFbnRyaWVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACwjgyYsEQAALBEAACkAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29weVNldC5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0RWxlbWVudHMiLCJhc3NlcnROb0R1cGxpY2F0ZXMiLCJjaGVja0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyIsIm1ha2VTZXRPZkVsZW1lbnRzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqIEBpbXBvcnQge0NoZWNrZXIsIEZ1bGxDb21wYXJlfSBmcm9tICdAZW5kby9tYXJzaGFsJ1xuICogQGltcG9ydCB7Q29weVNldCwgS2V5fSBmcm9tICcuLi90eXBlcy5qcydcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBlbGVtZW50c2AgaXMgYWxyZWFkeSBrbm93blxuICogdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXQgcmF0aGVyXG4gKiB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlIGFycmF5XG4gKiBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZSBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlcyA9IChlbGVtZW50cywgZnVsbENvbXBhcmUsIGNoZWNrKSA9PiB7XG4gIC8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4gIC8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbiAgLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuICAvKiBsaW5lIHNob3VsZCBiZSByZXdyaXR0ZW4gdXNpbmcgaXQuKi9cbiAgZnVsbENvbXBhcmUgPSBmdWxsQ29tcGFyZSB8fCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4gIGVsZW1lbnRzID0gc29ydEJ5UmFuayhlbGVtZW50cywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gZWxlbWVudHM7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBrMCA9IGVsZW1lbnRzW2kgLSAxXTtcbiAgICBjb25zdCBrMSA9IGVsZW1lbnRzW2ldO1xuICAgIGlmIChmdWxsQ29tcGFyZShrMCwgazEpID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBbZnVsbENvbXBhcmVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydE5vRHVwbGljYXRlcyA9IChlbGVtZW50cywgZnVsbENvbXBhcmUgPSB1bmRlZmluZWQpID0+IHtcbiAgY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsIGZ1bGxDb21wYXJlLCBhc3NlcnRDaGVja2VyKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaM2PX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVzKGFzc2VydE5vRHVwbGljYXRlcyk7XG4gICAgICAgY29uc3QgY2hlY2tFbGVtZW50cyA9IChlbGVtZW50cywgY2hlY2spID0+IHtcbiAgaWYgKHBhc3NTdHlsZU9mKGVsZW1lbnRzKSAhPT0gJ2NvcHlBcnJheScpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtlbGVtZW50c31gLFxuICAgICk7XG4gIH1cbiAgaWYgKCFpc1JhbmtTb3J0ZWQoZWxlbWVudHMsIGNvbXBhcmVBbnRpUmFuaykpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2VsZW1lbnRzfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsIHVuZGVmaW5lZCwgY2hlY2spO1xufTskaM2PX29uY2UuY2hlY2tFbGVtZW50cyhjaGVja0VsZW1lbnRzKTtcbmhhcmRlbihjaGVja0VsZW1lbnRzKTtcblxuICAgICAgIGNvbnN0IGFzc2VydEVsZW1lbnRzID0gZWxlbWVudHMgPT4ge1xuICBjaGVja0VsZW1lbnRzKGVsZW1lbnRzLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEVsZW1lbnRzKGFzc2VydEVsZW1lbnRzKTtcbmhhcmRlbihhc3NlcnRFbGVtZW50cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRzTGlzdFxuICovXG4gICAgICAgY29uc3QgY29lcmNlVG9FbGVtZW50cyA9IGVsZW1lbnRzTGlzdCA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gc29ydEJ5UmFuayhlbGVtZW50c0xpc3QsIGNvbXBhcmVBbnRpUmFuayk7XG4gIGFzc2VydEVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgcmV0dXJuIGVsZW1lbnRzO1xufTskaM2PX29uY2UuY29lcmNlVG9FbGVtZW50cyhjb2VyY2VUb0VsZW1lbnRzKTtcbmhhcmRlbihjb2VyY2VUb0VsZW1lbnRzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVNldE9mRWxlbWVudHMgPSBlbGVtZW50SXRlciA9PlxuICBtYWtlVGFnZ2VkKCdjb3B5U2V0JywgY29lcmNlVG9FbGVtZW50cyhlbGVtZW50SXRlcikpOyRozY9fb25jZS5tYWtlU2V0T2ZFbGVtZW50cyhtYWtlU2V0T2ZFbGVtZW50cyk7XG5oYXJkZW4obWFrZVNldE9mRWxlbWVudHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVzIjpbImFzc2VydE5vRHVwbGljYXRlcyJdLCJjaGVja0VsZW1lbnRzIjpbImNoZWNrRWxlbWVudHMiXSwiYXNzZXJ0RWxlbWVudHMiOlsiYXNzZXJ0RWxlbWVudHMiXSwiY29lcmNlVG9FbGVtZW50cyI6WyJjb2VyY2VUb0VsZW1lbnRzIl0sIm1ha2VTZXRPZkVsZW1lbnRzIjpbIm1ha2VTZXRPZkVsZW1lbnRzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANs1mkDDIgAAwyIAADkAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2NvbW1vbi9tYWtlLWl0ZXJhdG9yLmpzIiwiQGVuZG8vY29tbW9uL21ha2UtYXJyYXktaXRlcmF0b3IuanMiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyIsIm1ha2VDb21wYXJlQ29sbGVjdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssbWFrZUl0ZXJhdG9yLG1ha2VBcnJheUl0ZXJhdG9yLHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIixbJGjNj19hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL21ha2UtaXRlcmF0b3IuanNcIiwgW1tcIm1ha2VJdGVyYXRvclwiLFskaM2PX2EgPT4gKG1ha2VJdGVyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzXCIsIFtbXCJtYWtlQXJyYXlJdGVyYXRvclwiLFskaM2PX2EgPT4gKG1ha2VBcnJheUl0ZXJhdG9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogUmVmaW5lcyBhIHNlcXVlbmNlIG9mIGVudHJpZXMgdGhhdCBpcyBhbHJlYWR5IHNvcnRlZCBvdmVyIGl0cyBrZXlzIGJ5IHRoZVxuICogYHJhbmtDb21wYXJlYCBwcmVvcmRlciwgd2hlcmUgdGhlcmUgbWF5IGJlIGludGVybmFsIHJ1bnMgdGllZCBmb3IgdGhlIHNhbWVcbiAqIHJhbmssIGludG8gYW4gaXRlcmFibGUgdGhhdCByZXNvbHZlcyB0aG9zZSB0aWVzIHVzaW5nIGBmdWxsQ29tcGFyZWAuXG4gKlxuICogQHRlbXBsYXRlIFtWPXVua25vd25dXG4gKiBAcGFyYW0ge0FycmF5PFtLZXksIFZdPn0gZW50cmllc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGVJdGVyYXRvcjxbS2V5LCBWXT59XG4gKi9cbmNvbnN0IGdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXMgPSAoZW50cmllcywgcmFua0NvbXBhcmUsIGZ1bGxDb21wYXJlKSA9PiB7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIEtleSB0eXBlcyovXG4gIGFzc2VydFJhbmtTb3J0ZWQoZW50cmllcywgcmFua0NvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gZW50cmllcztcbiAgbGV0IGkgPSAwO1xuICBsZXQgc2FtZVJhbmtJdGVyYXRvcjtcbiAgcmV0dXJuIG1ha2VJdGVyYXRvcigoKSA9PiB7XG4gICAgaWYgKHNhbWVSYW5rSXRlcmF0b3IpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNhbWVSYW5rSXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKCFyZXN1bHQuZG9uZSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgc2FtZVJhbmtJdGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXTtcbiAgICAgIC8qIExvb2sgYWhlYWQgZm9yIHNhbWUtcmFuayB0aWVzLiovXG4gICAgICBsZXQgaiA9IGkgKyAxO1xuICAgICAgd2hpbGUgKGogPCBsZW5ndGggJiYgcmFua0NvbXBhcmUoZW50cnlbMF0sIGVudHJpZXNbal1bMF0pID09PSAwKSB7XG4gICAgICAgIGogKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChqID09PSBpICsgMSkge1xuICAgICAgICAvKiBObyB0aWVzIGZvdW5kLiovXG4gICAgICAgIGkgPSBqO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBlbnRyeSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRpZXMgPSBlbnRyaWVzLnNsaWNlKGksIGopO1xuICAgICAgaSA9IGo7XG5cbiAgICAgIC8qIFNvcnQgdGhlIHRpZXMgYnkgYGZ1bGxDb21wYXJlYCwgZW5mb3JjZSBrZXkgdW5pcXVlbmVzcywgYW5kIGRlbGVnYXRlIHRvKi9cbiAgICAgIC8qIGEgc3ViLWl0ZXJhdG9yLiovXG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBLZXkgdHlwZXMqL1xuICAgICAgY29uc3Qgc29ydGVkVGllcyA9IHNvcnRCeVJhbmsodGllcywgZnVsbENvbXBhcmUpO1xuICAgICAgZm9yIChsZXQgayA9IDE7IGsgPCBzb3J0ZWRUaWVzLmxlbmd0aDsgayArPSAxKSB7XG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIEtleSB0eXBlcyovXG4gICAgICAgIGNvbnN0IFtrZXkwXSA9IHNvcnRlZFRpZXNbayAtIDFdO1xuICAgICAgICBjb25zdCBba2V5MV0gPSBzb3J0ZWRUaWVzW2tdO1xuICAgICAgICBNYXRoLnNpZ24oZnVsbENvbXBhcmUoa2V5MCwga2V5MSkpIHx8XG4gICAgICAgICAgRmFpbGBEdXBsaWNhdGUgZW50cnkga2V5OiAke2tleTB9YDtcbiAgICAgIH1cbiAgICAgIHNhbWVSYW5rSXRlcmF0b3IgPSBtYWtlQXJyYXlJdGVyYXRvcihzb3J0ZWRUaWVzKTtcbiAgICAgIHJldHVybiBzYW1lUmFua0l0ZXJhdG9yLm5leHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gIH0pO1xufTtcbmhhcmRlbihnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgbWVyZ2VzIHJldmVyc2UtcmFuay1zb3J0ZWQgW2tleSwgdmFsdWVdIGVudHJpZXMgb2ZcbiAqIHR3byBLZXlDb2xsZWN0aW9ucyBpbnRvIGEgcmV2ZXJzZS1mdWxsLXNvcnRlZCBba2V5LCB2YWx1ZTEsIHZhbHVlMl0gZW50cmllc1xuICogYnkgdGhlIGtleSB0aGV5IGhhdmUgaW4gY29tbW9uLCByZXByZXNlbnRpbmcgdGhlIHZhbHVlIGZvciBhbiBhYnNlbnQgZW50cnkgaW5cbiAqIGVpdGhlciBjb2xsZWN0aW9uIGFzIGBhYnNlbnRWYWx1ZWAuXG4gKlxuICogQHRlbXBsYXRlIFtDPUtleUNvbGxlY3Rpb25dXG4gKiBAdGVtcGxhdGUgW1Y9dW5rbm93bl1cbiAqIEBwYXJhbSB7Q30gYzFcbiAqIEBwYXJhbSB7Q30gYzJcbiAqIEBwYXJhbSB7KGNvbGxlY3Rpb246IEMpID0+IEFycmF5PFtLZXksIFZdPn0gZ2V0RW50cmllc1xuICogQHBhcmFtIHthbnl9IGFic2VudFZhbHVlXG4gKiBAcmV0dXJucyB7SXRlcmFibGVJdGVyYXRvcjxbS2V5LCBWIHwgYWJzZW50VmFsdWUsIFYgfCBhYnNlbnRWYWx1ZV0+fVxuICovXG4gICAgICAgY29uc3QgZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMgPSAoXG4gIGMxLFxuICBjMixcbiAgZ2V0RW50cmllcyxcbiAgYWJzZW50VmFsdWUsXG4pID0+IHtcbiAgY29uc3QgZTEgPSBnZXRFbnRyaWVzKGMxKTtcbiAgY29uc3QgZTIgPSBnZXRFbnRyaWVzKGMyKTtcblxuICAvKiBFc3RhYmxpc2ggYSBoaXN0b3J5LWRlcGVuZGVudCBjb21wYXJpc29uIHNjb3BlZCB0byB0aGUgYWN0aXZlIGludm9jYXRpb24qL1xuICAvKiBhbmQgdXNlIGl0IHRvIG1hcCByZXZlcnNlLXByZW9yZGVyZWQgZW50cmllcyBpbnRvIGFuIGl0ZXJhdG9yIHdpdGggYSovXG4gIC8qIG5hcnJvd2VyIHRvdGFsIG9yZGVyLiovXG4gIGNvbnN0IGZ1bGxDb21wYXJlID0gbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcbiAgY29uc3QgeCA9IGdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXMoZTEsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB5ID0gZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyhlMiwgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG5cbiAgLyogTWFpbnRhaW4gYSBzaW5nbGUtcmVzdWx0IHsgZG9uZSwga2V5LCB2YWx1ZSB9IGJ1ZmZlciBmb3IgZWFjaCBpdGVyYXRvciovXG4gIC8qIHNvIHRoZXkgY2FuIGJlIG1lcmdlZC4qL1xuICBsZXQgeERvbmU7XG4gIGxldCB4S2V5O1xuICBsZXQgeFZhbHVlO1xuICBsZXQgeURvbmU7XG4gIGxldCB5S2V5O1xuICBsZXQgeVZhbHVlO1xuICBjb25zdCBub25FbnRyeSA9IFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG4gIGNvbnN0IG5leHRYID0gKCkgPT4ge1xuICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBtdXN0IG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICBjb25zdCByZXN1bHQgPSB4VmFsdWU7XG4gICAgKHsgZG9uZTogeERvbmUsIHZhbHVlOiBbeEtleSwgeFZhbHVlXSA9IG5vbkVudHJ5IH0gPSB4Lm5leHQoKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbmV4dFgoKTtcbiAgY29uc3QgbmV4dFkgPSAoKSA9PiB7XG4gICAgIXlEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRZIG11c3Qgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgIGNvbnN0IHJlc3VsdCA9IHlWYWx1ZTtcbiAgICAoeyBkb25lOiB5RG9uZSwgdmFsdWU6IFt5S2V5LCB5VmFsdWVdID0gbm9uRW50cnkgfSA9IHkubmV4dCgpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBuZXh0WSgpO1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIC8qKiBAdHlwZSB7W0tleSwgViB8IGFic2VudFZhbHVlLCBWIHwgYWJzZW50VmFsdWVdfSAqL1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoeERvbmUgJiYgeURvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgdmFsdWUgPSBbdW5kZWZpbmVkLCBhYnNlbnRWYWx1ZSwgYWJzZW50VmFsdWVdO1xuICAgIH0gZWxzZSBpZiAoeERvbmUpIHtcbiAgICAgIHZhbHVlID0gW3lLZXksIGFic2VudFZhbHVlLCBuZXh0WSgpXTtcbiAgICB9IGVsc2UgaWYgKHlEb25lKSB7XG4gICAgICB2YWx1ZSA9IFt4S2V5LCBuZXh0WCgpLCBhYnNlbnRWYWx1ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIENvbXBhcmUgdGhlIGtleXMgdG8gZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCByZXR1cm4gYSBtZXJnZWQgcmVzdWx0Ki9cbiAgICAgIC8qIG9yIGEgb25lLXNpZGVkIHJlc3VsdC4qL1xuICAgICAgY29uc3QgY29tcCA9IGZ1bGxDb21wYXJlKHhLZXksIHlLZXkpO1xuICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgdmFsdWUgPSBbeEtleSwgbmV4dFgoKSwgbmV4dFkoKV07XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4gICAgICAgIHZhbHVlID0gW3hLZXksIG5leHRYKCksIGFic2VudFZhbHVlXTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA+IDApIHtcbiAgICAgICAgdmFsdWUgPSBbeUtleSwgYWJzZW50VmFsdWUsIG5leHRZKCldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRmFpbGBVbmV4cGVjdGVkIGtleSBjb21wYXJpc29uICR7cShjb21wKX0gZm9yICR7eEtleX0gdnMgJHt5S2V5fWA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oeyBkb25lLCB2YWx1ZSB9KTtcbiAgfSk7XG59OyRozY9fb25jZS5nZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyk7XG5oYXJkZW4oZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMpO1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiBmb3IgY29tcGFyaW5nIHR3byBLZXlDb2xsZWN0aW9ucyBvZiB0aGUgc2FtZSB0eXBlIHVzaW5nXG4gKiB0aGUgcHJvdmlkZWQgZW50cmllcyBmYWN0b3J5IGFuZCBzYW1lLWtleSBlbnRyeSB2YWx1ZSBjb21wYXJhdG9yICh3aGVyZSB0aGVcbiAqIHZhbHVlIGZvciBhbiBhYnNlbnQgZW50cnkgaW4gb25lIGNvbGxlY3Rpb24gaXMgYGFic2VudFZhbHVlYCkuXG4gKlxuICogSWYgdGhlIGNvcnJlc3BvbmRpbmcgZW50cmllcyBmb3IgYW55IHNpbmdsZSBrZXkgYXJlIGluY29tcGFyYWJsZSBvciB0aGVcbiAqIGNvbXBhcmlzb24gcmVzdWx0IGhhcyB0aGUgb3Bwb3NpdGUgc2lnbiBvZiB0aGUgcmVzdWx0IGZvciBhIGRpZmZlcmVudCBrZXksXG4gKiB0aGVuIHRoZSBLZXlDb2xsZWN0aW9ucyBhcmUgaW5jb21wYXJhYmxlLiBPdGhlcndpc2UsIHRoZSBjb2xsZWN0aW9ucyBjb21wYXJlXG4gKiBieSB0aGUgcmVzdWx0IG9mIGFueSBub24tZXF1YWwgZW50cnkgY29tcGFyaXNvbiwgb3IgY29tcGFyZSBlcXVhbCBpZiB0aGVyZSBpc1xuICogbm8gbm9uLWVxdWFsIGVudHJ5IGNvbXBhcmlzb24gcmVzdWx0LlxuICogRm9yIGV4YW1wbGUsIGdpdmVuIENvcHlCYWdzIFggYW5kIFkgYW5kIGEgdmFsdWUgY29tcGFyYXRvciB0aGF0IGdvZXMgYnkgY291bnRcbiAqIChkZWZhdWx0aW5nIGFic2VudCBrZXlzIHRvIGEgY291bnQgb2YgMCksIFggaXMgc21hbGxlciB0aGFuIFkgKGByZXN1bHQgPCAwYClcbiAqIGlmZiB0aGVyZSBhcmUgbm8ga2V5cyBpbiBYIHRoYXQgYXJlIGVpdGhlciBhYnNlbnQgZnJvbSBZXG4gKiAoYGNvbXBhcmVWYWx1ZXMoeENvdW50LCBhYnNlbnRWYWx1ZSkgPiAwYCkgb3IgcHJlc2VudCBpbiBZIHdpdGggYSBsb3dlciBjb3VudFxuICogKGBjb21wYXJlVmFsdWVzKHhDb3VudCwgeUNvdW50KSA+IDBgKSBBTkQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGtleSBpbiBZIHRoYXRcbiAqIGlzIGVpdGhlciBhYnNlbnQgZnJvbSBYIChgY29tcGFyZVZhbHVlcyhhYnNlbnRWYWx1ZSwgeUNvdW50KSA8IDBgKSBvciBwcmVzZW50XG4gKiB3aXRoIGEgbG93ZXIgY291bnQgKGBjb21wYXJlVmFsdWVzKHhDb3VudCwgeUNvdW50KSA8IDBgKS5cbiAqXG4gKiBUaGlzIGNhbiBiZSBnZW5lcmFsaXplZCB0byB2aXJ0dWFsIGNvbGxlY3Rpb25zIGluIHRoZSBmdXR1cmUgYnkgcmVwbGFjaW5nXG4gKiBgZ2V0RW50cmllcyA9PiBBcnJheWAgd2l0aCBgZ2VuZXJhdGVFbnRyaWVzID0+IEl0ZXJhYmxlSXRlcmF0b3JgLlxuICpcbiAqIEB0ZW1wbGF0ZSBbQz1LZXlDb2xsZWN0aW9uXVxuICogQHRlbXBsYXRlIFtWPXVua25vd25dXG4gKiBAcGFyYW0geyhjb2xsZWN0aW9uOiBDKSA9PiBBcnJheTxbS2V5LCBWXT59IGdldEVudHJpZXNcbiAqIEBwYXJhbSB7Vn0gYWJzZW50VmFsdWVcbiAqIEBwYXJhbSB7S2V5Q29tcGFyZX0gY29tcGFyZVZhbHVlc1xuICogQHJldHVybnMgeyhsZWZ0OiBDLCByaWdodDogQykgPT4gS2V5Q29tcGFyaXNvbn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb21wYXJlQ29sbGVjdGlvbiA9IChnZXRFbnRyaWVzLCBhYnNlbnRWYWx1ZSwgY29tcGFyZVZhbHVlcykgPT5cbiAgaGFyZGVuKChsZWZ0LCByaWdodCkgPT4ge1xuICAgIGNvbnN0IG1lcmdlZCA9IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKFxuICAgICAgbGVmdCxcbiAgICAgIHJpZ2h0LFxuICAgICAgZ2V0RW50cmllcyxcbiAgICAgIGFic2VudFZhbHVlLFxuICAgICk7XG4gICAgbGV0IGxlZnRJc0JpZ2dlciA9IGZhbHNlO1xuICAgIGxldCByaWdodElzQmlnZ2VyID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBbX2tleSwgbGVmdFZhbHVlLCByaWdodFZhbHVlXSBvZiBtZXJnZWQpIHtcbiAgICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlVmFsdWVzKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7XG4gICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWUqL1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgLyogQmFzZWQgb24gdGhpcyBrZXksIGxlZnQgPCByaWdodC4qL1xuICAgICAgICByaWdodElzQmlnZ2VyID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA+IDApIHtcbiAgICAgICAgLyogQmFzZWQgb24gdGhpcyBrZXksIGxlZnQgPiByaWdodC4qL1xuICAgICAgICBsZWZ0SXNCaWdnZXIgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTnVtYmVyLmlzTmFOKGNvbXApIHx8XG4gICAgICAgICAgLyogcHJldHRpZXItaWdub3JlKi9cbiAgICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgdmFsdWUgY29tcGFyaXNvbiAke3EoY29tcCl9IGZvciAke2xlZnRWYWx1ZX0gdnMgJHtyaWdodFZhbHVlfWA7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgICBpZiAobGVmdElzQmlnZ2VyICYmIHJpZ2h0SXNCaWdnZXIpIHtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbiAgICByZXR1cm4gbGVmdElzQmlnZ2VyID8gMSA6IHJpZ2h0SXNCaWdnZXIgPyAtMSA6IDA7XG4gIH0pOyRozY9fb25jZS5tYWtlQ29tcGFyZUNvbGxlY3Rpb24obWFrZUNvbXBhcmVDb2xsZWN0aW9uKTtcbmhhcmRlbihtYWtlQ29tcGFyZUNvbGxlY3Rpb24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMiOlsiZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMiXSwibWFrZUNvbXBhcmVDb2xsZWN0aW9uIjpbIm1ha2VDb21wYXJlQ29sbGVjdGlvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACZxDgBVygAAFcoAAA1AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyIsIi4vY29weUJhZy5qcyJdLCJleHBvcnRzIjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJc0Rpc2pvaW50IiwiYmFnSXNTdXBlcmJhZyIsImJhZ1VuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxxLEZhaWwsYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzLG1ha2VCYWdPZkVudHJpZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlS2V5c1wiLFskaM2PX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlS2V5cyA9ICRozY9fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsWyRozY9fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtGdWxsQ29tcGFyZSwgUmFua0NvbXBhcmV9IGZyb20gJ0BlbmRvL21hcnNoYWwnXG4gKiBAaW1wb3J0IHtLZXl9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qIEJhc2VkIG9uIG1lcmdlLXNldC1vcGVyYXRvcnMuanMsIGJ1dCBhbHRlcmVkIGZvciB0aGUgYmFnIHJlcHJlc2VudGF0aW9uLiovXG4vKiBUT0RPIHNoYXJlIG1vcmUgY29kZSB3aXRoIHRoYXQgZmlsZSBhbmQga2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMuKi9cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGJhZ0VudHJpZXNgIGlzIGFscmVhZHkgcmFuayBzb3J0ZWQgYnkgYHJhbmtDb21wYXJlYCwgd2hlcmVcbiAqIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGJhZ0VudHJpZXMgd2hvc2Uga2V5cyBhcmUgdGllZCBmb3IgdGhlIHNhbWVcbiAqIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBiYWdFbnRyaWVzIGluIG9yZGVyXG4gKiBhY2NvcmRpbmcgdG8gYGZ1bGxPcmRlcmAsIHdoaWNoIHNob3VsZCBkaWZmZXIgZnJvbSBgcmFua09yZGVyYCBvbmx5XG4gKiBieSBiZWluZyBtb3JlIHByZWNpc2UuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byByZXNvcnRpbmcgdGhlIGVudGlyZSBgYmFnRW50cmllc2AgYXJyYXlcbiAqIGFjY29yZGluZ1xuICogdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIHtLZXl9IFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgYmFnV2luZG93UmVzb3J0ID0gKGJhZ0VudHJpZXMsIHJhbmtDb21wYXJlLCBmdWxsQ29tcGFyZSkgPT4ge1xuICBhc3NlcnRSYW5rU29ydGVkKGJhZ0VudHJpZXMsIHJhbmtDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGJhZ0VudHJpZXM7XG4gIGxldCBpID0gMDtcbiAgbGV0IG9wdElubmVySXRlcmF0b3I7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PlxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChvcHRJbm5lckl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2gqL1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYmFnRW50cmllc1tpXTtcbiAgICAgICAgICAgIGxldCBqID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgIGogPCBsZW5ndGggJiZcbiAgICAgICAgICAgICAgcmFua0NvbXBhcmUoZW50cnlbMF0sIGJhZ0VudHJpZXNbal1bMF0pID09PSAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaiArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGogPT09IGkgKyAxKSB7XG4gICAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBlbnRyeSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNpbWlsYXJSdW4gPSBiYWdFbnRyaWVzLnNsaWNlKGksIGopO1xuICAgICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgICBjb25zdCByZXNvcnRlZCA9IHNvcnRCeVJhbmsoc2ltaWxhclJ1biwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgICAgLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuICAgICAgICAgICAgLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuICAgICAgICAgICAgLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuICAgICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKHJlc29ydGVkLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSByYXcgSlMgYXJyYXkgaXRlcmF0b3Igd2hvc2UgYC5uZXh0KClgIG1ldGhvZCovXG4gICAgICAgICAgICAvKiBkb2VzIG5vdCBoYXJkZW4gdGhlIEl0ZXJhdG9yUmVzdWx0LCBpbiB2aW9sYXRpb24gb2Ygb3VyKi9cbiAgICAgICAgICAgIC8qIGNvbnZlbnRpb25zLiBGaXhpbmcgdGhpcyBpcyBleHBlbnNpdmUgYW5kIEknbSBjb25maWRlbnQgdGhlKi9cbiAgICAgICAgICAgIC8qIHVuZnJvemVuIHZhbHVlIGRvZXMgbm90IGVzY2FwZSB0aGlzIGZpbGUsIHNvIEknbSBsZWF2aW5nIHRoaXMqL1xuICAgICAgICAgICAgLyogYXMgaXMuKi9cbiAgICAgICAgICAgIG9wdElubmVySXRlcmF0b3IgPSByZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgICAgICByZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogW251bGwsIDBuXSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB5YmFnRW50cmllc1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2UgPSAoeGJhZ0VudHJpZXMsIHliYWdFbnRyaWVzKSA9PiB7XG4gIC8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4gIC8qIHRvIHRoaXMgb25lIGBtZXJnZWAgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgY29uc3QgeHMgPSBiYWdXaW5kb3dSZXNvcnQoeGJhZ0VudHJpZXMsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB5cyA9IGJhZ1dpbmRvd1Jlc29ydCh5YmFnRW50cmllcywgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAvKiBUaGVzZSBzaXggYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuICAgICAgLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbiAgICAgIC8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuICAgICAgLyoqIEB0eXBlIHtUfSAqL1xuICAgICAgbGV0IHg7XG4gICAgICBsZXQgeGM7XG4gICAgICBsZXQgeERvbmU7XG4gICAgICAvKiogQHR5cGUge1R9ICovXG4gICAgICBsZXQgeTtcbiAgICAgIGxldCB5YztcbiAgICAgIGxldCB5RG9uZTtcblxuICAgICAgY29uc3QgeGkgPSB4c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBuZXh0WCA9ICgpID0+IHtcbiAgICAgICAgIXhEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgICAgICh7XG4gICAgICAgICAgZG9uZTogeERvbmUsXG4gICAgICAgICAgdmFsdWU6IFt4LCB4Y10sXG4gICAgICAgIH0gPSB4aS5uZXh0KCkpO1xuICAgICAgfTtcbiAgICAgIG5leHRYKCk7XG5cbiAgICAgIGNvbnN0IHlpID0geXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFkgPSAoKSA9PiB7XG4gICAgICAgICF5RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoe1xuICAgICAgICAgIGRvbmU6IHlEb25lLFxuICAgICAgICAgIHZhbHVlOiBbeSwgeWNdLFxuICAgICAgICB9ID0geWkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WSgpO1xuXG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIC8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG4gICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgIGlmICh4RG9uZSAmJiB5RG9uZSkge1xuICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIEJlY2F1c2UgdGhlIHRlcm1pbmF0aW5nIHZhbHVlIGRvZXMgbm90IG1hdHRlciovXG4gICAgICAgICAgICB2YWx1ZSA9IFtudWxsLCAwbiwgMG5dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeERvbmUpIHtcbiAgICAgICAgICAgIC8qIG9ubHkgeXMgYXJlIGxlZnQqL1xuICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIHljXTtcbiAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh5RG9uZSkge1xuICAgICAgICAgICAgLyogb25seSB4cyBhcmUgbGVmdCovXG4gICAgICAgICAgICB2YWx1ZSA9IFt4LCB4YywgMG5dO1xuICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29tcCA9IGZ1bGxDb21wYXJlKHgsIHkpO1xuICAgICAgICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgICAgICAgLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCB4YywgeWNdO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkge1xuICAgICAgICAgICAgICAvKiB4IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG4gICAgICAgICAgICAgIHZhbHVlID0gW3gsIHhjLCAwbl07XG4gICAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG4gICAgICAgICAgICAgIGNvbXAgPiAwIHx8IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbiAgICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIHljXTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmUsIHZhbHVlIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59O1xuaGFyZGVuKG1lcmdlKTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc1N1cGVyc2V0IGFzIHdlbGwuKi9cbi8qIFRoZSBnZW5lcmFsaXphdGlvbiBpcyBmcmVlLiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgYmFnSXRlcklzU3VwZXJiYWcgPSB4eWkgPT4ge1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPCB5Yykge1xuICAgICAgLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJiYWcgb2YgeSovXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc0Rpc2pvaW50IGFzIHdlbGwuKi9cbi8qIFRoZSBjb2RlIGlzIGlkZW50aWNhbC4qL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc0Rpc2pvaW50ID0geHlpID0+IHtcbiAgZm9yIChjb25zdCBbX20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID49IDFuICYmIHljID49IDFuKSB7XG4gICAgICAvKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludCxiaWdpbnRdW119IHh5aVxuICogQHJldHVybnMge1tULGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgYmFnSXRlclVuaW9uID0geHlpID0+IHtcbiAgLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIHJlc3VsdC5wdXNoKFttLCB4YyArIHljXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJbnRlcnNlY3Rpb24gPSB4eWkgPT4ge1xuICAvKiogQHR5cGUge1tULGJpZ2ludF1bXX0gKi9cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgY29uc3QgbWMgPSB4YyA8PSB5YyA/IHhjIDogeWM7XG4gICAgcmVzdWx0LnB1c2goW20sIG1jXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0ID0geHlpID0+IHtcbiAgLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGNvbnN0IG1jID0geGMgLSB5YztcbiAgICBtYyA+PSAwbiB8fCBGYWlsYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuICAgIGlmIChtYyA+PSAxbikge1xuICAgICAgLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbiAgICAgIHJlc3VsdC5wdXNoKFttLCBtY10pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgbWVyZ2VpZnkgPSBiYWdJdGVyT3AgPT4gKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykgPT5cbiAgYmFnSXRlck9wKG1lcmdlKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykpO1xuXG5jb25zdCBiYWdFbnRyaWVzSXNTdXBlcmJhZyA9IG1lcmdlaWZ5KGJhZ0l0ZXJJc1N1cGVyYmFnKTtcbmNvbnN0IGJhZ0VudHJpZXNJc0Rpc2pvaW50ID0gbWVyZ2VpZnkoYmFnSXRlcklzRGlzam9pbnQpO1xuY29uc3QgYmFnRW50cmllc1VuaW9uID0gbWVyZ2VpZnkoYmFnSXRlclVuaW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24gPSBtZXJnZWlmeShiYWdJdGVySW50ZXJzZWN0aW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0ID0gbWVyZ2VpZnkoYmFnSXRlckRpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdCYWdpZnkgPSBiYWdFbnRyaWVzT3AgPT4gKHhiYWcsIHliYWcpID0+XG4gIGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQsIHliYWcucGF5bG9hZCk7XG5cbmNvbnN0IGJhZ2lmeSA9IGJhZ0VudHJpZXNPcCA9PiAoeGJhZywgeWJhZykgPT5cbiAgbWFrZUJhZ09mRW50cmllcyhiYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLCB5YmFnLnBheWxvYWQpKTtcblxuICAgICAgIGNvbnN0IGJhZ0lzU3VwZXJiYWcgPSByYXdCYWdpZnkoYmFnRW50cmllc0lzU3VwZXJiYWcpOyRozY9fb25jZS5iYWdJc1N1cGVyYmFnKGJhZ0lzU3VwZXJiYWcpO1xuICAgICAgIGNvbnN0IGJhZ0lzRGlzam9pbnQgPSByYXdCYWdpZnkoYmFnRW50cmllc0lzRGlzam9pbnQpOyRozY9fb25jZS5iYWdJc0Rpc2pvaW50KGJhZ0lzRGlzam9pbnQpO1xuICAgICAgIGNvbnN0IGJhZ1VuaW9uID0gYmFnaWZ5KGJhZ0VudHJpZXNVbmlvbik7JGjNj19vbmNlLmJhZ1VuaW9uKGJhZ1VuaW9uKTtcbiAgICAgICBjb25zdCBiYWdJbnRlcnNlY3Rpb24gPSBiYWdpZnkoYmFnRW50cmllc0ludGVyc2VjdGlvbik7JGjNj19vbmNlLmJhZ0ludGVyc2VjdGlvbihiYWdJbnRlcnNlY3Rpb24pO1xuICAgICAgIGNvbnN0IGJhZ0Rpc2pvaW50U3VidHJhY3QgPSBiYWdpZnkoYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3QpOyRozY9fb25jZS5iYWdEaXNqb2ludFN1YnRyYWN0KGJhZ0Rpc2pvaW50U3VidHJhY3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIl0sImJhZ0lzRGlzam9pbnQiOlsiYmFnSXNEaXNqb2ludCJdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiJdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIl0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB0H48ZZS8AAGUvAAA1AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyIsIi4vY29weVNldC5qcyJdLCJleHBvcnRzIjpbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFVuaW9uIiwic2V0SW50ZXJzZWN0aW9uIiwic2V0SXNEaXNqb2ludCIsInNldElzU3VwZXJzZXQiLCJzZXRVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmsscSxGYWlsLGFzc2VydE5vRHVwbGljYXRlcyxtYWtlU2V0T2ZFbGVtZW50czskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIixbJGjNj19hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVzXCIsWyRozY9fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVzID0gJGjNj19hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsWyRozY9fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7RnVsbENvbXBhcmUsIFJhbmtDb21wYXJlfSBmcm9tICdAZW5kby9tYXJzaGFsJ1xuICogQGltcG9ydCB7S2V5Q29tcGFyaXNvbn0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKi9cblxuLyogVE9ETyBzaGFyZSBtb3JlIGNvZGUgd2l0aCBrZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcy4qL1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBgZWxlbWVudHNgIGlzIGFscmVhZHkgcmFuayBzb3J0ZWQgYnkgYHJhbmtDb21wYXJlYCwgd2hlcmUgdGhlcmVcbiAqIG1heSBiZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgZWxlbWVudHMgdGllZCBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIFJldHVybnMgYW4gaXRlcmFibGUgdGhhdCB3aWxsIGVudW1lcmF0ZSBhbGwgdGhlIGVsZW1lbnRzIGluIG9yZGVyXG4gKiBhY2NvcmRpbmcgdG8gYGZ1bGxPcmRlcmAsIHdoaWNoIHNob3VsZCBkaWZmZXIgZnJvbSBgcmFua09yZGVyYCBvbmx5XG4gKiBieSBiZWluZyBtb3JlIHByZWNpc2UuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byByZXNvcnRpbmcgdGhlIGVudGlyZSBgZWxlbWVudHNgIGFycmF5IGFjY29yZGluZ1xuICogIHRvIGBmdWxsT3JkZXJgLiBIb3dldmVyLCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXNlIGNvbnRpZ3VvdXNcbiAqIHJ1bnMgdGhhdCBuZWVkIHRvIGJlIHJlc29ydGVkIGFyZSBlaXRoZXIgYWJzZW50IG9yIHNtYWxsLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0IHdpbmRvd1Jlc29ydCA9IChlbGVtZW50cywgcmFua0NvbXBhcmUsIGZ1bGxDb21wYXJlKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoZWxlbWVudHMsIHJhbmtDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGVsZW1lbnRzO1xuICBsZXQgaSA9IDA7XG4gIGxldCBvcHRJbm5lckl0ZXJhdG9yO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT5cbiAgICAgIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAob3B0SW5uZXJJdGVyYXRvcikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgb3B0SW5uZXJJdGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoKi9cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnRzW2ldO1xuICAgICAgICAgICAgbGV0IGogPSBpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICYmIHJhbmtDb21wYXJlKHZhbHVlLCBlbGVtZW50c1tqXSkgPT09IDApIHtcbiAgICAgICAgICAgICAgaiArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGogPT09IGkgKyAxKSB7XG4gICAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2ltaWxhclJ1biA9IGVsZW1lbnRzLnNsaWNlKGksIGopO1xuICAgICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgICBjb25zdCByZXNvcnRlZCA9IHNvcnRCeVJhbmsoc2ltaWxhclJ1biwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgICAgLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuICAgICAgICAgICAgLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuICAgICAgICAgICAgLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuICAgICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVzKHJlc29ydGVkLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSByYXcgSlMgYXJyYXkgaXRlcmF0b3Igd2hvc2UgYC5uZXh0KClgIG1ldGhvZCovXG4gICAgICAgICAgICAvKiBkb2VzIG5vdCBoYXJkZW4gdGhlIEl0ZXJhdG9yUmVzdWx0LCBpbiB2aW9sYXRpb24gb2Ygb3VyKi9cbiAgICAgICAgICAgIC8qIGNvbnZlbnRpb25zLiBGaXhpbmcgdGhpcyBpcyBleHBlbnNpdmUgYW5kIEknbSBjb25maWRlbnQgdGhlKi9cbiAgICAgICAgICAgIC8qIHVuZnJvemVuIHZhbHVlIGRvZXMgbm90IGVzY2FwZSB0aGlzIGZpbGUsIHNvIEknbSBsZWF2aW5nIHRoaXMqL1xuICAgICAgICAgICAgLyogYXMgaXMuKi9cbiAgICAgICAgICAgIG9wdElubmVySXRlcmF0b3IgPSByZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgICAgICByZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7VFtdfSB4ZWxlbWVudHNcbiAqIEBwYXJhbSB7VFtdfSB5ZWxlbWVudHNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59XG4gKi9cbmNvbnN0IG1lcmdlID0gKHhlbGVtZW50cywgeWVsZW1lbnRzKSA9PiB7XG4gIC8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4gIC8qIHRvIHRoaXMgb25lIGBtZXJnZWAgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgY29uc3QgeHMgPSB3aW5kb3dSZXNvcnQoeGVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeXMgPSB3aW5kb3dSZXNvcnQoeWVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIC8qIFRoZXNlIGZvdXIgYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuICAgICAgLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbiAgICAgIC8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuICAgICAgLyoqIEB0eXBlIHtUfSAqL1xuICAgICAgbGV0IHg7XG4gICAgICBsZXQgeERvbmU7XG4gICAgICAvKiogQHR5cGUge1R9ICovXG4gICAgICBsZXQgeTtcbiAgICAgIGxldCB5RG9uZTtcblxuICAgICAgY29uc3QgeGkgPSB4c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBuZXh0WCA9ICgpID0+IHtcbiAgICAgICAgIXhEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgICAgICh7IGRvbmU6IHhEb25lLCB2YWx1ZTogeCB9ID0geGkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WCgpO1xuXG4gICAgICBjb25zdCB5aSA9IHlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IG5leHRZID0gKCkgPT4ge1xuICAgICAgICAheURvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICAgICAgKHsgZG9uZTogeURvbmUsIHZhbHVlOiB5IH0gPSB5aS5uZXh0KCkpO1xuICAgICAgfTtcbiAgICAgIG5leHRZKCk7XG5cbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgICAgICAgLyoqIEB0eXBlIHtbVCxiaWdpbnQsYmlnaW50XX0gKi9cbiAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgaWYgKHhEb25lICYmIHlEb25lKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbiAgICAgICAgICAgIHZhbHVlID0gW251bGwsIDBuLCAwbl07XG4gICAgICAgICAgfSBlbHNlIGlmICh4RG9uZSkge1xuICAgICAgICAgICAgLyogb25seSB5cyBhcmUgbGVmdCovXG4gICAgICAgICAgICB2YWx1ZSA9IFt5LCAwbiwgMW5dO1xuICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHlEb25lKSB7XG4gICAgICAgICAgICAvKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbiAgICAgICAgICAgIHZhbHVlID0gW3gsIDFuLCAwbl07XG4gICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb21wID0gZnVsbENvbXBhcmUoeCwgeSk7XG4gICAgICAgICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICAgICAgICAvKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG4gICAgICAgICAgICAgIHZhbHVlID0gW3gsIDFuLCAxbl07XG4gICAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4gICAgICAgICAgICAgIC8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgMW4sIDBuXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbiAgICAgICAgICAgICAgY29tcCA+IDAgfHwgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt5LCAwbiwgMW5dO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZSwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07XG5oYXJkZW4obWVyZ2UpO1xuXG5jb25zdCBpdGVySXNTdXBlcnNldCA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgX3ljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPT09IDBuKSB7XG4gICAgICAvKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcnNldCBvZiB5Ki9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXRlcklzRGlzam9pbnQgPSB4eWkgPT4ge1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMW4gJiYgeWMgPj0gMW4pIHtcbiAgICAgIC8qIFNvbWV0aGluZyBpbiBib3RoLCBzbyBub3QgZGlzam9pbnQqL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtLZXlDb21wYXJpc29ufVxuICovXG5jb25zdCBpdGVyQ29tcGFyZSA9IHh5aSA9PiB7XG4gIGxldCBsb25lWSA9IGZhbHNlO1xuICBsZXQgbG9uZVggPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbX20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID09PSAwbikge1xuICAgICAgLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG4gICAgICBsb25lWSA9IHRydWU7XG4gICAgfVxuICAgIGlmICh5YyA9PT0gMG4pIHtcbiAgICAgIC8qIHNvbWV0aGluZyBpbiB4IGlzIG5vdCBpbiB5LCBzbyB5IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHgqL1xuICAgICAgbG9uZVggPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobG9uZVggJiYgbG9uZVkpIHtcbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICB9XG4gIGlmIChsb25lWCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2UgaWYgKGxvbmVZKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2Uge1xuICAgICghbG9uZVggJiYgIWxvbmVZKSB8fFxuICAgICAgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCwgbG9uZVldKX1gO1xuICAgIHJldHVybiAwO1xuICB9XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyVW5pb24gPSB4eWkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMG4pIHtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB5YyA+PSAwbiB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbiAgICAgIC8qIGlmIHggYW5kIHkgd2VyZSBib3RoIHJlYWR5LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50IGFuZCovXG4gICAgICAvKiBhYm92ZSBjbGF1c2UgYWxyZWFkeSB0b29rIGNhcmUgb2YgaXQuIE90aGVyd2lzZSBwdXNoIGhlcmUuKi9cbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlckRpc2pvaW50VW5pb24gPSB4eWkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICB4YyA9PT0gMG4gfHwgeWMgPT09IDBuIHx8IEZhaWxgU2V0cyBtdXN0IG5vdCBoYXZlIGNvbW1vbiBlbGVtZW50czogJHttfWA7XG4gICAgaWYgKHhjID49IDFuKSB7XG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgeWMgPj0gMW4gfHwgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJJbnRlcnNlY3Rpb24gPSB4eWkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMW4gJiYgeWMgPj0gMW4pIHtcbiAgICAgIC8qIElmIHRoZXkgYXJlIGJvdGggcHJlc2VudCwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCovXG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFN1YnRyYWN0ID0geHlpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgeGMgPj0gMW4gfHwgRmFpbGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbiAgICBpZiAoeWMgPT09IDBuKSB7XG4gICAgICAvKiB0aGUgeCB3YXMgbm90IGluIHkqL1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBtZXJnZWlmeSA9IGl0ZXJPcCA9PiAoeGVsZW1lbnRzLCB5ZWxlbWVudHMpID0+XG4gIGl0ZXJPcChtZXJnZSh4ZWxlbWVudHMsIHllbGVtZW50cykpO1xuXG4gICAgICAgY29uc3QgZWxlbWVudHNJc1N1cGVyc2V0ID0gbWVyZ2VpZnkoaXRlcklzU3VwZXJzZXQpOyRozY9fb25jZS5lbGVtZW50c0lzU3VwZXJzZXQoZWxlbWVudHNJc1N1cGVyc2V0KTtcbiAgICAgICBjb25zdCBlbGVtZW50c0lzRGlzam9pbnQgPSBtZXJnZWlmeShpdGVySXNEaXNqb2ludCk7JGjNj19vbmNlLmVsZW1lbnRzSXNEaXNqb2ludChlbGVtZW50c0lzRGlzam9pbnQpO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzQ29tcGFyZSA9IG1lcmdlaWZ5KGl0ZXJDb21wYXJlKTskaM2PX29uY2UuZWxlbWVudHNDb21wYXJlKGVsZW1lbnRzQ29tcGFyZSk7XG4gICAgICAgY29uc3QgZWxlbWVudHNVbmlvbiA9IG1lcmdlaWZ5KGl0ZXJVbmlvbik7JGjNj19vbmNlLmVsZW1lbnRzVW5pb24oZWxlbWVudHNVbmlvbik7XG4gICAgICAgY29uc3QgZWxlbWVudHNEaXNqb2ludFVuaW9uID0gbWVyZ2VpZnkoaXRlckRpc2pvaW50VW5pb24pOyRozY9fb25jZS5lbGVtZW50c0Rpc2pvaW50VW5pb24oZWxlbWVudHNEaXNqb2ludFVuaW9uKTtcbiAgICAgICBjb25zdCBlbGVtZW50c0ludGVyc2VjdGlvbiA9IG1lcmdlaWZ5KGl0ZXJJbnRlcnNlY3Rpb24pOyRozY9fb25jZS5lbGVtZW50c0ludGVyc2VjdGlvbihlbGVtZW50c0ludGVyc2VjdGlvbik7XG4gICAgICAgY29uc3QgZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0ID0gbWVyZ2VpZnkoaXRlckRpc2pvaW50U3VidHJhY3QpOyRozY9fb25jZS5lbGVtZW50c0Rpc2pvaW50U3VidHJhY3QoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3U2V0aWZ5ID0gZWxlbWVudHNPcCA9PiAoeHNldCwgeXNldCkgPT5cbiAgZWxlbWVudHNPcCh4c2V0LnBheWxvYWQsIHlzZXQucGF5bG9hZCk7XG5cbmNvbnN0IHNldGlmeSA9IGVsZW1lbnRzT3AgPT4gKHhzZXQsIHlzZXQpID0+XG4gIG1ha2VTZXRPZkVsZW1lbnRzKGVsZW1lbnRzT3AoeHNldC5wYXlsb2FkLCB5c2V0LnBheWxvYWQpKTtcblxuICAgICAgIGNvbnN0IHNldElzU3VwZXJzZXQgPSByYXdTZXRpZnkoZWxlbWVudHNJc1N1cGVyc2V0KTskaM2PX29uY2Uuc2V0SXNTdXBlcnNldChzZXRJc1N1cGVyc2V0KTtcbiAgICAgICBjb25zdCBzZXRJc0Rpc2pvaW50ID0gcmF3U2V0aWZ5KGVsZW1lbnRzSXNEaXNqb2ludCk7JGjNj19vbmNlLnNldElzRGlzam9pbnQoc2V0SXNEaXNqb2ludCk7XG4gICAgICAgY29uc3Qgc2V0VW5pb24gPSBzZXRpZnkoZWxlbWVudHNVbmlvbik7JGjNj19vbmNlLnNldFVuaW9uKHNldFVuaW9uKTtcbiAgICAgICBjb25zdCBzZXREaXNqb2ludFVuaW9uID0gc2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRVbmlvbik7JGjNj19vbmNlLnNldERpc2pvaW50VW5pb24oc2V0RGlzam9pbnRVbmlvbik7XG4gICAgICAgY29uc3Qgc2V0SW50ZXJzZWN0aW9uID0gc2V0aWZ5KGVsZW1lbnRzSW50ZXJzZWN0aW9uKTskaM2PX29uY2Uuc2V0SW50ZXJzZWN0aW9uKHNldEludGVyc2VjdGlvbik7XG4gICAgICAgY29uc3Qgc2V0RGlzam9pbnRTdWJ0cmFjdCA9IHNldGlmeShlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpOyRozY9fb25jZS5zZXREaXNqb2ludFN1YnRyYWN0KHNldERpc2pvaW50U3VidHJhY3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZWxlbWVudHNJc1N1cGVyc2V0IjpbImVsZW1lbnRzSXNTdXBlcnNldCJdLCJlbGVtZW50c0lzRGlzam9pbnQiOlsiZWxlbWVudHNJc0Rpc2pvaW50Il0sImVsZW1lbnRzQ29tcGFyZSI6WyJlbGVtZW50c0NvbXBhcmUiXSwiZWxlbWVudHNVbmlvbiI6WyJlbGVtZW50c1VuaW9uIl0sImVsZW1lbnRzRGlzam9pbnRVbmlvbiI6WyJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSwiZWxlbWVudHNJbnRlcnNlY3Rpb24iOlsiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IjpbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLCJzZXRJc1N1cGVyc2V0IjpbInNldElzU3VwZXJzZXQiXSwic2V0SXNEaXNqb2ludCI6WyJzZXRJc0Rpc2pvaW50Il0sInNldFVuaW9uIjpbInNldFVuaW9uIl0sInNldERpc2pvaW50VW5pb24iOlsic2V0RGlzam9pbnRVbmlvbiJdLCJzZXRJbnRlcnNlY3Rpb24iOlsic2V0SW50ZXJzZWN0aW9uIl0sInNldERpc2pvaW50U3VidHJhY3QiOlsic2V0RGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABdGlpCKy8AACsvAAA2AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiLi9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuLi9rZXlzL2NoZWNrS2V5LmpzIl0sImV4cG9ydHMiOlsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiLCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiLCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgb2JqZWN0TWFwLEFyZ0d1YXJkTGlzdFNoYXBlLEF3YWl0QXJnR3VhcmRTaGFwZSxJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSxJbnRlcmZhY2VHdWFyZFNoYXBlLE0sTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsTWV0aG9kR3VhcmRTaGFwZSxSYXdHdWFyZFNoYXBlLFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlLFN5bmNWYWx1ZUd1YXJkU2hhcGUsYXNzZXJ0QXdhaXRBcmdHdWFyZCxtYXRjaGVzLG11c3RNYXRjaCxnZXRDb3B5TWFwS2V5cyxtYWtlQ29weU1hcDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCIuL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wiQXJnR3VhcmRMaXN0U2hhcGVcIixbJGjNj19hID0+IChBcmdHdWFyZExpc3RTaGFwZSA9ICRozY9fYSldXSxbXCJBd2FpdEFyZ0d1YXJkU2hhcGVcIixbJGjNj19hID0+IChBd2FpdEFyZ0d1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGVcIixbJGjNj19hID0+IChJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSA9ICRozY9fYSldXSxbXCJJbnRlcmZhY2VHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoSW50ZXJmYWNlR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJNZXRob2RHdWFyZFBheWxvYWRTaGFwZVwiLFskaM2PX2EgPT4gKE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlID0gJGjNj19hKV1dLFtcIk1ldGhvZEd1YXJkU2hhcGVcIixbJGjNj19hID0+IChNZXRob2RHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIlJhd0d1YXJkU2hhcGVcIixbJGjNj19hID0+IChSYXdHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlXCIsWyRozY9fYSA9PiAoU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUgPSAkaM2PX2EpXV0sW1wiU3luY1ZhbHVlR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKFN5bmNWYWx1ZUd1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0QXdhaXRBcmdHdWFyZFwiLFskaM2PX2EgPT4gKGFzc2VydEF3YWl0QXJnR3VhcmQgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiZ2V0Q29weU1hcEtleXNcIixbJGjNj19hID0+IChnZXRDb3B5TWFwS2V5cyA9ICRozY9fYSldXSxbXCJtYWtlQ29weU1hcFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1JlbW90YWJsZU1ldGhvZE5hbWV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7QXdhaXRBcmdHdWFyZCwgQXdhaXRBcmdHdWFyZFBheWxvYWQsIEludGVyZmFjZUd1YXJkLCBJbnRlcmZhY2VHdWFyZFBheWxvYWQsIE1ldGhvZEd1YXJkLCBNZXRob2RHdWFyZFBheWxvYWR9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qIFRoZSBnZXQqR3VhcmRQYXlsb2FkIGZ1bmN0aW9ucyBleGlzdCB0byBhZGFwdCB0byB0aGUgd29ybGRzIGJvdGgqL1xuLyogYmVmb3JlIGFuZCBhZnRlciBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzEyIC4gV2hlbiovXG4vKiBnaXZlbiBzb21ldGhpbmcgdGhhdCB3b3VsZCBiZSB0aGUgZXhwZWN0ZWQgZ3VhcmQgaW4gZWl0aGVyIHdvcmxkLCovXG4vKiBpdCByZXR1cm5zIGEgKkd1YXJkUGF5bG9hZCB0aGF0IGlzIHZhbGlkIGluIHRoZSBjdXJyZW50IHdvcmxkLiBUaHVzKi9cbi8qIGl0IGhlbHBzIG5ldyBjb25zdW1lcnMgb2YgdGhlc2UgZ3VhcmRzIGNvcGUgd2l0aCBvbGQgY29kZSB0aGF0Ki9cbi8qIHdvdWxkIGNvbnN0cnVjdCBhbmQgc2VuZCB0aGVzZSBndWFyZHMuKi9cblxuLyogQmVjYXVzZSB0aGUgbWFpbiB1c2UgY2FzZSBmb3IgdGhpcyBsZWdhY3kgYWRhcHRhdGlvbiBpcyBpbiBAZW5kby9leG8qL1xuLyogb3IgcGFja2FnZXMgdGhhdCBkZXBlbmQgb24gaXQsIHRoZSB0ZXN0cyBmb3IgdGhpcyBsZWdhY3kgYWRhcHRhdGlvbiovXG4vKiBhcmUgZm91bmQgaW4gdGhlIEBlbmRvL2V4byBgdGVzdC1sZWdhY3ktZ3VhcmQtdG9sZXJhbmNlLmpzYC4qL1xuXG4vKiBVbmxpa2UgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlLCBMZWdhY3lNZXRob2RHdWFyZFNoYXBlLCovXG4vKiBhbmQgTGVnYWN5SW50ZXJmYWNlR3VhcmRTaGFwZSwgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYSovXG4vKiBMZWdhY3lSYXdHdWFyZFNoYXBlLCBiZWNhdXNlIHJhdyBndWFyZHMgd2VyZSBpbnRyb2R1Y2VkIGF0Ki9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE4MzEgLCB3aGljaCB3YXMgbWVyZ2VkIHdlbGwgYWZ0ZXIqL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMiAuIFRodXMsIHRoZXJlIHdhcyBuZXZlciBhKi9cbi8qIGBrbGFzczpgIGZvcm0gb2YgdGhlIHJhdyBndWFyZC4qL1xuXG4vKiBUT0RPIEF0IHN1Y2ggYSB0aW1lIHRoYXQgd2UgZGVjaWRlIHdlIG5vIGxvbmdlciBuZWVkIHRvIHN1cHBvcnQgY29kZSovXG4vKiBwcmVjZWRpbmcgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMiBvciBndWFyZCBkYXRhKi9cbi8qIGdlbmVyYXRlZCBieSB0aGF0IGNvZGUsIGFsbCB0aGUgYWRhcHRhdGlvbiBjb21wbGV4aXR5IGluIHRoaXMgZmlsZSovXG4vKiBzaG91bGQgYmUgZGVsZXRlZC4qL1xuXG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggQXdhaXRBcmdHdWFyZFBheWxvYWRTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSA9IGhhcmRlbih7XG4gIGtsYXNzOiAnYXdhaXRBcmcnLFxuICBhcmdHdWFyZDogTS5wYXR0ZXJuKCksXG59KTtcblxuLyoqXG4gKiBCeSB1c2luZyB0aGlzIGFic3RyYWN0aW9uIHJhdGhlciB0aGFuIGFjY2Vzc2luZyB0aGUgcHJvcGVydGllcyBkaXJlY3RseSxcbiAqIHdlIHNtb290aCB0aGUgdHJhbnNpdGlvbiB0byBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzEyLFxuICogdG9sZXJhdGluZyBib3RoIHRoZSBsZWdhY3kgYW5kIGN1cnJlbnQgZ3VhcmQgc2hhcGVzLlxuICpcbiAqIE5vdGUgdGhhdCB0ZWNobmljYWxseSwgdG9sZXJhdGluZyB0aGUgb2xkIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZVxuICogaXMgYW4gZXhwbG9pdGFibGUgYnVnLCBpbiB0aGF0IGEgcmVjb3JkIHRoYXQgbWF0Y2hlcyB0aGlzXG4gKiBzaGFwZSBpcyBhbHNvIGEgdmFsaWQgcGFyYW1ldGVyIHBhdHRlcm4gdGhhdCBzaG91bGQgYWxsb3dcbiAqIGFuIGFyZ3VtZW50IHRoYXQgbWF0Y2hlcyB0aGF0IHBhdHRlcm4sIGkuZS4sIGEgY29weVJlY29yZCBhcmd1bWVudCB0aGF0XG4gKiBhdCBsZWFzdCBjb250YWlucyBhIGBrbGFzczogJ2F3YWl0QXJnR3VhcmQnYCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge0F3YWl0QXJnR3VhcmR9IGF3YWl0QXJnR3VhcmRcbiAqIEByZXR1cm5zIHtBd2FpdEFyZ0d1YXJkUGF5bG9hZH1cbiAqL1xuICAgICAgIGNvbnN0IGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkID0gYXdhaXRBcmdHdWFyZCA9PiB7XG4gIGlmIChtYXRjaGVzKGF3YWl0QXJnR3VhcmQsIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSkpIHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIGNvbnN0IHsga2xhc3M6IF8sIC4uLnBheWxvYWQgfSA9IGF3YWl0QXJnR3VhcmQ7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuICBhc3NlcnRBd2FpdEFyZ0d1YXJkKGF3YWl0QXJnR3VhcmQpO1xuICByZXR1cm4gYXdhaXRBcmdHdWFyZC5wYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKTtcblxuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIFN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeVN5bmNNZXRob2RHdWFyZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGtsYXNzOiAnbWV0aG9kR3VhcmQnLFxuICAgIGNhbGxLaW5kOiAnc3luYycsXG4gICAgYXJnR3VhcmRzOiBTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxcbiAgICByZXR1cm5HdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbiAge1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzOiBTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxcbiAgICByZXN0QXJnR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG4gIH0sXG4pO1xuXG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggQXJnR3VhcmRTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeUFyZ0d1YXJkU2hhcGUgPSBNLm9yKFxuICBSYXdHdWFyZFNoYXBlLFxuICBBd2FpdEFyZ0d1YXJkU2hhcGUsXG4gIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSxcbiAgTS5wYXR0ZXJuKCksXG4pO1xuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIEFyZ0d1YXJkTGlzdFNoYXBlKi9cbi8qIGJlY2F1c2UgdGhpcyBvbmUgbmVlZHMgdG8gYmUgc3RhYmxlIGFuZCBhY2NvbW1vZGF0ZSBuZXN0ZWQgbGVnYWN5LCovXG4vKiB3aGVuIHRoYXQncyBhbiBpc3N1ZS4qL1xuY29uc3QgTGVnYWN5QXJnR3VhcmRMaXN0U2hhcGUgPSBNLmFycmF5T2YoTGVnYWN5QXJnR3VhcmRTaGFwZSk7XG5cbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBBc3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlKi9cbi8qIGJlY2F1c2UgdGhpcyBvbmUgbmVlZHMgdG8gYmUgc3RhYmxlIGFuZCBhY2NvbW1vZGF0ZSBuZXN0ZWQgbGVnYWN5LCovXG4vKiB3aGVuIHRoYXQncyBhbiBpc3N1ZS4qL1xuY29uc3QgTGVnYWN5QXN5bmNNZXRob2RHdWFyZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGtsYXNzOiAnbWV0aG9kR3VhcmQnLFxuICAgIGNhbGxLaW5kOiAnYXN5bmMnLFxuICAgIGFyZ0d1YXJkczogTGVnYWN5QXJnR3VhcmRMaXN0U2hhcGUsXG4gICAgcmV0dXJuR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG4gIH0sXG4gIHtcbiAgICBvcHRpb25hbEFyZ0d1YXJkczogQXJnR3VhcmRMaXN0U2hhcGUsXG4gICAgcmVzdEFyZ0d1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxuICB9LFxuKTtcblxuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlKi9cbi8qIGJlY2F1c2UgdGhpcyBvbmUgbmVlZHMgdG8gYmUgc3RhYmxlIGFuZCBhY2NvbW1vZGF0ZSBuZXN0ZWQgbGVnYWN5LCovXG4vKiB3aGVuIHRoYXQncyBhbiBpc3N1ZS4qL1xuY29uc3QgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSA9IE0ub3IoXG4gIExlZ2FjeVN5bmNNZXRob2RHdWFyZFNoYXBlLFxuICBMZWdhY3lBc3luY01ldGhvZEd1YXJkU2hhcGUsXG4pO1xuXG5jb25zdCBhZGFwdExlZ2FjeUFyZ0d1YXJkID0gYXJnR3VhcmQgPT5cbiAgbWF0Y2hlcyhhcmdHdWFyZCwgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlKVxuICAgID8gTS5hd2FpdChnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZChhcmdHdWFyZCkuYXJnR3VhcmQpXG4gICAgOiBhcmdHdWFyZDtcblxuLyoqXG4gKiBCeSB1c2luZyB0aGlzIGFic3RyYWN0aW9uIHJhdGhlciB0aGFuIGFjY2Vzc2luZyB0aGUgcHJvcGVydGllcyBkaXJlY3RseSxcbiAqIHdlIHNtb290aCB0aGUgdHJhbnNpdGlvbiB0byBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzEyLFxuICogdG9sZXJhdGluZyBib3RoIHRoZSBsZWdhY3kgYW5kIGN1cnJlbnQgZ3VhcmQgc2hhcGVzLlxuICpcbiAqIFVubGlrZSBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUsIHRvbGVyYXRpbmcgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZVxuICogZG9lcyBub3Qgc2VlbSBsaWtlIGEgY3VycmVudGx5IGV4cGxvaXRhYmxlIGJ1ZywgYmVjYXVzZSB0aGVyZSBpcyBub3RcbiAqIGN1cnJlbnRseSBhbnkgY29udGV4dCB3aGVyZSBlaXRoZXIgYSBtZXRob2RHdWFyZCBvciBhIGNvcHlSZWNvcmQgd291bGRcbiAqIGJvdGggYmUgbWVhbmluZ2Z1bC5cbiAqXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHJldHVybnMge01ldGhvZEd1YXJkUGF5bG9hZH1cbiAqL1xuICAgICAgIGNvbnN0IGdldE1ldGhvZEd1YXJkUGF5bG9hZCA9IG1ldGhvZEd1YXJkID0+IHtcbiAgaWYgKG1hdGNoZXMobWV0aG9kR3VhcmQsIE1ldGhvZEd1YXJkU2hhcGUpKSB7XG4gICAgcmV0dXJuIG1ldGhvZEd1YXJkLnBheWxvYWQ7XG4gIH1cbiAgbXVzdE1hdGNoKG1ldGhvZEd1YXJkLCBMZWdhY3lNZXRob2RHdWFyZFNoYXBlLCAnbGVnYWN5TWV0aG9kR3VhcmQnKTtcbiAgY29uc3Qge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAga2xhc3M6IF8sXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICBjYWxsS2luZCxcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIHJldHVybkd1YXJkLFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgcmVzdEFyZ0d1YXJkLFxuICB9ID0gbWV0aG9kR3VhcmQ7XG4gIGxldCB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICBhcmdHdWFyZHMsXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICBvcHRpb25hbEFyZ0d1YXJkcyxcbiAgfSA9IG1ldGhvZEd1YXJkO1xuICBpZiAoY2FsbEtpbmQgPT09ICdhc3luYycpIHtcbiAgICBhcmdHdWFyZHMgPSBhcmdHdWFyZHMubWFwKGFkYXB0TGVnYWN5QXJnR3VhcmQpO1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzID1cbiAgICAgIG9wdGlvbmFsQXJnR3VhcmRzICYmIG9wdGlvbmFsQXJnR3VhcmRzLm1hcChhZGFwdExlZ2FjeUFyZ0d1YXJkKTtcbiAgfVxuICBjb25zdCBwYXlsb2FkID0gaGFyZGVuKHtcbiAgICBjYWxsS2luZCxcbiAgICBhcmdHdWFyZHMsXG4gICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgcmVzdEFyZ0d1YXJkLFxuICAgIHJldHVybkd1YXJkLFxuICB9KTtcbiAgLyogZW5zdXJlIHRoZSBhZGFwdGF0aW9uIHN1Y2NlZWRlZC4qL1xuICBtdXN0TWF0Y2gocGF5bG9hZCwgTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsICdpbnRlcm5hbE1ldGhvZEd1YXJkQWRhcHRvcicpO1xuICByZXR1cm4gcGF5bG9hZDtcbn07JGjNj19vbmNlLmdldE1ldGhvZEd1YXJkUGF5bG9hZChnZXRNZXRob2RHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldE1ldGhvZEd1YXJkUGF5bG9hZCk7XG5cbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAga2xhc3M6ICdJbnRlcmZhY2UnLFxuICAgIGludGVyZmFjZU5hbWU6IE0uc3RyaW5nKCksXG4gICAgbWV0aG9kR3VhcmRzOiBNLnJlY29yZE9mKFxuICAgICAgTS5zdHJpbmcoKSxcbiAgICAgIE0ub3IoTWV0aG9kR3VhcmRTaGFwZSwgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSksXG4gICAgKSxcbiAgfSxcbiAge1xuICAgIGRlZmF1bHRHdWFyZHM6IE0ub3IoTS51bmRlZmluZWQoKSwgJ3Bhc3NhYmxlJywgJ3JhdycpLFxuICAgIHNsb3BweTogTS5ib29sZWFuKCksXG4gICAgLyogVGhlcmUgaXMgbm8gbmVlZCB0byBhY2NvbW1vZGF0ZSBMZWdhY3lNZXRob2RHdWFyZFNoYXBlIGluKi9cbiAgICAvKiB0aGlzIHBvc2l0aW9uLCBzaW5jZSBgc3ltYm9sTWV0aG9kR3VhcmRzIGhhcHBlbmVkKi9cbiAgICAvKiBhZnRlciBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzEyKi9cbiAgICBzeW1ib2xNZXRob2RHdWFyZHM6IE0ubWFwT2YoTS5zeW1ib2woKSwgTWV0aG9kR3VhcmRTaGFwZSksXG4gIH0sXG4pO1xuXG5jb25zdCBhZGFwdE1ldGhvZEd1YXJkID0gbWV0aG9kR3VhcmQgPT4ge1xuICBpZiAobWF0Y2hlcyhtZXRob2RHdWFyZCwgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSkpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsS2luZCxcbiAgICAgIGFyZ0d1YXJkcyxcbiAgICAgIG9wdGlvbmFsQXJnR3VhcmRzID0gW10sXG4gICAgICByZXN0QXJnR3VhcmQgPSBNLmFueSgpLFxuICAgICAgcmV0dXJuR3VhcmQsXG4gICAgfSA9IGdldE1ldGhvZEd1YXJkUGF5bG9hZChtZXRob2RHdWFyZCk7XG4gICAgY29uc3QgbUNhbGwgPSBjYWxsS2luZCA9PT0gJ3N5bmMnID8gTS5jYWxsIDogTS5jYWxsV2hlbjtcbiAgICByZXR1cm4gbUNhbGwoLi4uYXJnR3VhcmRzKVxuICAgICAgLm9wdGlvbmFsKC4uLm9wdGlvbmFsQXJnR3VhcmRzKVxuICAgICAgLnJlc3QocmVzdEFyZ0d1YXJkKVxuICAgICAgLnJldHVybnMocmV0dXJuR3VhcmQpO1xuICB9XG4gIHJldHVybiBtZXRob2RHdWFyZDtcbn07XG5cbi8qKlxuICogQnkgdXNpbmcgdGhpcyBhYnN0cmFjdGlvbiByYXRoZXIgdGhhbiBhY2Nlc3NpbmcgdGhlIHByb3BlcnRpZXMgZGlyZWN0bHksXG4gKiB3ZSBzbW9vdGggdGhlIHRyYW5zaXRpb24gdG8gaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMixcbiAqIHRvbGVyYXRpbmcgYm90aCB0aGUgbGVnYWN5IGFuZCBjdXJyZW50IGd1YXJkIHNoYXBlcy5cbiAqXG4gKiBVbmxpa2UgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlLCB0b2xlcmF0aW5nIExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGVcbiAqIGRvZXMgbm90IHNlZW0gbGlrZSBhIGN1cnJlbnRseSBleHBsb2l0YWJsZSBidWcsIGJlY2F1c2UgdGhlcmUgaXMgbm90XG4gKiBjdXJyZW50bHkgYW55IGNvbnRleHQgd2hlcmUgZWl0aGVyIGFuIGludGVyZmFjZUd1YXJkIG9yIGEgY29weVJlY29yZCB3b3VsZFxuICogYm90aCBiZSBtZWFuaW5nZnVsLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFJlbW90YWJsZU1ldGhvZE5hbWUsIE1ldGhvZEd1YXJkPn0gW1Q9UmVjb3JkPFJlbW90YWJsZU1ldGhvZE5hbWUsIE1ldGhvZEd1YXJkPl1cbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQ8VD59IGludGVyZmFjZUd1YXJkXG4gKiBAcmV0dXJucyB7SW50ZXJmYWNlR3VhcmRQYXlsb2FkPFQ+fVxuICovXG4gICAgICAgY29uc3QgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gaW50ZXJmYWNlR3VhcmQgPT4ge1xuICBpZiAobWF0Y2hlcyhpbnRlcmZhY2VHdWFyZCwgSW50ZXJmYWNlR3VhcmRTaGFwZSkpIHtcbiAgICByZXR1cm4gaW50ZXJmYWNlR3VhcmQucGF5bG9hZDtcbiAgfVxuICBtdXN0TWF0Y2goaW50ZXJmYWNlR3VhcmQsIExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGUsICdsZWdhY3lJbnRlcmZhY2VHdWFyZCcpO1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbiAgbGV0IHsga2xhc3M6IF8sIGludGVyZmFjZU5hbWUsIG1ldGhvZEd1YXJkcywgLi4ucmVzdCB9ID0gaW50ZXJmYWNlR3VhcmQ7XG4gIG1ldGhvZEd1YXJkcyA9IG9iamVjdE1hcChtZXRob2RHdWFyZHMsIGFkYXB0TWV0aG9kR3VhcmQpO1xuICBjb25zdCBwYXlsb2FkID0gaGFyZGVuKHtcbiAgICBpbnRlcmZhY2VOYW1lLFxuICAgIG1ldGhvZEd1YXJkcyxcbiAgICAuLi5yZXN0LFxuICB9KTtcbiAgbXVzdE1hdGNoKFxuICAgIHBheWxvYWQsXG4gICAgSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUsXG4gICAgJ2ludGVybmFsSW50ZXJmYWNlR3VhcmRBZGFwdG9yJyxcbiAgKTtcbiAgcmV0dXJuIHBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQpO1xuXG5jb25zdCBlbXB0eUNvcHlNYXAgPSBtYWtlQ29weU1hcChbXSk7XG5cbi8qKlxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZH0gaW50ZXJmYWNlR3VhcmRcbiAqIEByZXR1cm5zIHsoc3RyaW5nIHwgc3ltYm9sKVtdfVxuICovXG4gICAgICAgY29uc3QgZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyA9IGludGVyZmFjZUd1YXJkID0+IHtcbiAgY29uc3QgeyBtZXRob2RHdWFyZHMsIHN5bWJvbE1ldGhvZEd1YXJkcyA9IGVtcHR5Q29weU1hcCB9ID1cbiAgICBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoaW50ZXJmYWNlR3VhcmQpO1xuICAvKiogQHR5cGUgeyhzdHJpbmcgfCBzeW1ib2wpW119ICovXG4gIC8qIFRPRE8gYXQtdHMtZXhwZWN0LWVycm9yIHdvcmtzIGxvY2FsbHkgYnV0IG5vdCBmcm9tIEBlbmRvL2V4byovXG4gIC8qIEB0cy1pZ25vcmUgaW5mZXJlbmNlIGlzIHRvbyB3ZWFrIHRvIHNlZSB0aGlzIGlzIG9rKi9cbiAgcmV0dXJuIGhhcmRlbihbXG4gICAgLi4uUmVmbGVjdC5vd25LZXlzKG1ldGhvZEd1YXJkcyksXG4gICAgLi4uZ2V0Q29weU1hcEtleXMoc3ltYm9sTWV0aG9kR3VhcmRzKSxcbiAgXSk7XG59OyRozY9fb25jZS5nZXRJbnRlcmZhY2VNZXRob2RLZXlzKGdldEludGVyZmFjZU1ldGhvZEtleXMpO1xuaGFyZGVuKGdldEludGVyZmFjZU1ldGhvZEtleXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiOlsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiXSwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIjpbImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiOlsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl0sImdldEludGVyZmFjZU1ldGhvZEtleXMiOlsiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABmpO57vjIBAL4yAQA1AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiLCJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiLCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyIsIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIi4uL2tleXMvY29tcGFyZUtleXMuanMiLCIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4va2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyJdLCJleHBvcnRzIjpbIkFyZ0d1YXJkTGlzdFNoYXBlIiwiQXdhaXRBcmdHdWFyZFNoYXBlIiwiSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUiLCJJbnRlcmZhY2VHdWFyZFNoYXBlIiwiTSIsIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlIiwiTWV0aG9kR3VhcmRTaGFwZSIsIlJhd0d1YXJkU2hhcGUiLCJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSIsIlN5bmNWYWx1ZUd1YXJkU2hhcGUiLCJhc3NlcnRBd2FpdEFyZ0d1YXJkIiwiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiLCJhc3NlcnRNZXRob2RHdWFyZCIsImFzc2VydFBhdHRlcm4iLCJhc3NlcnRSYXdHdWFyZCIsImNoZWNrTWF0Y2hlcyIsImNvbnRhaW5lckhhc1NwbGl0IiwiZGVmYXVsdExpbWl0cyIsImdldFJhbmtDb3ZlciIsImlzQXdhaXRBcmdHdWFyZCIsImlzUGF0dGVybiIsImlzUmF3R3VhcmQiLCJraW5kT2YiLCJtYXRjaGVzIiwibXVzdE1hdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxiLFgsRmFpbCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixpZGVudENoZWNrZXIsYXBwbHlMYWJlbGluZ0Vycm9yLGZyb21VbmlxdWVFbnRyaWVzLGxpc3REaWZmZXJlbmNlLGFzc2VydENoZWNrZXIsRmFyLGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxjb21wYXJlUmFuayxnZXRQYXNzU3R5bGVDb3ZlcixpbnRlcnNlY3RSYW5rQ292ZXJzLHVuaW9uUmFua0NvdmVycyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMscXAsa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZyxnZXRDb3B5TWFwRW50cnlBcnJheSxtYWtlQ29weU1hcCxtYWtlQ29weVNldCxtYWtlQ29weUJhZyxnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiYlwiLFskaM2PX2EgPT4gKGIgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qc1wiLCBbW1wiYXBwbHlMYWJlbGluZ0Vycm9yXCIsWyRozY9fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanNcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzXCIsIFtbXCJsaXN0RGlmZmVyZW5jZVwiLFskaM2PX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV0sW1wiZ2V0UGFzc1N0eWxlQ292ZXJcIixbJGjNj19hID0+IChnZXRQYXNzU3R5bGVDb3ZlciA9ICRozY9fYSldXSxbXCJpbnRlcnNlY3RSYW5rQ292ZXJzXCIsWyRozY9fYSA9PiAoaW50ZXJzZWN0UmFua0NvdmVycyA9ICRozY9fYSldXSxbXCJ1bmlvblJhbmtDb3ZlcnNcIixbJGjNj19hID0+ICh1bmlvblJhbmtDb3ZlcnMgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIixbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIixbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV0sW1wicXBcIixbJGjNj19hID0+IChxcCA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMvY29tcGFyZUtleXMuanNcIiwgW1tcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wia2V5R1RcIixbJGjNj19hID0+IChrZXlHVCA9ICRozY9fYSldXSxbXCJrZXlHVEVcIixbJGjNj19hID0+IChrZXlHVEUgPSAkaM2PX2EpXV0sW1wia2V5TFRcIixbJGjNj19hID0+IChrZXlMVCA9ICRozY9fYSldXSxbXCJrZXlMVEVcIixbJGjNj19hID0+IChrZXlMVEUgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiY2hlY2tLZXlcIixbJGjNj19hID0+IChjaGVja0tleSA9ICRozY9fYSldXSxbXCJpc0tleVwiLFskaM2PX2EgPT4gKGlzS2V5ID0gJGjNj19hKV1dLFtcImNoZWNrU2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoY2hlY2tTY2FsYXJLZXkgPSAkaM2PX2EpXV0sW1wiY2hlY2tDb3B5U2V0XCIsWyRozY9fYSA9PiAoY2hlY2tDb3B5U2V0ID0gJGjNj19hKV1dLFtcImNoZWNrQ29weU1hcFwiLFskaM2PX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRozY9fYSldXSxbXCJjb3B5TWFwS2V5U2V0XCIsWyRozY9fYSA9PiAoY29weU1hcEtleVNldCA9ICRozY9fYSldXSxbXCJjaGVja0NvcHlCYWdcIixbJGjNj19hID0+IChjaGVja0NvcHlCYWcgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJ5QXJyYXlcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cnlBcnJheSA9ICRozY9fYSldXSxbXCJtYWtlQ29weU1hcFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlCYWdcIixbJGjNj19hID0+IChtYWtlQ29weUJhZyA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanNcIiwgW1tcImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q2hlY2tlciwgQ29weUFycmF5LCBDb3B5UmVjb3JkLCBDb3B5VGFnZ2VkLCBQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqIEBpbXBvcnQge0NvcHlTZXQsIENvcHlCYWcsIEFyZ0d1YXJkLCBBd2FpdEFyZ0d1YXJkLCBDaGVja1BhdHRlcm4sIEdldFJhbmtDb3ZlciwgSW50ZXJmYWNlR3VhcmQsIE1hdGNoZXJOYW1lc3BhY2UsIE1ldGhvZEd1YXJkLCBNZXRob2RHdWFyZE1ha2VyLCBQYXR0ZXJuLCBSYXdHdWFyZCwgU3luY1ZhbHVlR3VhcmQsIEtpbmQsIExpbWl0cywgQWxsTGltaXRzLCBLZXksIERlZmF1bHRHdWFyZFR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7TWF0Y2hIZWxwZXIsIFBhdHRlcm5LaXR9IGZyb20gJy4vdHlwZXMuanMnXG4gKi9cblxuY29uc3QgeyBlbnRyaWVzLCB2YWx1ZXMsIGhhc093biB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8UGF0dGVybj59ICovXG5jb25zdCBwYXR0ZXJuTWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1hdGNoIEhlbHBlcnMgSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBGb3IgZm9yd2FyZCByZWZlcmVuY2VzIHRvIGBNYCAqL1xubGV0IE1NO1xuXG4vKipcbiAqIFRoZSBhY3R1YWwgZGVmYXVsdCB2YWx1ZXMgaGVyZSBhcmUsIGF0IHRoZSBwcmVzZW50IHRpbWUsIGZhaXJseVxuICogYXJiaXRyYXJ5IGNob2ljZXMgYW5kIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgc2V0dGxlIGRvd24uIE9mIGNvdXJzZVxuICogYXQgc29tZSBwb2ludCB3ZSdsbCBuZWVkIHRvIHN0b3AgY2hhbmdpbmcgdGhlbS4gQnV0IHdlIHNob3VsZCBmaXJzdFxuICogc2VlIGhvdyBvdXIgc3lzdGVtIGhvbGRzIHVwIHdpdGggdGhlc2UgY2hvaWNlcy4gVGhlIG1haW4gY3JpdGVyaWFcbiAqIGlzIHRoYXQgdGhleSBiZSBiaWcgZW5vdWdoIHRoYXQgXCJub3JtYWxcIiBpbm5vY2VudCBwcm9ncmFtcyByYXJlbHlcbiAqIGVuY291bnRlciB0aGVzZSBsaW1pdHMuXG4gKlxuICogRXhwb3J0ZWQgcHJpbWFyaWx5IGZvciB0ZXN0aW5nLlxuICovXG4gICAgICAgY29uc3QgZGVmYXVsdExpbWl0cyA9IGhhcmRlbih7XG4gIGRlY2ltYWxEaWdpdHNMaW1pdDogMTAwLFxuICBzdHJpbmdMZW5ndGhMaW1pdDogMTAwXzAwMCxcbiAgc3ltYm9sTmFtZUxlbmd0aExpbWl0OiAxMDAsXG4gIG51bVByb3BlcnRpZXNMaW1pdDogODAsXG4gIHByb3BlcnR5TmFtZUxlbmd0aExpbWl0OiAxMDAsXG4gIGFycmF5TGVuZ3RoTGltaXQ6IDEwXzAwMCxcbiAgYnl0ZUxlbmd0aExpbWl0OiAxMDBfMDAwLFxuICBudW1TZXRFbGVtZW50c0xpbWl0OiAxMF8wMDAsXG4gIG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQ6IDEwXzAwMCxcbiAgbnVtTWFwRW50cmllc0xpbWl0OiA1MDAwLFxufSk7XG5cbi8qKlxuICogVXNlIHRoZSByZXN1bHQgb25seSB0byBnZXQgdGhlIGxpbWl0cyB5b3UgbmVlZCBieSBkZXN0cnVjdHVyaW5nLlxuICogVGh1cywgdGhlIHJlc3VsdCBvbmx5IG5lZWRzIHRvIHN1cHBvcnQgZGVzdHJ1Y3R1cmluZy4gVGhlIGN1cnJlbnRcbiAqIGltcGxlbWVudGF0aW9uIHVzZXMgaW5oZXJpdGFuY2UgYXMgYSBjaGVhcCBoYWNrLlxuICpcbiAqIEBwYXJhbSB7TGltaXRzfSBbbGltaXRzXVxuICogQHJldHVybnMge0FsbExpbWl0c31cbiAqLyRozY9fb25jZS5kZWZhdWx0TGltaXRzKGRlZmF1bHRMaW1pdHMpO1xuY29uc3QgbGltaXQgPSAobGltaXRzID0ge30pID0+XG4gIC8qKiBAdHlwZSB7QWxsTGltaXRzfSAqLyAoaGFyZGVuKHsgX19wcm90b19fOiBkZWZhdWx0TGltaXRzLCAuLi5saW1pdHMgfSkpO1xuXG5jb25zdCBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdCA9IChcbiAgcGF5bG9hZCxcbiAgbWFpblBheWxvYWRTaGFwZSxcbiAgY2hlY2ssXG4gIGxhYmVsLFxuKSA9PiB7XG4gIGFzc2VydChBcnJheS5pc0FycmF5KG1haW5QYXlsb2FkU2hhcGUpKTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHBheWxvYWQpKSB7XG4gICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYCR7cShsYWJlbCl9IHBheWxvYWQgbXVzdCBiZSBhbiBhcnJheTogJHtwYXlsb2FkfWApO1xuICB9XG5cbiAgLyogV2FzIHRoZSBmb2xsb3dpbmcsIGJ1dCBpdHMgb3ZlcnVzZSBvZiBwYXR0ZXJucyBjYXVzZWQgYW4gaW5maW5pdGUgcmVncmVzcyovXG4gIC8qIGNvbnN0IHBheWxvYWRMaW1pdFNoYXBlID0gaGFyZGVuKCovXG4gIC8qIE0uc3BsaXQoKi9cbiAgLyogbWFpblBheWxvYWRTaGFwZSwqL1xuICAvKiBNLnBhcnRpYWwoaGFyZGVuKFtNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0ubnVtYmVyKCkpXSksIGhhcmRlbihbXSkpLCovXG4gIC8qICksKi9cbiAgLyogKTsqL1xuICAvKiByZXR1cm4gY2hlY2tNYXRjaGVzKHBheWxvYWQsIHBheWxvYWRMaW1pdFNoYXBlLCBjaGVjaywgbGFiZWwpOyovXG5cbiAgY29uc3QgbWFpbkxlbmd0aCA9IG1haW5QYXlsb2FkU2hhcGUubGVuZ3RoO1xuICBpZiAoIShwYXlsb2FkLmxlbmd0aCA9PT0gbWFpbkxlbmd0aCB8fCBwYXlsb2FkLmxlbmd0aCA9PT0gbWFpbkxlbmd0aCArIDEpKSB7XG4gICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYCR7cShsYWJlbCl9IHBheWxvYWQgdW5leHBlY3RlZCBzaXplOiAke3BheWxvYWR9YCk7XG4gIH1cbiAgY29uc3QgbGltaXRzID0gcGF5bG9hZFttYWluTGVuZ3RoXTtcbiAgcGF5bG9hZCA9IGhhcmRlbihwYXlsb2FkLnNsaWNlKDAsIG1haW5MZW5ndGgpKTtcbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgaWYgKCFjaGVja01hdGNoZXMocGF5bG9hZCwgbWFpblBheWxvYWRTaGFwZSwgY2hlY2ssIGxhYmVsKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGltaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gKFxuICAgIChwYXNzU3R5bGVPZihsaW1pdHMpID09PSAnY29weVJlY29yZCcgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYExpbWl0cyBtdXN0IGJlIGEgcmVjb3JkOiAke3EobGltaXRzKX1gKSkgJiZcbiAgICBlbnRyaWVzKGxpbWl0cykuZXZlcnkoXG4gICAgICAoW2tleSwgdmFsdWVdKSA9PlxuICAgICAgICBwYXNzU3R5bGVPZih2YWx1ZSkgPT09ICdudW1iZXInIHx8XG4gICAgICAgIGNoZWNrKGZhbHNlLCBYYFZhbHVlIG9mIGxpbWl0ICR7cShrZXkpfSBidXQgYmUgYSBudW1iZXI6ICR7cSh2YWx1ZSl9YCksXG4gICAgKVxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHNwZWNpbWVuXG4gKiBAcGFyYW0ge251bWJlcn0gZGVjaW1hbERpZ2l0c0xpbWl0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbmNvbnN0IGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0ID0gKHNwZWNpbWVuLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrKSA9PiB7XG4gIGlmIChcbiAgICBNYXRoLmZsb29yKE1hdGgubG9nMTAoTWF0aC5hYnMoTnVtYmVyKHNwZWNpbWVuKSkpKSArIDEgPD1cbiAgICBkZWNpbWFsRGlnaXRzTGltaXRcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoZWNrKFxuICAgIGZhbHNlLFxuICAgIFhgYmlnaW50ICR7c3BlY2ltZW59IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7ZGVjaW1hbERpZ2l0c0xpbWl0fSBkaWdpdHNgLFxuICApO1xufTtcblxuLyoqXG4gKiBAcmV0dXJucyB7UGF0dGVybktpdH1cbiAqL1xuY29uc3QgbWFrZVBhdHRlcm5LaXQgPSAoKSA9PiB7XG4gIC8qKlxuICogSWYgdGhpcyBpcyBhIHJlY29nbml6ZWQgbWF0Y2ggdGFnLCByZXR1cm4gdGhlIE1hdGNoSGVscGVyLlxuICogT3RoZXJ3aXNlIHJlc3VsdCB1bmRlZmluZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge01hdGNoSGVscGVyIHwgdW5kZWZpbmVkfVxuICovXG4gIGNvbnN0IG1heWJlTWF0Y2hIZWxwZXIgPSB0YWcgPT5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgIEhlbHBlcnNCeU1hdGNoVGFnW3RhZ107XG5cbiAgLyoqXG4gKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpbmRpY2F0ZXMgYWJzZW5jZSBieSByZXR1cm5pbmcgYHVuZGVmaW5lZGAsXG4gKiBldmVuIHRob3VnaCBgdW5kZWZpbmVkYCBpcyBhIHZhbGlkIHBhdHRlcm4uIFRvIGV2YWRlIHRoaXMgY29uZnVzaW9uLFxuICogdG8gcmVnaXN0ZXIgYSBwYXlsb2FkIHNoYXBlIHdpdGggdGhhdCBtZWFuaW5nLCB1c2UgYE1NLnVuZGVmaW5lZCgpYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7UGF0dGVybiB8IHVuZGVmaW5lZH1cbiAqL1xuICBjb25zdCBtYXliZVBheWxvYWRTaGFwZSA9IHRhZyA9PlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgR3VhcmRQYXlsb2FkU2hhcGVzW3RhZ107XG5cbiAgLyoqIEB0eXBlIHtNYXA8S2luZCwgdW5rbm93bj59ICovXG4gIGNvbnN0IHNpbmdsZXRvbktpbmRzID0gbmV3IE1hcChbXG4gICAgWydudWxsJywgbnVsbF0sXG4gICAgWyd1bmRlZmluZWQnLCB1bmRlZmluZWRdLFxuICBdKTtcblxuICAvKipcbiAqIEB0eXBlIHtXZWFrTWFwPENvcHlUYWdnZWQsIEtpbmQ+fVxuICogT25seSBmb3IgdGFnZ2VkIHJlY29yZHMgb2YgcmVjb2duaXplZCBraW5kcyB3aG9zZSBzdG9yZS1sZXZlbCBpbnZhcmlhbnRzXG4gKiBoYXZlIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICovXG4gIGNvbnN0IHRhZ01lbW8gPSBuZXcgV2Vha01hcCgpO1xuXG4gIC8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCB0YWdzLCBhbmQgb25seSBpZiB0aGUgdGFnZ2VkXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdGFnZ2VkXG4gKiBAcGFyYW0ge0tpbmR9IHRhZ1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgY2hlY2tUYWdnZWQgPSAodGFnZ2VkLCB0YWcsIGNoZWNrKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hIZWxwZXIgPSBtYXliZU1hdGNoSGVscGVyKHRhZyk7XG4gICAgaWYgKG1hdGNoSGVscGVyKSB7XG4gICAgICAvKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuICAgICAgLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbiAgICAgIHJldHVybiBtYXRjaEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCh0YWdnZWQucGF5bG9hZCwgY2hlY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXlsb2FkU2hhcGUgPSBtYXliZVBheWxvYWRTaGFwZSh0YWcpO1xuICAgICAgaWYgKHBheWxvYWRTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICAgIHJldHVybiBjaGVja01hdGNoZXModGFnZ2VkLnBheWxvYWQsIHBheWxvYWRTaGFwZSwgY2hlY2ssIHRhZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICByZXR1cm4gY2hlY2tDb3B5U2V0KHRhZ2dlZCwgY2hlY2spO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrQ29weUJhZyh0YWdnZWQsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgIHJldHVybiBjaGVja0NvcHlNYXAodGFnZ2VkLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfTogJHt0YWdnZWR9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gKiBSZXR1cm5zIG9ubHkgYSByZWNvZ25pemVkIGtpbmQsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lbiBwYXNzZXMgdGhlXG4gKiBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICogT3RoZXJ3aXNlLCBgY2hlY2soZmFsc2UsIC4uLilgIGFuZCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7S2luZCB8IHVuZGVmaW5lZH1cbiAqL1xuICBjb25zdCBraW5kT2YgPSAoc3BlY2ltZW4sIGNoZWNrID0gaWRlbnRDaGVja2VyKSA9PiB7XG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuICAgIGlmIChwYXNzU3R5bGUgIT09ICd0YWdnZWQnKSB7XG4gICAgICByZXR1cm4gcGFzc1N0eWxlO1xuICAgIH1cbiAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBzcGVjaW1lbiBpcyB3ZWxsIGZvcm1lZCovXG4gICAgLyogYXMgYSB0YWdnZWQgcmVjb3JkLCB3aGljaCBpcyBkZWZpbmVkIGF0IHRoZSBtYXJzaGFsIGxldmVsIG9mIGFic3RyYWN0aW9uLCovXG4gICAgLyogc2luY2UgYHBhc3NTdHlsZU9mYCBjaGVja3MgdGhvc2UgaW52YXJpYW50cy4qL1xuICAgIGlmICh0YWdNZW1vLmhhcyhzcGVjaW1lbikpIHtcbiAgICAgIHJldHVybiB0YWdNZW1vLmdldChzcGVjaW1lbik7XG4gICAgfVxuICAgIGNvbnN0IHRhZyA9IGdldFRhZyhzcGVjaW1lbik7XG4gICAgaWYgKGNoZWNrVGFnZ2VkKHNwZWNpbWVuLCB0YWcsIGNoZWNrKSkge1xuICAgICAgdGFnTWVtby5zZXQoc3BlY2ltZW4sIHRhZyk7XG4gICAgICByZXR1cm4gdGFnO1xuICAgIH1cbiAgICBpZiAoY2hlY2sgIT09IGlkZW50Q2hlY2tlcikge1xuICAgICAgY2hlY2soZmFsc2UsIFhgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9YCk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG4gIGhhcmRlbihraW5kT2YpO1xuXG4gIC8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tpbmR9IGtpbmRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrS2luZCA9IChzcGVjaW1lbiwga2luZCwgY2hlY2spID0+IHtcbiAgICAvKiBjaGVjayBudWxsIGFuZCB1bmRlZmluZWQgYXMgS2V5cyovXG4gICAgaWYgKHNpbmdsZXRvbktpbmRzLmhhcyhraW5kKSkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgc2luZ2xldG9uS2luZHMuZ2V0KGtpbmQpLCBjaGVjayk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVhbEtpbmQgPSBraW5kT2Yoc3BlY2ltZW4sIGNoZWNrKTtcbiAgICBpZiAoa2luZCA9PT0gcmVhbEtpbmQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY2hlY2sgIT09IGlkZW50Q2hlY2tlcikge1xuICAgICAgLyogYGtpbmRgIGFuZCBgcmVhbEtpbmRgIGNhbiBiZSBlbWJlZGRlZCB3aXRob3V0IHF1b3RlcyovXG4gICAgICAvKiBiZWNhdXNlIHRoZXkgYXJlIGRyYXduIGZyb20gdGhlIGVudW1lcmF0ZWQgY29sbGVjdGlvbiBvZiBrbm93biBLaW5kcy4qL1xuICAgICAgY2hlY2soZmFsc2UsIFhgJHtiKHJlYWxLaW5kKX0gJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgJHtiKGtpbmQpfWApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIGtpbmRzLCBhbmQgb25seSBpZiB0aGUgc3BlY2ltZW5cbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2luZH0ga2luZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgaXNLaW5kID0gKHNwZWNpbWVuLCBraW5kKSA9PiBjaGVja0tpbmQoc3BlY2ltZW4sIGtpbmQsIGlkZW50Q2hlY2tlcik7XG5cbiAgLyoqXG4gKiBDaGVja3MgaWYgYSBwYXR0ZXJuIG1hdGNoZXMgb25seSBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgaXNVbmRlZmluZWRQYXR0ID0gcGF0dCA9PlxuICAgIHBhdHQgPT09IHVuZGVmaW5lZCB8fFxuICAgIChpc0tpbmQocGF0dCwgJ21hdGNoOmtpbmQnKSAmJiBwYXR0LnBheWxvYWQgPT09ICd1bmRlZmluZWQnKTtcblxuICAvKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtLZXl9IGtleUFzUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgY2hlY2tBc0tleVBhdHQgPSAoc3BlY2ltZW4sIGtleUFzUGF0dGVybiwgY2hlY2spID0+IHtcbiAgICBpZiAoaXNLZXkoc3BlY2ltZW4pICYmIGtleUVRKHNwZWNpbWVuLCBrZXlBc1BhdHRlcm4pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGNoZWNrICE9PSBpZGVudENoZWNrZXIgJiZcbiAgICAgIC8qIFdoZW4gdGhlIG1pc21hdGNoIG9jY3VycyBhZ2FpbnN0IGEga2V5IHVzZWQgYXMgYSBwYXR0ZXJuLCovXG4gICAgICAvKiB0aGUgcGF0dGVybiBzaG91bGQgc3RpbGwgYmUgcmVkYWN0ZWQuKi9cbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZTogJHtrZXlBc1BhdHRlcm59YClcbiAgICApO1xuICB9O1xuXG4gIC8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGlzUGF0dGVybiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgLyoqIEB0eXBlIHtDaGVja1BhdHRlcm59ICovXG4gIGNvbnN0IGNoZWNrUGF0dGVybiA9IChwYXR0LCBjaGVjaykgPT4ge1xuICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgLyogQWxsIGtleXMgYXJlIHBhdHRlcm5zLiBGb3IgdGhlc2UsIHRoZSBrZXlNZW1vIHdpbGwgZG8uKi9cbiAgICAgIC8qIEFsbCBwcmltaXRpdmVzIHRoYXQgYXJlIHBhdHRlcm5zIGFyZSBhbHNvIGtleXMsIHdoaWNoIHRoaXMqL1xuICAgICAgLyogYWxzbyB0YWtlcyBjYXJlIG9mIHdpdGhvdXQgbWVtby4gVGhlIHJlc3Qgb2Ygb3VyIGNoZWNraW5nIGxvZ2ljKi9cbiAgICAgIC8qIGlzIG9ubHkgY29uY2VybmVkIHdpdGggbm9uLWtleSBwYXR0ZXJucy4qL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChwYXR0ZXJuTWVtby5oYXMocGF0dCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrUGF0dGVybkludGVybmFsKHBhdHQsIGNoZWNrKTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBwYXR0ZXJuTWVtby5hZGQocGF0dCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0IC0ga25vd24gbm90IHRvIGJlIGEga2V5LCBhbmQgdGhlcmVmb3JlIGtub3duXG4gKiBub3QgdG8gYmUgcHJpbWl0aXZlLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgY2hlY2tQYXR0ZXJuSW50ZXJuYWwgPSAocGF0dCwgY2hlY2spID0+IHtcbiAgICAvKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4gICAgLyogTW9zdCBvZiB0aGUgdGV4dCBvZiB0aGUgc3dpdGNoIGJlbG93IG5vdCBkZWFsaW5nIHdpdGggbWF0Y2hlcnMgaXMqL1xuICAgIC8qIGVzc2VudGlhbGx5IGlkZW50aWNhbC4qL1xuICAgIGNvbnN0IGNoZWNrSXQgPSBjaGlsZCA9PiBjaGVja1BhdHRlcm4oY2hpbGQsIGNoZWNrKTtcblxuICAgIGNvbnN0IGtpbmQgPSBraW5kT2YocGF0dCwgY2hlY2spO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6IHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLyogQSBjb3B5UmVjb3JkIGlzIGEgcGF0dGVybiBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUqL1xuICAgICAgICAvKiBwYXR0ZXJucyovXG4gICAgICAgIHJldHVybiB2YWx1ZXMocGF0dCkuZXZlcnkoY2hlY2tJdCk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIC8qIEEgY29weUFycmF5IGlzIGEgcGF0dGVybiBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUqL1xuICAgICAgICAvKiBwYXR0ZXJucyovXG4gICAgICAgIHJldHVybiBwYXR0LmV2ZXJ5KGNoZWNrSXQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUga2V5cyBhbmQgdGhlcmVmb3JlIGFscmVhZHkga25vd24gdG8gYmUqL1xuICAgICAgICAvKiBwYXR0ZXJucy4qL1xuICAgICAgICAvKiBBIGNvcHlNYXAgaXMgYSBwYXR0ZXJuIGlmIGl0cyB2YWx1ZXMgYXJlIHBhdHRlcm5zLiovXG4gICAgICAgIHJldHVybiBjaGVja1BhdHRlcm4ocGF0dC52YWx1ZXMsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBBICR7cShraW5kKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBpZiAobWF5YmVNYXRjaEhlbHBlcihraW5kKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgQSBwYXNzYWJsZSBvZiBraW5kICR7cShraW5kKX0gaXMgbm90IGEgcGF0dGVybjogJHtwYXR0fWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgaXNQYXR0ZXJuID0gcGF0dCA9PiBjaGVja1BhdHRlcm4ocGF0dCwgaWRlbnRDaGVja2VyKTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICovXG4gIGNvbnN0IGFzc2VydFBhdHRlcm4gPSBwYXR0ID0+IHtcbiAgICBjaGVja1BhdHRlcm4ocGF0dCwgYXNzZXJ0Q2hlY2tlcik7XG4gIH07XG5cbiAgLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gbWF0Y2hlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuICAvKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrTWF0Y2hlcyA9IChzcGVjaW1lbiwgcGF0dGVybiwgY2hlY2ssIGxhYmVsID0gdW5kZWZpbmVkKSA9PlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgYXBwbHlMYWJlbGluZ0Vycm9yKGNoZWNrTWF0Y2hlc0ludGVybmFsLCBbc3BlY2ltZW4sIHBhdHRlcm4sIGNoZWNrXSwgbGFiZWwpO1xuXG4gIC8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrTWF0Y2hlc0ludGVybmFsID0gKHNwZWNpbWVuLCBwYXR0LCBjaGVjaykgPT4ge1xuICAgIC8qIFdvcnRoIGJlaW5nIGEgYml0IHZlcmJvc2UgYW5kIHJlcGV0aXRpdmUgaW4gb3JkZXIgdG8gb3B0aW1pemUqL1xuICAgIGNvbnN0IHBhdHRlcm5LaW5kID0ga2luZE9mKHBhdHQsIGNoZWNrKTtcbiAgICBjb25zdCBzcGVjaW1lbktpbmQgPSBraW5kT2Yoc3BlY2ltZW4pOyAvKiBtYXkgYmUgdW5kZWZpbmVkKi9cbiAgICBzd2l0Y2ggKHBhdHRlcm5LaW5kKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDoge1xuICAgICAgICByZXR1cm4gRmFpbGBwYXR0ZXJuIGV4cGVjdGVkOiAke3BhdHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIHJldHVybiBGYWlsYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgcmV0dXJuIEZhaWxgZXJyb3JzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdiaWdpbnQnOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICBjYXNlICdieXRlQXJyYXknOlxuICAgICAgY2FzZSAnY29weVNldCc6XG4gICAgICBjYXNlICdjb3B5QmFnJzpcbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgLyogVGhlc2Uga2luZHMgYXJlIG5lY2Vzc2FyaWx5IGtleXMqL1xuICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAgICAgLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4gICAgICAgICAgLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xuICAgICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3FwKFxuICAgICAgICAgICAgICBwYXR0LFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHBhdHQ7XG4gICAgICAgIGlmIChzcGVjaW1lbi5sZW5ndGggIT09IGxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGBBcnJheSAke3NwZWNpbWVufSAtIE11c3QgYmUgYXMgbG9uZyBhcyBjb3B5QXJyYXkgcGF0dGVybjogJHtxcChcbiAgICAgICAgICAgICAgcGF0dCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXR0LmV2ZXJ5KChwLCBpKSA9PiBjaGVja01hdGNoZXMoc3BlY2ltZW5baV0sIHAsIGNoZWNrLCBpKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgICAgICAvKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbiAgICAgICAgICAvKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG4gICAgICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBwYXR0LCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWNpbWVuS2luZCAhPT0gJ2NvcHlSZWNvcmQnKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlSZWNvcmQgdG8gbWF0Y2ggYSBjb3B5UmVjb3JkIHBhdHRlcm46ICR7cXAoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBUT0RPIERldGVjdCBhbmQgYWNjdW11bGF0ZSBkaWZmZXJlbmNlIGluIG9uZSBwYXNzLiovXG4gICAgICAgIC8qIFJhdGhlciB0aGFuIHVzaW5nIHR3byBjYWxscyB0byBgbGlzdERpZmZlcmVuY2VgIHRvIGRldGVjdCBhbmQqL1xuICAgICAgICAvKiByZXBvcnQgaWYgYW5kIGhvdyB0aGVzZSBsaXN0cyBkaWZmZXIsIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkqL1xuICAgICAgICAvKiBpbiBzb3J0ZWQgb3JkZXIsIHdlIHNob3VsZCBpbnN0ZWFkIHVzZSBhbiBhbGdvcml0aG0gbGlrZSovXG4gICAgICAgIC8qIGBpdGVyRGlzam9pbnRVbmlvbmAgZnJvbSBtZXJnZS1zb3J0LW9wZXJhdG9ycy5qcyovXG4gICAgICAgIGNvbnN0IHNwZWNpbWVuTmFtZXMgPSByZWNvcmROYW1lcyhzcGVjaW1lbik7XG4gICAgICAgIGNvbnN0IHBhdHROYW1lcyA9IHJlY29yZE5hbWVzKHBhdHQpO1xuICAgICAgICBjb25zdCBtaXNzaW5nID0gbGlzdERpZmZlcmVuY2UocGF0dE5hbWVzLCBzcGVjaW1lbk5hbWVzKTtcbiAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGhhdmUgbWlzc2luZyBwcm9wZXJ0aWVzICR7cShtaXNzaW5nKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdW5leHBlY3RlZCA9IGxpc3REaWZmZXJlbmNlKHNwZWNpbWVuTmFtZXMsIHBhdHROYW1lcyk7XG4gICAgICAgIGlmICh1bmV4cGVjdGVkLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBub3QgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShcbiAgICAgICAgICAgICAgdW5leHBlY3RlZCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNwZWNpbWVuVmFsdWVzID0gcmVjb3JkVmFsdWVzKHNwZWNpbWVuLCBzcGVjaW1lbk5hbWVzKTtcbiAgICAgICAgY29uc3QgcGF0dFZhbHVlcyA9IHJlY29yZFZhbHVlcyhwYXR0LCBwYXR0TmFtZXMpO1xuICAgICAgICByZXR1cm4gcGF0dE5hbWVzLmV2ZXJ5KChsYWJlbCwgaSkgPT5cbiAgICAgICAgICBjaGVja01hdGNoZXMoc3BlY2ltZW5WYWx1ZXNbaV0sIHBhdHRWYWx1ZXNbaV0sIGNoZWNrLCBsYWJlbCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgICAgICAvKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbiAgICAgICAgICAvKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG4gICAgICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBwYXR0LCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWNpbWVuS2luZCAhPT0gJ2NvcHlNYXAnKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlNYXAgdG8gbWF0Y2ggYSBjb3B5TWFwIHBhdHRlcm46ICR7cXAoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBDb21wYXJlIGtleXMgYXMgY29weVNldHMqL1xuICAgICAgICBjb25zdCBwYXR0S2V5U2V0ID0gY29weU1hcEtleVNldChwYXR0KTtcbiAgICAgICAgY29uc3Qgc3BlY2ltZW5LZXlTZXQgPSBjb3B5TWFwS2V5U2V0KHNwZWNpbWVuKTtcbiAgICAgICAgaWYgKCFjaGVja01hdGNoZXMoc3BlY2ltZW5LZXlTZXQsIHBhdHRLZXlTZXQsIGNoZWNrKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvKiBDb21wYXJlIHZhbHVlcyBhcyBjb3B5QXJyYXlzIGFmdGVyIGFwcGx5aW5nIGEgc2hhcmVkIHRvdGFsIG9yZGVyLiovXG4gICAgICAgIC8qIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGFudGlSYW5rT3JkZXIgc29ydGluZyBvZiBlYWNoIG1hcCdzKi9cbiAgICAgICAgLyogZW50cmllcyBpcyBhIHByZW9yZGVyIHRoYXQgYWRtaXRzIHRpZXMuKi9cbiAgICAgICAgY29uc3QgcGF0dFZhbHVlcyA9IFtdO1xuICAgICAgICBjb25zdCBzcGVjaW1lblZhbHVlcyA9IFtdO1xuICAgICAgICBjb25zdCBlbnRyeVBhaXJzID0gZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMoXG4gICAgICAgICAgcGF0dCxcbiAgICAgICAgICBzcGVjaW1lbixcbiAgICAgICAgICBnZXRDb3B5TWFwRW50cnlBcnJheSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3QgW19rZXksIHBhdHRWYWx1ZSwgc3BlY2ltZW5WYWx1ZV0gb2YgZW50cnlQYWlycykge1xuICAgICAgICAgIHBhdHRWYWx1ZXMucHVzaChwYXR0VmFsdWUpO1xuICAgICAgICAgIHNwZWNpbWVuVmFsdWVzLnB1c2goc3BlY2ltZW5WYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoZWNrTWF0Y2hlcyhoYXJkZW4oc3BlY2ltZW5WYWx1ZXMpLCBoYXJkZW4ocGF0dFZhbHVlcyksIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbWF0Y2hIZWxwZXIgPSBtYXliZU1hdGNoSGVscGVyKHBhdHRlcm5LaW5kKTtcbiAgICAgICAgaWYgKG1hdGNoSGVscGVyKSB7XG4gICAgICAgICAgcmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrTWF0Y2hlcyhzcGVjaW1lbiwgcGF0dC5wYXlsb2FkLCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogc2hvdWxkIGhhdmUgcmVjb2duaXplZCAke3EocGF0dGVybktpbmQpfSBgO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBtYXRjaGVzID0gKHNwZWNpbWVuLCBwYXR0KSA9PlxuICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCwgaWRlbnRDaGVja2VyKTtcblxuICAvKipcbiAqIFJldHVybmluZyBub3JtYWxseSBpbmRpY2F0ZXMgc3VjY2Vzcy4gTWF0Y2ggZmFpbHVyZSBpcyBpbmRpY2F0ZWQgYnlcbiAqIHRocm93aW5nLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqL1xuICBjb25zdCBtdXN0TWF0Y2ggPSAoc3BlY2ltZW4sIHBhdHQsIGxhYmVsID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgbGV0IGlubmVyRXJyb3I7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGlkZW50Q2hlY2tlciwgdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgIGlubmVyRXJyb3IgPSBlcjtcbiAgICB9XG4gICAgLyogc2hvdWxkIG9ubHkgdGhyb3cqL1xuICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCwgYXNzZXJ0Q2hlY2tlciwgbGFiZWwpO1xuICAgIGNvbnN0IG91dGVyRXJyb3IgPSBtYWtlRXJyb3IoXG4gICAgICBYYGludGVybmFsOiAke2xhYmVsfTogaW5jb25zaXN0ZW50IHBhdHRlcm4gbWF0Y2g6ICR7cXAocGF0dCl9YCxcbiAgICApO1xuICAgIGlmIChpbm5lckVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFubm90YXRlRXJyb3Iob3V0ZXJFcnJvciwgWGBjYXVzZWQgYnkgJHtpbm5lckVycm9yfWApO1xuICAgIH1cbiAgICB0aHJvdyBvdXRlckVycm9yO1xuICB9O1xuXG4gIC8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGdldFJhbmtDb3ZlciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgLyoqIEB0eXBlIHtHZXRSYW5rQ292ZXJ9ICovXG4gIGNvbnN0IGdldFJhbmtDb3ZlciA9IChwYXR0LCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVBhc3NhYmxlKHBhdHQpO1xuICAgICAgaWYgKGVuY29kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW2VuY29kZWQsIGAke2VuY29kZWR9fmBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXR0KTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICAvKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4gICAgICAgIC8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbiAgICAgICAgLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5QXJyYXlzLiovXG4gICAgICAgIC8qKi9cbiAgICAgICAgLyogY29uc3QgcmFua0NvdmVycyA9IHBhdHQubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSk7Ki9cbiAgICAgICAgLyogcmV0dXJuIGhhcmRlbihbKi9cbiAgICAgICAgLyogcmFua0NvdmVycy5tYXAoKFtsZWZ0LCBfcmlnaHRdKSA9PiBsZWZ0KSwqL1xuICAgICAgICAvKiByYW5rQ292ZXJzLm1hcCgoW19sZWZ0LCByaWdodF0pID0+IHJpZ2h0KSwqL1xuICAgICAgICAvKiBdKTsqL1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIC8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbiAgICAgICAgLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuICAgICAgICAvKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlSZWNvcmRzLiovXG4gICAgICAgIC8qKi9cbiAgICAgICAgLyogY29uc3QgcGF0dEtleXMgPSBvd25LZXlzKHBhdHQpOyovXG4gICAgICAgIC8qIGNvbnN0IHBhdHRFbnRyaWVzID0gaGFyZGVuKHBhdHRLZXlzLm1hcChrZXkgPT4gW2tleSwgcGF0dFtrZXldXSkpOyovXG4gICAgICAgIC8qIGNvbnN0IFtsZWZ0RW50cmllc0xpbWl0LCByaWdodEVudHJpZXNMaW1pdF0gPSovXG4gICAgICAgIC8qIGdldFJhbmtDb3ZlcihwYXR0RW50cmllcyk7Ki9cbiAgICAgICAgLyogcmV0dXJuIGhhcmRlbihbKi9cbiAgICAgICAgLyogZnJvbVVuaXF1ZUVudHJpZXMobGVmdEVudHJpZXNMaW1pdCksKi9cbiAgICAgICAgLyogZnJvbVVuaXF1ZUVudHJpZXMocmlnaHRFbnRyaWVzTGltaXQpLCovXG4gICAgICAgIC8qIF0pOyovXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICBjb25zdCB0YWcgPSBnZXRUYWcocGF0dCk7XG4gICAgICAgIGNvbnN0IG1hdGNoSGVscGVyID0gbWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuICAgICAgICBpZiAobWF0Y2hIZWxwZXIpIHtcbiAgICAgICAgICAvKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuICAgICAgICAgIC8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG4gICAgICAgICAgcmV0dXJuIG1hdGNoSGVscGVyLmdldFJhbmtDb3ZlcihwYXR0LnBheWxvYWQsIGVuY29kZVBhc3NhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICAgICAgICAvKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4gICAgICAgICAgICAvKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4gICAgICAgICAgICAvKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlTZXRzLiovXG4gICAgICAgICAgICAvKiovXG4gICAgICAgICAgICAvKiAvLyBTaG91bGQgYWxyZWFkeSBiZSB2YWxpZGF0ZWQgYnkgY2hlY2tQYXR0ZXJuLiBCdXQgYmVjYXVzZSB0aGlzKi9cbiAgICAgICAgICAgIC8qIC8vIGlzIGEgY2hlY2sgdGhhdCBtYXkgbG9vc2VuIG92ZXIgdGltZSwgd2UgYWxzbyBhc3NlcnQqL1xuICAgICAgICAgICAgLyogLy8gZXZlcnl3aGVyZSB3ZSBzdGlsbCByZWx5IG9uIHRoZSByZXN0cmljdGlvbi4qL1xuICAgICAgICAgICAgLyogYGBganMqL1xuICAgICAgICAgICAgLyogcGF0dC5wYXlsb2FkLmxlbmd0aCA9PT0gMSB8fCovXG4gICAgICAgICAgICAvKiBGYWlsYE5vbi1zaW5nbGV0b24gY29weVNldHMgd2l0aCBtYXRjaGVyIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7cGF0dH1gOyovXG4gICAgICAgICAgICAvKiBgYGAqL1xuICAgICAgICAgICAgLyoqL1xuICAgICAgICAgICAgLyogY29uc3QgW2xlZnRFbGVtZW50TGltaXQsIHJpZ2h0RWxlbWVudExpbWl0XSA9IGdldFJhbmtDb3ZlcigqL1xuICAgICAgICAgICAgLyogcGF0dC5wYXlsb2FkWzBdLCovXG4gICAgICAgICAgICAvKiApOyovXG4gICAgICAgICAgICAvKiByZXR1cm4gaGFyZGVuKFsqL1xuICAgICAgICAgICAgLyogbWFrZUNvcHlTZXQoW2xlZnRFbGVtZW50TGltaXRdKSwqL1xuICAgICAgICAgICAgLyogbWFrZUNvcHlTZXQoW3JpZ2h0RWxlbWVudExpbWl0XSksKi9cbiAgICAgICAgICAgIC8qIF0pOyovXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgICAgIC8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbiAgICAgICAgICAgIC8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbiAgICAgICAgICAgIC8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weU1hcHMuKi9cbiAgICAgICAgICAgIC8qKi9cbiAgICAgICAgICAgIC8qIC8vIEEgbWF0Y2hpbmcgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUga2V5cywgb3IgYXQgbW9zdCBvbmUqL1xuICAgICAgICAgICAgLyogLy8gbm9uLWtleSBrZXkgcGF0dGVybi4gVGh1cyB3ZSBjYW4gYXNzdW1lIHRoYXQgdmFsdWUgcG9zaXRpb25zKi9cbiAgICAgICAgICAgIC8qIC8vIG1hdGNoIDEtdG8tMS4qL1xuICAgICAgICAgICAgLyogLy8qL1xuICAgICAgICAgICAgLyogLy8gVE9ETyBJIG1heSBiZSBvdmVybG9va2luZyB0aGF0IHRoZSBsZXNzIHByZWNpc2UgcmFua09yZGVyKi9cbiAgICAgICAgICAgIC8qIC8vIGVxdWl2YWxlbmNlIGNsYXNzIG1heSBjYXVzZSB2YWx1ZXMgdG8gYmUgb3V0IG9mIG9yZGVyLCovXG4gICAgICAgICAgICAvKiAvLyBtYWtpbmcgdGhpcyByYW5rQ292ZXIgbm90IGFjdHVhbGx5IGNvdmVyLiBJbiB0aGF0IGNhc2UsIGZvciovXG4gICAgICAgICAgICAvKiAvLyBhbGwgdGhlIHZhbHVlcyBmb3Iga2V5cyBhdCB0aGUgc2FtZSByYW5rLCB3ZSBzaG91bGQgdW5pb24gdGhlaXIqL1xuICAgICAgICAgICAgLyogLy8gcmFuayBjb3ZlcnMuIFRPRE8gUE9TU0lCTEUgU0lMRU5UIENPUlJFQ1RORVNTIEJVRyovXG4gICAgICAgICAgICAvKiAvLyovXG4gICAgICAgICAgICAvKiAvLyBJZiB0aGlzIGlzIGEgYnVnLCBpdCBwcm9iYWJseSBhZmZlY3RzIHRoZSBnZXRSYW5rQ292ZXIqL1xuICAgICAgICAgICAgLyogLy8gY2FzZXMgb2YgbWF0Y2hMVEVIZWxwZXIgYW5kIG1hdGNoR1RFSGVscGVyIG9uIGNvcHlNYXAgYXMqL1xuICAgICAgICAgICAgLyogLy8gd2VsbC4gU2VlIG1ha2VDb3B5TWFwIGZvciBhbiBpZGVhIG9uIGZpeGluZyovXG4gICAgICAgICAgICAvKiAvLyB0aGlzIGJ1Zy4qL1xuICAgICAgICAgICAgLyogY29uc3QgW2xlZnRQYXlsb2FkTGltaXQsIHJpZ2h0UGF5bG9hZExpbWl0XSA9IGdldFJhbmtDb3ZlcigqL1xuICAgICAgICAgICAgLyogcGF0dC5wYXlsb2FkLCovXG4gICAgICAgICAgICAvKiBlbmNvZGVQYXNzYWJsZSwqL1xuICAgICAgICAgICAgLyogKTsqL1xuICAgICAgICAgICAgLyogcmV0dXJuIGhhcmRlbihbKi9cbiAgICAgICAgICAgIC8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCBsZWZ0UGF5bG9hZExpbWl0KSwqL1xuICAgICAgICAgICAgLyogbWFrZVRhZ2dlZCgnY29weU1hcCcsIHJpZ2h0UGF5bG9hZExpbWl0KSwqL1xuICAgICAgICAgICAgLyogXSk7Ki9cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBicmVhazsgLyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhazsgLyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBicmVhazsgLyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gYXJyYXlcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbFByZWZpeF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGFycmF5RXZlcnlNYXRjaFBhdHRlcm4gPSAoYXJyYXksIHBhdHQsIGNoZWNrLCBsYWJlbFByZWZpeCA9ICcnKSA9PiB7XG4gICAgaWYgKGlzS2luZChwYXR0LCAnbWF0Y2g6YW55JykpIHtcbiAgICAgIC8qIGlmIHRoZSBwYXR0ZXJuIGlzIE0uYW55KCksIHdlIGtub3cgaXRzIHRydWUqL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhcnJheS5ldmVyeSgoZWwsIGkpID0+XG4gICAgICBjaGVja01hdGNoZXMoZWwsIHBhdHQsIGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSxcbiAgICApO1xuICB9O1xuXG4gIC8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1hdGNoIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hBbnlIZWxwZXIgPSBGYXIoJ21hdGNoOmFueSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoX3NwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIF9jaGVjaykgPT4gdHJ1ZSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAobWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgbWF0Y2hlclBheWxvYWQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgbWF0Y2g6YW55IHBheWxvYWQ6ICR7bWF0Y2hlclBheWxvYWR9IC0gTXVzdCBiZSB1bmRlZmluZWRgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWycnLCAneyddLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEFuZEhlbHBlciA9IEZhcignbWF0Y2g6YW5kIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcGF0dHMsIGNoZWNrKSA9PiB7XG4gICAgICByZXR1cm4gcGF0dHMuZXZlcnkocGF0dCA9PiBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZFBhdHRzLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgY2hlY2tJdCA9IHBhdHQgPT4gY2hlY2tQYXR0ZXJuKHBhdHQsIGNoZWNrKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpID09PSAnY29weUFycmF5JyB8fFxuICAgICAgICAgIGNoZWNrKGZhbHNlLCBYYE5lZWRzIGFycmF5IG9mIHN1Yi1wYXR0ZXJuczogJHtxcChhbGxlZ2VkUGF0dHMpfWApKSAmJlxuICAgICAgICBhbGxlZ2VkUGF0dHMuZXZlcnkoY2hlY2tJdClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGdldFJhbmtDb3ZlcjogKHBhdHRzLCBlbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGludGVyc2VjdFJhbmtDb3ZlcnMoXG4gICAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgICBwYXR0cy5tYXAocCA9PiBnZXRSYW5rQ292ZXIocCwgZW5jb2RlUGFzc2FibGUpKSxcbiAgICAgICksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoT3JIZWxwZXIgPSBGYXIoJ21hdGNoOm9yIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcGF0dHMsIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcGF0dHM7XG4gICAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gbm8gcGF0dGVybiBkaXNqdW5jdHMgdG8gbWF0Y2g6ICR7cXAocGF0dHMpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvKiBTcGVjaWFsIGNhc2UgZGlzanVuY3Rpb25zIHJlcHJlc2VudGluZyBhIHNpbmdsZSBvcHRpb25hbCBwYXR0ZXJuIGZvciovXG4gICAgICAvKiBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuKi9cbiAgICAgIGNvbnN0IGJpbmFyeVVuZGVmUGF0dElkeCA9XG4gICAgICAgIHBhdHRzLmxlbmd0aCA9PT0gMlxuICAgICAgICAgID8gcGF0dHMuZmluZEluZGV4KHBhdHQgPT4gaXNVbmRlZmluZWRQYXR0KHBhdHQpKVxuICAgICAgICAgIDogLTE7XG4gICAgICBpZiAoYmluYXJ5VW5kZWZQYXR0SWR4ICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHNwZWNpbWVuID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHRzWzEgLSBiaW5hcnlVbmRlZlBhdHRJZHhdLCBjaGVjaylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXR0cy5zb21lKHBhdHQgPT4gbWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBtYXRjaCBvbmUgb2YgJHtxcChwYXR0cyl9YCk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBtYXRjaEFuZEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuICAgIGdldFJhbmtDb3ZlcjogKHBhdHRzLCBlbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIHVuaW9uUmFua0NvdmVycyhcbiAgICAgICAgY29tcGFyZVJhbmssXG4gICAgICAgIHBhdHRzLm1hcChwID0+IGdldFJhbmtDb3ZlcihwLCBlbmNvZGVQYXNzYWJsZSkpLFxuICAgICAgKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hOb3RIZWxwZXIgPSBGYXIoJ21hdGNoOm5vdCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSA9PiB7XG4gICAgICBpZiAobWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCkpIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3FwKHBhdHQpfWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrUGF0dGVybixcblxuICAgIGdldFJhbmtDb3ZlcjogKF9wYXR0LCBfZW5jb2RlUGFzc2FibGUpID0+IFsnJywgJ3snXSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXIgPSBGYXIoJ21hdGNoOnNjYWxhciBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja1NjYWxhcktleShzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hLZXlIZWxwZXIgPSBGYXIoJ21hdGNoOmtleSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0tleShzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyID0gRmFyKCdtYXRjaDpwYXR0ZXJuIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgX21hdGNoZXJQYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrUGF0dGVybihzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hLaW5kSGVscGVyID0gRmFyKCdtYXRjaDpraW5kIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IGNoZWNrS2luZCxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZEtleUtpbmQsIGNoZWNrKSA9PlxuICAgICAgdHlwZW9mIGFsbGVnZWRLZXlLaW5kID09PSAnc3RyaW5nJyB8fFxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2AsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoa2luZCwgX2VuY29kZVBhc3NhYmxlKSA9PiB7XG4gICAgICBsZXQgc3R5bGU7XG4gICAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSAnY29weVNldCc6XG4gICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgc3R5bGUgPSAndGFnZ2VkJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgc3R5bGUgPSBraW5kO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIoc3R5bGUpO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoVGFnZ2VkSGVscGVyID0gRmFyKCdtYXRjaDp0YWdnZWQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbdGFnUGF0dCwgcGF5bG9hZFBhdHRdLCBjaGVjaykgPT4ge1xuICAgICAgaWYgKHBhc3NTdHlsZU9mKHNwZWNpbWVuKSAhPT0gJ3RhZ2dlZCcpIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgRXhwZWN0ZWQgdGFnZ2VkIG9iamVjdCwgbm90ICR7cShcbiAgICAgICAgICAgIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSxcbiAgICAgICAgICApfTogJHtzcGVjaW1lbn1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tNYXRjaGVzKGdldFRhZyhzcGVjaW1lbiksIHRhZ1BhdHQsIGNoZWNrLCAndGFnJykgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLnBheWxvYWQsIHBheWxvYWRQYXR0LCBjaGVjaywgJ3BheWxvYWQnKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnRhZ2dlZCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfa2luZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQmlnaW50SGVscGVyID0gRmFyKCdtYXRjaDpiaWdpbnQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnYmlnaW50JywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmJpZ2ludCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoTmF0SGVscGVyID0gRmFyKCdtYXRjaDpuYXQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnYmlnaW50JywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qKiBAdHlwZSB7YmlnaW50fSAqLyAoc3BlY2ltZW4pID49IDBuLFxuICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIG5vbi1uZWdhdGl2ZWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2spXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6bmF0IHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIC8qIFRPRE8gQ291bGQgYmUgbW9yZSBwcmVjaXNlKi9cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hTdHJpbmdIZWxwZXIgPSBGYXIoJ21hdGNoOnN0cmluZyBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBzdHJpbmdMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIC8qIHByZXR0aWVyLWlnbm9yZSovXG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdzdHJpbmcnLCBjaGVjaykgJiZcbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG4gICAgICAgICAgKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc3BlY2ltZW4pLmxlbmd0aCA8PSBzdHJpbmdMZW5ndGhMaW1pdCB8fFxuICAgICAgICAgIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYHN0cmluZyAke3NwZWNpbWVufSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N0cmluZ0xlbmd0aExpbWl0fWAsXG4gICAgICAgICAgKSlcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtdKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpzdHJpbmcgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ3N0cmluZycpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFN5bWJvbEhlbHBlciA9IEZhcignbWF0Y2g6c3ltYm9sIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IHN5bWJvbE5hbWVMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIGlmICghY2hlY2tLaW5kKHNwZWNpbWVuLCAnc3ltYm9sJywgY2hlY2spKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN5bWJvbE5hbWUgPSBuYW1lRm9yUGFzc2FibGVTeW1ib2woc3BlY2ltZW4pO1xuXG4gICAgICBpZiAodHlwZW9mIHN5bWJvbE5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFBhc3NhYmxlIHN5bWJvbCAke3NwZWNpbWVufSBtdXN0IGhhdmUgYSBwYXNzYWJsZSBuYW1lYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgc3ltYm9sTmFtZS5sZW5ndGggPD0gc3ltYm9sTmFtZUxlbmd0aExpbWl0LFxuICAgICAgICBYYFN5bWJvbCBuYW1lICR7cShcbiAgICAgICAgICBzeW1ib2xOYW1lLFxuICAgICAgICApfSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N5bWJvbE5hbWVMZW5ndGhMaW1pdH1gLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnN5bWJvbCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3Zlcignc3ltYm9sJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoUmVtb3RhYmxlSGVscGVyID0gRmFyKCdtYXRjaDpyZW1vdGFibGUgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByZW1vdGFibGVEZXNjLCBjaGVjaykgPT4ge1xuICAgICAgaWYgKGlzS2luZChzcGVjaW1lbiwgJ3JlbW90YWJsZScpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoZWNrID09PSBpZGVudENoZWNrZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBsYWJlbCB9ID0gcmVtb3RhYmxlRGVzYztcbiAgICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbiAgICAgIGNvbnN0IGtpbmREZXRhaWxzID1cbiAgICAgICAgcGFzc1N0eWxlICE9PSAndGFnZ2VkJ1xuICAgICAgICAgID8gLyogUGFzcyBzdHlsZSBjYW4gYmUgZW1iZWRkZWQgaW4gZGV0YWlscyB3aXRob3V0IHF1b3Rlcy4qL1xuICAgICAgICAgICAgYihwYXNzU3R5bGUpXG4gICAgICAgICAgOiAvKiBUYWcgbXVzdCBiZSBxdW90ZWQgYmVjYXVzZSBpdCBpcyBwb3RlbnRpYWxseSBhdHRhY2tlci1jb250cm9sbGVkKi9cbiAgICAgICAgICAgIC8qICh1bmxpa2UgYGtpbmRPZmAsIHRoaXMgZG9lcyBub3QgcmVqZWN0IHVucmVjb2duaXplZCB0YWdzKS4qL1xuICAgICAgICAgICAgcShnZXRUYWcoc3BlY2ltZW4pKTtcbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIC8qIGBsYWJlbGAgY2FuIGJlIGVtYmVkZGVkIHdpdGhvdXQgcXVvdGVzIGJlY2F1c2UgaXQgaXMgcHJvdmlkZWQgYnkqL1xuICAgICAgICAvKiBsb2NhbCBjb2RlIGxpa2UgYE0ucmVtb3RhYmxlKFwiLi4uXCIpYC4qL1xuICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIHJlbW90YWJsZSAke2IobGFiZWwpfSwgbm90ICR7a2luZERldGFpbHN9YCxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZFJlbW90YWJsZURlc2MsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICBhbGxlZ2VkUmVtb3RhYmxlRGVzYyxcbiAgICAgICAgaGFyZGVuKHsgbGFiZWw6IE1NLnN0cmluZygpIH0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnJlbW90YWJsZSBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfcmVtb3RhYmxlRGVzYywgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ3JlbW90YWJsZScpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaExURUhlbHBlciA9IEZhcignbWF0Y2g6bHRlIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUxURShzcGVjaW1lbiwgcmlnaHRPcGVyYW5kKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDw9ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocmlnaHRPcGVyYW5kLCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbiAgICAgIC8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4gICAgICAvKiB0byBiZSBgbGV0YCovXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbiAgICAgIGxldCBbbGVmdEJvdW5kLCByaWdodEJvdW5kXSA9IGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gICAgICBjb25zdCBuZXdSaWdodEJvdW5kID0gYCR7ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKX1+YDtcbiAgICAgIGlmIChuZXdSaWdodEJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmlnaHRCb3VuZCA9IG5ld1JpZ2h0Qm91bmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF07XG4gICAgfSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hMVEhlbHBlciA9IEZhcignbWF0Y2g6bHQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgICAga2V5TFQoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCkgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiBtYXRjaExURUhlbHBlci5nZXRSYW5rQ292ZXIsXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoR1RFSGVscGVyID0gRmFyKCdtYXRjaDpndGUgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgICAga2V5R1RFKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPj0gJHtyaWdodE9wZXJhbmR9YCksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tLZXksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChyaWdodE9wZXJhbmQsIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuICAgICAgLyogVGhlIHByZWZlci1jb25zdCBtYWtlcyBubyBzZW5zZSB3aGVuIHNvbWUgb2YgdGhlIHZhcmlhYmxlcyBuZWVkKi9cbiAgICAgIC8qIHRvIGJlIGBsZXRgKi9cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QqL1xuICAgICAgbGV0IFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdID0gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbiAgICAgIGNvbnN0IG5ld0xlZnRCb3VuZCA9IGVuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCk7XG4gICAgICBpZiAobmV3TGVmdEJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGVmdEJvdW5kID0gbmV3TGVmdEJvdW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoR1RIZWxwZXIgPSBGYXIoJ21hdGNoOmd0IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUdUKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPiAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogbWF0Y2hHVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFJlY29yZE9mSGVscGVyID0gRmFyKCdtYXRjaDpyZWNvcmRPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtrZXlQYXR0LCB2YWx1ZVBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtUHJvcGVydGllc0xpbWl0LCBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlSZWNvcmQnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgb3duS2V5cyhzcGVjaW1lbikubGVuZ3RoIDw9IG51bVByb3BlcnRpZXNMaW1pdCxcbiAgICAgICAgICBYYE11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbiAgICAgICAgICAgIG51bVByb3BlcnRpZXNMaW1pdCxcbiAgICAgICAgICApfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4gICAgICAgICAgKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcihcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBrZXkubGVuZ3RoIDw9IHByb3BlcnR5TmFtZUxlbmd0aExpbWl0LFxuICAgICAgICAgICAgICAgIFhgUHJvcGVydHkgbmFtZSBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAke3EoXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCxcbiAgICAgICAgICAgICAgICApfWAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgICAgICAgaGFyZGVuKFtrZXksIHZhbHVlXSksXG4gICAgICAgICAgICAgIGhhcmRlbihba2V5UGF0dCwgdmFsdWVQYXR0XSksXG4gICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IF9lbnRyeVBhdHQgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hBcnJheU9mSGVscGVyID0gRmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW3N1YlBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGFycmF5TGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICAvKiBwcmV0dGllci1pZ25vcmUqL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weUFycmF5JywgY2hlY2spICYmXG4gICAgICAgICgvKiogQHR5cGUge0FycmF5fSAqLyAoc3BlY2ltZW4pLmxlbmd0aCA8PSBhcnJheUxlbmd0aExpbWl0IHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgQXJyYXkgbGVuZ3RoICR7c3BlY2ltZW4ubGVuZ3RofSBtdXN0IGJlIDw9IGxpbWl0ICR7YXJyYXlMZW5ndGhMaW1pdH1gLFxuICAgICAgICAgICkpICYmXG4gICAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4sIHN1YlBhdHQsIGNoZWNrKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5JyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQnl0ZUFycmF5SGVscGVyID0gRmFyKCdtYXRjaDpieXRlQXJyYXkgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgYnl0ZUxlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgLyogcHJldHRpZXItaWdub3JlKi9cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2J5dGVBcnJheScsIGNoZWNrKSAmJlxuICAgICAgICAoLyoqIEB0eXBlIHtBcnJheUJ1ZmZlcn0gKi8gKHNwZWNpbWVuKS5ieXRlTGVuZ3RoIDw9IGJ5dGVMZW5ndGhMaW1pdCB8fFxuICAgICAgICAgIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYGJ5dGVBcnJheSAke3NwZWNpbWVufSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke2J5dGVMZW5ndGhMaW1pdH1gLFxuICAgICAgICAgICkpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6Ynl0ZUFycmF5IHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdieXRlQXJyYXknKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hTZXRPZkhlbHBlciA9IEZhcignbWF0Y2g6c2V0T2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBba2V5UGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtU2V0RWxlbWVudHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlTZXQnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgLyoqIEB0eXBlIHtBcnJheX0gKi8gKHNwZWNpbWVuLnBheWxvYWQpLmxlbmd0aCA8IG51bVNldEVsZW1lbnRzTGltaXQsXG4gICAgICAgICAgWGBTZXQgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKG51bVNldEVsZW1lbnRzTGltaXQpfSBlbGVtZW50czogJHtcbiAgICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQubGVuZ3RoXG4gICAgICAgICAgfWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbi5wYXlsb2FkLCBrZXlQYXR0LCBjaGVjaywgJ3NldCBlbGVtZW50cycpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6c2V0T2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQmFnT2ZIZWxwZXIgPSBGYXIoJ21hdGNoOmJhZ09mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW2tleVBhdHQsIGNvdW50UGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgeyBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LCBkZWNpbWFsRGlnaXRzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5QmFnJywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovIChzcGVjaW1lbi5wYXlsb2FkKS5sZW5ndGggPD1cbiAgICAgICAgICAgIG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsXG4gICAgICAgICAgWGBCYWcgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxuICAgICAgICAgICAgbnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxcbiAgICAgICAgICApfSB1bmlxdWUgZWxlbWVudHM6ICR7c3BlY2ltZW59YCxcbiAgICAgICAgKSAmJlxuICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuICAgICAgICAgIChba2V5LCBjb3VudF0sIGkpID0+XG4gICAgICAgICAgICBjaGVja01hdGNoZXMoa2V5LCBrZXlQYXR0LCBjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkgJiZcbiAgICAgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcihcbiAgICAgICAgICAgICAgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG4gICAgICAgICAgICAgIFtjb3VudCwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVja10sXG4gICAgICAgICAgICAgIGBiYWcgY291bnRzWyR7aX1dYCxcbiAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgIGNoZWNrTWF0Y2hlcyhjb3VudCwgY291bnRQYXR0LCBjaGVjaywgYGJhZyBjb3VudHNbJHtpfV1gKSxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6YmFnT2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qKlxuICogQHBhcmFtIHtDb3B5QXJyYXl9IGVsZW1lbnRzXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRQYXR0XG4gKiBAcGFyYW0ge2JpZ2ludH0gYm91bmQgTXVzdCBiZSA+PSAxblxuICogQHBhcmFtIHtDb3B5QXJyYXl9IFtpblJlc3VsdHNdXG4gKiBAcGFyYW0ge0NvcHlBcnJheX0gW291dFJlc3VsdHNdXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGVsZW1lbnRzSGFzU3BsaXQgPSAoXG4gICAgZWxlbWVudHMsXG4gICAgZWxlbWVudFBhdHQsXG4gICAgYm91bmQsXG4gICAgaW5SZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIG91dFJlc3VsdHMgPSB1bmRlZmluZWQsXG4gICAgY2hlY2sgPSBpZGVudENoZWNrZXIsXG4gICkgPT4ge1xuICAgIGxldCBjb3VudCA9IDBuO1xuICAgIC8qIFNpbmNlIHRoaXMgZmVhdHVyZSBpcyBtb3RpdmF0ZWQgYnkgRVJUUCdzIHVzZSBvbiovXG4gICAgLyogbm9uLWZ1bmdpYmxlIChgc2V0YCwgYGNvcHlTZXRgKSBhbW91bnRzLCovXG4gICAgLyogdGhlaXIgYXJyYXlzIHN0b3JlIHRoZWlyIGVsZW1lbnRzIGluIGRlY2VuZGluZyBsZXhpY29ncmFwaGljIG9yZGVyLiovXG4gICAgLyogQnV0IHRoaXMgZnVuY3Rpb24gaGFzIHRvIG1ha2Ugc29tZSBjaG9pY2UgYW1vdW5nIGVxdWFsbHkgZ29vZCBtaW5pbWFsKi9cbiAgICAvKiByZXN1bHRzLiBJdCBpcyBtb3JlIGludHVpdGl2ZSBmb3IgdGhlIGNob2ljZSB0byBiZSB0aGUgZmlyc3QgYGJvdW5kYCovXG4gICAgLyogbWF0Y2hpbmcgZWxlbWVudHMgaW4gYXNjZW5kaW5nIGxleGljaWdyYXBoaWMgb3JkZXIsIHJhdGhlciB0aGFuKi9cbiAgICAvKiBkZWNlbmRpbmcuIFRodXMgd2UgaXRlcmF0ZSBgZWxlbWVudHNgIGluIHJldmVyc2Ugb3JkZXIuKi9cbiAgICBmb3IgKGxldCBpID0gZWxlbWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcbiAgICAgIGlmIChjb3VudCA8IGJvdW5kKSB7XG4gICAgICAgIGlmIChtYXRjaGVzKGVsZW1lbnQsIGVsZW1lbnRQYXR0KSkge1xuICAgICAgICAgIGNvdW50ICs9IDFuO1xuICAgICAgICAgIGlmIChpblJlc3VsdHMpIGluUmVzdWx0cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKG91dFJlc3VsdHMpIHtcbiAgICAgICAgICBvdXRSZXN1bHRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob3V0UmVzdWx0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0UmVzdWx0cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBjb3VudCA+PSBib3VuZCxcbiAgICAgIFhgSGFzIG9ubHkgJHtxKGNvdW50KX0gbWF0Y2hlcywgYnV0IG5lZWRzICR7cShib3VuZCl9YCxcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtDb3B5QXJyYXk8W0tleSwgYmlnaW50XT59IHBhaXJzXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRQYXR0XG4gKiBAcGFyYW0ge2JpZ2ludH0gYm91bmQgTXVzdCBiZSA+PSAxblxuICogQHBhcmFtIHtDb3B5QXJyYXk8W0tleSwgYmlnaW50XT59IFtpblJlc3VsdHNdXG4gKiBAcGFyYW0ge0NvcHlBcnJheTxbS2V5LCBiaWdpbnRdPn0gW291dFJlc3VsdHNdXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IHBhaXJzSGFzU3BsaXQgPSAoXG4gICAgcGFpcnMsXG4gICAgZWxlbWVudFBhdHQsXG4gICAgYm91bmQsXG4gICAgaW5SZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIG91dFJlc3VsdHMgPSB1bmRlZmluZWQsXG4gICAgY2hlY2sgPSBpZGVudENoZWNrZXIsXG4gICkgPT4ge1xuICAgIGxldCBjb3VudCA9IDBuO1xuICAgIC8qIFNpbmNlIHRoaXMgZmVhdHVyZSBpcyBtb3RpdmF0ZWQgYnkgRVJUUCdzIHVzZSBvbiovXG4gICAgLyogc2VtaS1mdW5naWJsZSAoYGNvcHlCYWdgKSBhbW91bnRzLCovXG4gICAgLyogdGhlaXIgYXJyYXlzIHN0b3JlIHRoZWlyIGVsZW1lbnRzIGluIGRlY2VuZGluZyBsZXhpY29ncmFwaGljIG9yZGVyLiovXG4gICAgLyogQnV0IHRoaXMgZnVuY3Rpb24gaGFzIHRvIG1ha2Ugc29tZSBjaG9pY2UgYW1vdW5nIGVxdWFsbHkgZ29vZCBtaW5pbWFsKi9cbiAgICAvKiByZXN1bHRzLiBJdCBpcyBtb3JlIGludHVpdGl2ZSBmb3IgdGhlIGNob2ljZSB0byBiZSB0aGUgZmlyc3QgYGJvdW5kYCovXG4gICAgLyogbWF0Y2hpbmcgZWxlbWVudHMgaW4gYXNjZW5kaW5nIGxleGljaWdyYXBoaWMgb3JkZXIsIHJhdGhlciB0aGFuKi9cbiAgICAvKiBkZWNlbmRpbmcuIFRodXMgd2UgaXRlcmF0ZSBgcGFpcnNgIGluIHJldmVyc2Ugb3JkZXIuKi9cbiAgICBmb3IgKGxldCBpID0gcGFpcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgIGNvbnN0IFtlbGVtZW50LCBudW1dID0gcGFpcnNbaV07XG4gICAgICBjb25zdCBudW1SZXN0ID0gYm91bmQgLSBjb3VudDtcbiAgICAgIGlmIChudW1SZXN0ID49IDFuKSB7XG4gICAgICAgIGlmIChtYXRjaGVzKGVsZW1lbnQsIGVsZW1lbnRQYXR0KSkge1xuICAgICAgICAgIGlmIChudW0gPD0gbnVtUmVzdCkge1xuICAgICAgICAgICAgY291bnQgKz0gbnVtO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0cykgaW5SZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBudW1JbiA9IG51bVJlc3Q7XG4gICAgICAgICAgICBjb3VudCArPSBudW1JbjtcbiAgICAgICAgICAgIGlmIChpblJlc3VsdHMpIGluUmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW1SZXN0XSk7XG4gICAgICAgICAgICBpZiAob3V0UmVzdWx0cykgb3V0UmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW0gLSBudW1SZXN0XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG91dFJlc3VsdHMpIHtcbiAgICAgICAgICBvdXRSZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG91dFJlc3VsdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGNvdW50ID49IGJvdW5kLFxuICAgICAgWGBIYXMgb25seSAke3EoY291bnQpfSBtYXRjaGVzLCBidXQgbmVlZHMgJHtxKGJvdW5kKX1gLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gKiBAdHlwZWRlZiB7Q29weUFycmF5IHwgQ29weVNldCB8IENvcHlCYWd9IENvbnRhaW5lclxuICogQHBhcmFtIHtDb250YWluZXJ9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRQYXR0XG4gKiBAcGFyYW0ge2JpZ2ludH0gYm91bmQgTXVzdCBiZSA+PSAxblxuICogQHBhcmFtIHtib29sZWFufSBbbmVlZEluUmVzdWx0c11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW25lZWRPdXRSZXN1bHRzXVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7W0NvbnRhaW5lciB8IHVuZGVmaW5lZCwgQ29udGFpbmVyIHwgdW5kZWZpbmVkXSB8IGZhbHNlfVxuICovXG4gIGNvbnN0IGNvbnRhaW5lckhhc1NwbGl0ID0gKFxuICAgIHNwZWNpbWVuLFxuICAgIGVsZW1lbnRQYXR0LFxuICAgIGJvdW5kLFxuICAgIG5lZWRJblJlc3VsdHMgPSBmYWxzZSxcbiAgICBuZWVkT3V0UmVzdWx0cyA9IGZhbHNlLFxuICAgIGNoZWNrID0gaWRlbnRDaGVja2VyLFxuICApID0+IHtcbiAgICBjb25zdCBpblJlc3VsdHMgPSBuZWVkSW5SZXN1bHRzID8gW10gOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3V0UmVzdWx0cyA9IG5lZWRPdXRSZXN1bHRzID8gW10gOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qga2luZCA9IGtpbmRPZihzcGVjaW1lbik7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhZWxlbWVudHNIYXNTcGxpdChcbiAgICAgICAgICAgIHNwZWNpbWVuLFxuICAgICAgICAgICAgZWxlbWVudFBhdHQsXG4gICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgIGluUmVzdWx0cyxcbiAgICAgICAgICAgIG91dFJlc3VsdHMsXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIC8qIGNoZWNrIGxvZ2ljIGFscmVhZHkgcGVyZm9ybWVkIGJ5IGVsZW1lbnRzSGFzU3BsaXQqL1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2luUmVzdWx0cywgb3V0UmVzdWx0c107XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWVsZW1lbnRzSGFzU3BsaXQoXG4gICAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLFxuICAgICAgICAgICAgZWxlbWVudFBhdHQsXG4gICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgIGluUmVzdWx0cyxcbiAgICAgICAgICAgIG91dFJlc3VsdHMsXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGluUmVzdWx0cyAmJiBtYWtlQ29weVNldChpblJlc3VsdHMpLFxuICAgICAgICAgIG91dFJlc3VsdHMgJiYgbWFrZUNvcHlTZXQob3V0UmVzdWx0cyksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QmFnJzoge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXBhaXJzSGFzU3BsaXQoXG4gICAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLFxuICAgICAgICAgICAgZWxlbWVudFBhdHQsXG4gICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgIGluUmVzdWx0cyxcbiAgICAgICAgICAgIG91dFJlc3VsdHMsXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGluUmVzdWx0cyAmJiBtYWtlQ29weUJhZyhpblJlc3VsdHMpLFxuICAgICAgICAgIG91dFJlc3VsdHMgJiYgbWFrZUNvcHlCYWcob3V0UmVzdWx0cyksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGB1bmV4cGVjdGVkICR7cShraW5kKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hDb250YWluZXJIYXNIZWxwZXIgPSBGYXIoJ00uY29udGFpbmVySGFzIGhlbHBlcicsIHtcbiAgICAvKipcbiAqIEBwYXJhbSB7Q29weUFycmF5IHwgQ29weVNldCB8IENvcHlCYWd9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1tQYXR0ZXJuLCBiaWdpbnQsIExpbWl0cz9dfSBwYXlsb2FkXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW2VsZW1lbnRQYXR0LCBib3VuZCwgbGltaXRzID0gdW5kZWZpbmVkXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qga2luZCA9IGtpbmRPZihzcGVjaW1lbiwgY2hlY2spO1xuICAgICAgY29uc3QgeyBkZWNpbWFsRGlnaXRzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICBpZiAoXG4gICAgICAgICFhcHBseUxhYmVsaW5nRXJyb3IoXG4gICAgICAgICAgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG4gICAgICAgICAgW2JvdW5kLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrXSxcbiAgICAgICAgICBgJHtraW5kfSBtYXRjaGVzYCxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhIWNvbnRhaW5lckhhc1NwbGl0KFxuICAgICAgICBzcGVjaW1lbixcbiAgICAgICAgZWxlbWVudFBhdHQsXG4gICAgICAgIGJvdW5kLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGNoZWNrLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0uZ3RlKDFuKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ00uY29udGFpbmVySGFzIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaE1hcE9mSGVscGVyID0gRmFyKCdtYXRjaDptYXBPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtrZXlQYXR0LCB2YWx1ZVBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtTWFwRW50cmllc0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weU1hcCcsIGNoZWNrKSAmJlxuICAgICAgICBjaGVjayhcbiAgICAgICAgICAvKiogQHR5cGUge0FycmF5fSAqLyAoc3BlY2ltZW4ucGF5bG9hZC5rZXlzKS5sZW5ndGggPD1cbiAgICAgICAgICAgIG51bU1hcEVudHJpZXNMaW1pdCxcbiAgICAgICAgICBYYENvcHlNYXAgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiAke3EoXG4gICAgICAgICAgICBudW1NYXBFbnRyaWVzTGltaXQsXG4gICAgICAgICAgKX0gZW50cmllczogJHtzcGVjaW1lbn1gLFxuICAgICAgICApICYmXG4gICAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG4gICAgICAgICAgc3BlY2ltZW4ucGF5bG9hZC5rZXlzLFxuICAgICAgICAgIGtleVBhdHQsXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgJ21hcCBrZXlzJyxcbiAgICAgICAgKSAmJlxuICAgICAgICBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQudmFsdWVzLFxuICAgICAgICAgIHZhbHVlUGF0dCxcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAnbWFwIHZhbHVlcycsXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOm1hcE9mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogX2VudHJ5UGF0dCA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJuW119IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgcmVzdFNwZWNpbWVuOiBQYXNzYWJsZVtdXG4gKiB9fVxuICovXG4gIGNvbnN0IHNwbGl0QXJyYXlQYXJ0cyA9IChzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpID0+IHtcbiAgICBjb25zdCBudW1SZXF1aXJlZCA9IHJlcXVpcmVkUGF0dC5sZW5ndGg7XG4gICAgY29uc3QgbnVtT3B0aW9uYWwgPSBvcHRpb25hbFBhdHQubGVuZ3RoO1xuICAgIGNvbnN0IHJlcXVpcmVkU3BlY2ltZW4gPSBzcGVjaW1lbi5zbGljZSgwLCBudW1SZXF1aXJlZCk7XG4gICAgY29uc3Qgb3B0aW9uYWxTcGVjaW1lbiA9IHNwZWNpbWVuLnNsaWNlKFxuICAgICAgbnVtUmVxdWlyZWQsXG4gICAgICBudW1SZXF1aXJlZCArIG51bU9wdGlvbmFsLFxuICAgICk7XG4gICAgY29uc3QgcmVzdFNwZWNpbWVuID0gc3BlY2ltZW4uc2xpY2UobnVtUmVxdWlyZWQgKyBudW1PcHRpb25hbCk7XG4gICAgcmV0dXJuIGhhcmRlbih7IHJlcXVpcmVkU3BlY2ltZW4sIG9wdGlvbmFsU3BlY2ltZW4sIHJlc3RTcGVjaW1lbiB9KTtcbiAgfTtcblxuICAvKipcbiAqIE9wdGlvbmFsIHNwZWNpbWVuIGVsZW1lbnRzIHdoaWNoIGFyZSBgdW5kZWZpbmVkYCBwYXNzIHVuY29uZGl0aW9uYWxseS5cbiAqIFdlIGVuY29kZSB0aGlzIHdpdGggdGhlIGBNLm9yYCBwYXR0ZXJuIHNvIGl0IGFsc28gcHJvZHVjZXMgYSBnb29kXG4gKiBjb21wcmVzc2lvbiBkaXN0aW5ndWlzaGluZyBgdW5kZWZpbmVkYCBmcm9tIGFic2VuY2UuXG4gKlxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICogQHJldHVybnMge1BhdHRlcm5bXX0gVGhlIHBhcnRpYWxQYXR0XG4gKi9cbiAgY29uc3QgYWRhcHRBcnJheVBhdHRlcm4gPSAob3B0aW9uYWxQYXR0LCBsZW5ndGgpID0+XG4gICAgaGFyZGVuKG9wdGlvbmFsUGF0dC5zbGljZSgwLCBsZW5ndGgpLm1hcChwYXR0ID0+IE1NLm9wdChwYXR0KSkpO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU3BsaXRBcnJheUhlbHBlciA9IEZhcignbWF0Y2g6c3BsaXRBcnJheSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IFtdLCByZXN0UGF0dCA9IE1NLmFueSgpXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5QXJyYXknLCBjaGVjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyByZXF1aXJlZFNwZWNpbWVuLCBvcHRpb25hbFNwZWNpbWVuLCByZXN0U3BlY2ltZW4gfSA9XG4gICAgICAgIHNwbGl0QXJyYXlQYXJ0cyhzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpO1xuICAgICAgY29uc3QgcGFydGlhbFBhdHQgPSBhZGFwdEFycmF5UGF0dGVybihcbiAgICAgICAgb3B0aW9uYWxQYXR0LFxuICAgICAgICBvcHRpb25hbFNwZWNpbWVuLmxlbmd0aCxcbiAgICAgICk7XG4gICAgICBsZXQgYXJnTnVtID0gMDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChyZXF1aXJlZFNwZWNpbWVuLmxlbmd0aCA9PT0gcmVxdWlyZWRQYXR0Lmxlbmd0aCB8fFxuICAgICAgICAgIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYEV4cGVjdGVkIGF0IGxlYXN0ICR7cShcbiAgICAgICAgICAgICAgcmVxdWlyZWRQYXR0Lmxlbmd0aCxcbiAgICAgICAgICAgICl9IGFyZ3VtZW50czogJHtzcGVjaW1lbn1gLFxuICAgICAgICAgICkpICYmXG4gICAgICAgIHJlcXVpcmVkUGF0dC5ldmVyeSgocCwgaSkgPT5cbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuW2ldLCBwLCBjaGVjaywgYGFyZyAke2FyZ051bSsrfWApLFxuICAgICAgICApICYmXG4gICAgICAgIHBhcnRpYWxQYXR0LmV2ZXJ5KChwLCBpKSA9PlxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG4gICAgICAgICAgY2hlY2tNYXRjaGVzKG9wdGlvbmFsU3BlY2ltZW5baV0sIHAsIGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9P2ApLFxuICAgICAgICApICYmXG4gICAgICAgIGNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4sIHJlc3RQYXR0LCBjaGVjaywgJy4uLnJlc3QnKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBzcGxpdEFycmF5XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHNwbGl0QXJyYXksIGNoZWNrKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgICAoc3BsaXRBcnJheS5sZW5ndGggPj0gMSB8fCBzcGxpdEFycmF5Lmxlbmd0aCA8PSAzKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCwgcmVzdFBhdHQgPSB1bmRlZmluZWRdID1cbiAgICAgICAgICBzcGxpdEFycmF5O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkgJiZcbiAgICAgICAgICBwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgICAgIChvcHRpb25hbFBhdHQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKGlzUGF0dGVybihvcHRpb25hbFBhdHQpICYmXG4gICAgICAgICAgICAgIHBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCkgPT09ICdjb3B5QXJyYXknKSkgJiZcbiAgICAgICAgICAocmVzdFBhdHQgPT09IHVuZGVmaW5lZCB8fCBpc1BhdHRlcm4ocmVzdFBhdHQpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IGFycmF5LCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgYXJyYXksIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuICAgICAgICAgIHNwbGl0QXJyYXksXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGdldFJhbmtDb3ZlcjogKFtcbiAgICAgIF9yZXF1aXJlZFBhdHQsXG4gICAgICBfb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLFxuICAgICAgX3Jlc3RQYXR0ID0gdW5kZWZpbmVkLFxuICAgIF0pID0+IGdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKSxcbiAgfSk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGFzc2FibGU+fSBzcGVjaW1lblxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcmV0dXJucyB7e1xuICogICByZXF1aXJlZFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPixcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIHJlc3RTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT5cbiAqIH19XG4gKi9cbiAgY29uc3Qgc3BsaXRSZWNvcmRQYXJ0cyA9IChzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpID0+IHtcbiAgICAvKiBOb3QgZnJvemVuISBNdXRhdGVkIGluIHBsYWNlKi9cbiAgICAvKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuICAgIGNvbnN0IHJlcXVpcmVkRW50cmllcyA9IFtdO1xuICAgIC8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG4gICAgY29uc3Qgb3B0aW9uYWxFbnRyaWVzID0gW107XG4gICAgLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbiAgICBjb25zdCByZXN0RW50cmllcyA9IFtdO1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBlbnRyaWVzKHNwZWNpbWVuKSkge1xuICAgICAgaWYgKGhhc093bihyZXF1aXJlZFBhdHQsIG5hbWUpKSB7XG4gICAgICAgIHJlcXVpcmVkRW50cmllcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIGlmIChoYXNPd24ob3B0aW9uYWxQYXR0LCBuYW1lKSkge1xuICAgICAgICBvcHRpb25hbEVudHJpZXMucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3RFbnRyaWVzLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgcmVxdWlyZWRTcGVjaW1lbjogZnJvbVVuaXF1ZUVudHJpZXMocmVxdWlyZWRFbnRyaWVzKSxcbiAgICAgIG9wdGlvbmFsU3BlY2ltZW46IGZyb21VbmlxdWVFbnRyaWVzKG9wdGlvbmFsRW50cmllcyksXG4gICAgICByZXN0U3BlY2ltZW46IGZyb21VbmlxdWVFbnRyaWVzKHJlc3RFbnRyaWVzKSxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAqIE9wdGlvbmFsIHNwZWNpbWVuIHZhbHVlcyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge0NvcHlSZWNvcmQ8UGF0dGVybj59IFRoZSBwYXJ0aWFsUGF0dFxuICovXG4gIGNvbnN0IGFkYXB0UmVjb3JkUGF0dGVybiA9IChvcHRpb25hbFBhdHQsIG5hbWVzKSA9PlxuICAgIGZyb21VbmlxdWVFbnRyaWVzKG5hbWVzLm1hcChuYW1lID0+IFtuYW1lLCBNTS5vcHQob3B0aW9uYWxQYXR0W25hbWVdKV0pKTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFNwbGl0UmVjb3JkSGVscGVyID0gRmFyKCdtYXRjaDpzcGxpdFJlY29yZCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IHt9LCByZXN0UGF0dCA9IE1NLmFueSgpXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5UmVjb3JkJywgY2hlY2spKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgcmVxdWlyZWRTcGVjaW1lbiwgb3B0aW9uYWxTcGVjaW1lbiwgcmVzdFNwZWNpbWVuIH0gPVxuICAgICAgICBzcGxpdFJlY29yZFBhcnRzKHNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCk7XG5cbiAgICAgIGNvbnN0IHBhcnRpYWxOYW1lcyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChvd25LZXlzKG9wdGlvbmFsU3BlY2ltZW4pKTtcbiAgICAgIGNvbnN0IHBhcnRpYWxQYXR0ID0gYWRhcHRSZWNvcmRQYXR0ZXJuKG9wdGlvbmFsUGF0dCwgcGFydGlhbE5hbWVzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIGNoZWNrKSAmJlxuICAgICAgICBwYXJ0aWFsTmFtZXMuZXZlcnkobmFtZSA9PlxuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgICAgIG9wdGlvbmFsU3BlY2ltZW5bbmFtZV0sXG4gICAgICAgICAgICBwYXJ0aWFsUGF0dFtuYW1lXSxcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgYCR7bmFtZX0/YCxcbiAgICAgICAgICApLFxuICAgICAgICApICYmXG4gICAgICAgIGNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4sIHJlc3RQYXR0LCBjaGVjaywgJy4uLnJlc3QnKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBzcGxpdEFycmF5XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHNwbGl0QXJyYXksIGNoZWNrKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgICAoc3BsaXRBcnJheS5sZW5ndGggPj0gMSB8fCBzcGxpdEFycmF5Lmxlbmd0aCA8PSAzKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCwgcmVzdFBhdHQgPSB1bmRlZmluZWRdID1cbiAgICAgICAgICBzcGxpdEFycmF5O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkgJiZcbiAgICAgICAgICBwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpID09PSAnY29weVJlY29yZCcgJiZcbiAgICAgICAgICAob3B0aW9uYWxQYXR0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChpc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSAmJlxuICAgICAgICAgICAgICBwYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpID09PSAnY29weVJlY29yZCcpKSAmJlxuICAgICAgICAgIChyZXN0UGF0dCA9PT0gdW5kZWZpbmVkIHx8IGlzUGF0dGVybihyZXN0UGF0dCkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYE11c3QgYmUgYW4gYXJyYXkgb2YgYSByZXF1aXJlZFBhdHQgcmVjb3JkLCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgcmVjb3JkLCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbiAgICAgICAgICBzcGxpdEFycmF5LFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChbXG4gICAgICByZXF1aXJlZFBhdHQsXG4gICAgICBfb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLFxuICAgICAgX3Jlc3RQYXR0ID0gdW5kZWZpbmVkLFxuICAgIF0pID0+IGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkpLFxuICB9KTtcblxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIE1hdGNoSGVscGVyPn0gKi9cbiAgY29uc3QgSGVscGVyc0J5TWF0Y2hUYWcgPSBoYXJkZW4oe1xuICAgICdtYXRjaDphbnknOiBtYXRjaEFueUhlbHBlcixcbiAgICAnbWF0Y2g6YW5kJzogbWF0Y2hBbmRIZWxwZXIsXG4gICAgJ21hdGNoOm9yJzogbWF0Y2hPckhlbHBlcixcbiAgICAnbWF0Y2g6bm90JzogbWF0Y2hOb3RIZWxwZXIsXG5cbiAgICAnbWF0Y2g6c2NhbGFyJzogbWF0Y2hTY2FsYXJIZWxwZXIsXG4gICAgJ21hdGNoOmtleSc6IG1hdGNoS2V5SGVscGVyLFxuICAgICdtYXRjaDpwYXR0ZXJuJzogbWF0Y2hQYXR0ZXJuSGVscGVyLFxuICAgICdtYXRjaDpraW5kJzogbWF0Y2hLaW5kSGVscGVyLFxuICAgICdtYXRjaDp0YWdnZWQnOiBtYXRjaFRhZ2dlZEhlbHBlcixcbiAgICAnbWF0Y2g6YmlnaW50JzogbWF0Y2hCaWdpbnRIZWxwZXIsXG4gICAgJ21hdGNoOm5hdCc6IG1hdGNoTmF0SGVscGVyLFxuICAgICdtYXRjaDpzdHJpbmcnOiBtYXRjaFN0cmluZ0hlbHBlcixcbiAgICAnbWF0Y2g6c3ltYm9sJzogbWF0Y2hTeW1ib2xIZWxwZXIsXG4gICAgJ21hdGNoOnJlbW90YWJsZSc6IG1hdGNoUmVtb3RhYmxlSGVscGVyLFxuXG4gICAgJ21hdGNoOmx0JzogbWF0Y2hMVEhlbHBlcixcbiAgICAnbWF0Y2g6bHRlJzogbWF0Y2hMVEVIZWxwZXIsXG4gICAgJ21hdGNoOmd0ZSc6IG1hdGNoR1RFSGVscGVyLFxuICAgICdtYXRjaDpndCc6IG1hdGNoR1RIZWxwZXIsXG5cbiAgICAnbWF0Y2g6YXJyYXlPZic6IG1hdGNoQXJyYXlPZkhlbHBlcixcbiAgICAnbWF0Y2g6Ynl0ZUFycmF5JzogbWF0Y2hCeXRlQXJyYXlIZWxwZXIsXG4gICAgJ21hdGNoOnJlY29yZE9mJzogbWF0Y2hSZWNvcmRPZkhlbHBlcixcbiAgICAnbWF0Y2g6c2V0T2YnOiBtYXRjaFNldE9mSGVscGVyLFxuICAgICdtYXRjaDpiYWdPZic6IG1hdGNoQmFnT2ZIZWxwZXIsXG4gICAgJ21hdGNoOmNvbnRhaW5lckhhcyc6IG1hdGNoQ29udGFpbmVySGFzSGVscGVyLFxuICAgICdtYXRjaDptYXBPZic6IG1hdGNoTWFwT2ZIZWxwZXIsXG4gICAgJ21hdGNoOnNwbGl0QXJyYXknOiBtYXRjaFNwbGl0QXJyYXlIZWxwZXIsXG4gICAgJ21hdGNoOnNwbGl0UmVjb3JkJzogbWF0Y2hTcGxpdFJlY29yZEhlbHBlcixcbiAgfSk7XG5cbiAgY29uc3QgbWFrZU1hdGNoZXIgPSAodGFnLCBwYXlsb2FkKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlciA9IG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKTtcbiAgICBhc3NlcnRQYXR0ZXJuKG1hdGNoZXIpO1xuICAgIHJldHVybiBtYXRjaGVyO1xuICB9O1xuXG4gIGNvbnN0IG1ha2VLaW5kTWF0Y2hlciA9IGtpbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmtpbmQnLCBraW5kKTtcblxuICBjb25zdCBBbnlTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDphbnknLCB1bmRlZmluZWQpO1xuICBjb25zdCBTY2FsYXJTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDpzY2FsYXInLCB1bmRlZmluZWQpO1xuICBjb25zdCBLZXlTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDprZXknLCB1bmRlZmluZWQpO1xuICBjb25zdCBQYXR0ZXJuU2hhcGUgPSBtYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IEJvb2xlYW5TaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcignYm9vbGVhbicpO1xuICBjb25zdCBOdW1iZXJTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG4gIGNvbnN0IEJpZ0ludFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6YmlnaW50JywgW10pO1xuICBjb25zdCBOYXRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsIFtdKTtcbiAgY29uc3QgU3RyaW5nU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpzdHJpbmcnLCBbXSk7XG4gIGNvbnN0IFN5bWJvbFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6c3ltYm9sJywgW10pO1xuICBjb25zdCBSZWNvcmRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJywgW0FueVNoYXBlLCBBbnlTaGFwZV0pO1xuICBjb25zdCBBcnJheVNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsIFtBbnlTaGFwZV0pO1xuICBjb25zdCBCeXRlQXJyYXlTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOmJ5dGVBcnJheScsIFtdKTtcbiAgY29uc3QgU2V0U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpzZXRPZicsIFtBbnlTaGFwZV0pO1xuICBjb25zdCBCYWdTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOmJhZ09mJywgW0FueVNoYXBlLCBBbnlTaGFwZV0pO1xuICBjb25zdCBNYXBTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOm1hcE9mJywgW0FueVNoYXBlLCBBbnlTaGFwZV0pO1xuICBjb25zdCBSZW1vdGFibGVTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcigncmVtb3RhYmxlJyk7XG4gIGNvbnN0IEVycm9yU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ2Vycm9yJyk7XG4gIGNvbnN0IFByb21pc2VTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcigncHJvbWlzZScpO1xuICBjb25zdCBVbmRlZmluZWRTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcigndW5kZWZpbmVkJyk7XG5cbiAgLyoqXG4gKiBGb3Igd2hlbiB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBwYXlsb2FkIGlzIHRoZSBvcHRpb25hbCBsaW1pdHMsXG4gKiBzbyB0aGF0IHdoZW4gaXQgaXMgYHVuZGVmaW5lZGAgaXQgaXMgZHJvcHBlZCBmcm9tIHRoZSBlbmQgb2YgdGhlXG4gKiBwYXlsb2FkcyBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHBheWxvYWRcbiAqL1xuICBjb25zdCBtYWtlTGltaXRzTWF0Y2hlciA9ICh0YWcsIHBheWxvYWQpID0+IHtcbiAgICBpZiAocGF5bG9hZFtwYXlsb2FkLmxlbmd0aCAtIDFdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBheWxvYWQgPSBoYXJkZW4ocGF5bG9hZC5zbGljZSgwLCBwYXlsb2FkLmxlbmd0aCAtIDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VNYXRjaGVyKHRhZywgcGF5bG9hZCk7XG4gIH07XG5cbiAgY29uc3QgbWFrZVJlbW90YWJsZU1hdGNoZXIgPSAobGFiZWwgPSB1bmRlZmluZWQpID0+XG4gICAgbGFiZWwgPT09IHVuZGVmaW5lZFxuICAgICAgPyBSZW1vdGFibGVTaGFwZVxuICAgICAgOiBtYWtlTWF0Y2hlcignbWF0Y2g6cmVtb3RhYmxlJywgaGFyZGVuKHsgbGFiZWwgfSkpO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gZW1wdHlcbiAqIEBwYXJhbSB7VH0gYmFzZVxuICogQHBhcmFtIHtUfSBbb3B0aW9uYWxdXG4gKiBAcGFyYW0ge1R9IFtyZXN0XVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuICBjb25zdCBtYWtlU3BsaXRQYXlsb2FkID0gKFxuICAgIGVtcHR5LFxuICAgIGJhc2UsXG4gICAgb3B0aW9uYWwgPSB1bmRlZmluZWQsXG4gICAgcmVzdCA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgaWYgKHJlc3QpIHtcbiAgICAgIHJldHVybiBbYmFzZSwgb3B0aW9uYWwgfHwgZW1wdHksIHJlc3RdO1xuICAgIH1cbiAgICBpZiAob3B0aW9uYWwpIHtcbiAgICAgIHJldHVybiBbYmFzZSwgb3B0aW9uYWxdO1xuICAgIH1cbiAgICByZXR1cm4gW2Jhc2VdO1xuICB9O1xuXG4gIC8qIC8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgLyoqIEB0eXBlIHtNYXRjaGVyTmFtZXNwYWNlfSAqL1xuICBjb25zdCBNID0gaGFyZGVuKHtcbiAgICBhbnk6ICgpID0+IEFueVNoYXBlLFxuICAgIGFuZDogKC4uLnBhdHRzKSA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6YW5kJywgcGF0dHMpLFxuICAgIG9yOiAoLi4ucGF0dHMpID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpvcicsIHBhdHRzKSxcbiAgICBub3Q6IHN1YlBhdHQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOm5vdCcsIHN1YlBhdHQpLFxuXG4gICAgc2NhbGFyOiAoKSA9PiBTY2FsYXJTaGFwZSxcbiAgICBrZXk6ICgpID0+IEtleVNoYXBlLFxuICAgIHBhdHRlcm46ICgpID0+IFBhdHRlcm5TaGFwZSxcbiAgICBraW5kOiBtYWtlS2luZE1hdGNoZXIsXG4gICAgdGFnZ2VkOiAodGFnUGF0dCA9IE0uc3RyaW5nKCksIHBheWxvYWRQYXR0ID0gTS5hbnkoKSkgPT5cbiAgICAgIG1ha2VNYXRjaGVyKCdtYXRjaDp0YWdnZWQnLCBoYXJkZW4oW3RhZ1BhdHQsIHBheWxvYWRQYXR0XSkpLFxuICAgIGJvb2xlYW46ICgpID0+IEJvb2xlYW5TaGFwZSxcbiAgICBudW1iZXI6ICgpID0+IE51bWJlclNoYXBlLFxuICAgIGJpZ2ludDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiaWdpbnQnLCBbbGltaXRzXSkgOiBCaWdJbnRTaGFwZSxcbiAgICBuYXQ6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bmF0JywgW2xpbWl0c10pIDogTmF0U2hhcGUsXG4gICAgc3RyaW5nOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN0cmluZycsIFtsaW1pdHNdKSA6IFN0cmluZ1NoYXBlLFxuICAgIHN5bWJvbDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzeW1ib2wnLCBbbGltaXRzXSkgOiBTeW1ib2xTaGFwZSxcbiAgICByZWNvcmQ6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLnJlY29yZE9mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBSZWNvcmRTaGFwZSxcbiAgICAvKiBzdHJ1Y3Q6IEEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weVJlY29yZHMgd2l0aCBhIGZpeGVkIHF1YW50aXR5IG9mKi9cbiAgICAvKiBlbnRyaWVzIHdoZXJlIHRoZSB2YWx1ZXMgbWF0Y2ggcGF0dGVybnMgZm9yIGNvcnJlc3BvbmRpbmcga2V5cyBpcyBtZXJlbHkqL1xuICAgIC8qIGEgaGFyZGVuZWQgb2JqZWN0IHdpdGggcGF0dGVybnMgaW4gdGhlIHBsYWNlcyBvZiB2YWx1ZXMgZm9yKi9cbiAgICAvKiBjb3JyZXNwb25kaW5nIGtleXMuKi9cbiAgICAvKiBGb3IgZXhhbXBsZSwgYSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBDb3B5UmVjb3JkcyB0aGF0IGhhdmUgYSBzdHJpbmcgdmFsdWUqL1xuICAgIC8qIGZvciB0aGUga2V5ICd4JyBhbmQgYSBudW1iZXIgZm9yIHRoZSBrZXkgJ3knIGlzOiovXG4gICAgLyogaGFyZGVuKHsgeDogTS5zdHJpbmcoKSwgeTogTS5udW1iZXIoKSB9KS4qL1xuICAgIGFycmF5OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gTS5hcnJheU9mKE0uYW55KCksIGxpbWl0cykgOiBBcnJheVNoYXBlLFxuICAgIC8qIHR1cGxlOiBBIHBhdHRlcm4gdGhhdCBtYXRjaGVzIENvcHlBcnJheXMgd2l0aCBhIGZpeGVkIHF1YW50aXR5IG9mIHZhbHVlcyovXG4gICAgLyogdGhhdCBtYXRjaCBhIGhldGVyb2dlbmVvdXMgYXJyYXkgb2YgcGF0dGVybnMgaXMgbWVyZWx5IGEgaGFyZGVuZWQgYXJyYXkqL1xuICAgIC8qIG9mIHRoZSByZXNwZWN0aXZlIHBhdHRlcm5zLiovXG4gICAgLyogRm9yIGV4YW1wbGUsIGEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weUFycmF5cyBvZiBsZW5ndGggMiB0aGF0IGhhdmUgYSovXG4gICAgLyogc3RyaW5nIGF0IGluZGV4IDAgYW5kIGEgbnVtYmVyIGF0IGluZGV4IDEgaXM6Ki9cbiAgICAvKiBoYXJkZW4oWyBNLnN0cmluZygpLCBNLm51bWJlcigpIF0pLiovXG4gICAgYnl0ZUFycmF5OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJ5dGVBcnJheScsIFtsaW1pdHNdKSA6IEJ5dGVBcnJheVNoYXBlLFxuICAgIHNldDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT4gKGxpbWl0cyA/IE0uc2V0T2YoTS5hbnkoKSwgbGltaXRzKSA6IFNldFNoYXBlKSxcbiAgICBiYWc6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLmJhZ09mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBCYWdTaGFwZSxcbiAgICBtYXA6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLm1hcE9mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBNYXBTaGFwZSxcbiAgICAvKiBoZXRlcm9nZW5lb3VzIG1hcDogQSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBDb3B5TWFwcyB3aXRoIGEgZml4ZWQgcXVhbnRpdHkqL1xuICAgIC8qIG9mIGVudHJpZXMgd2hlcmUgdGhlIHZhbHVlIGZvciBlYWNoIGtleSBtYXRjaGVzIGEgY29ycmVzcG9uZGluZyBwYXR0ZXJuKi9cbiAgICAvKiBpcyBtZXJlbHkgYSAoaGFyZGVuZWQpIENvcHlNYXAgd2l0aCBwYXR0ZXJucyBpbnN0ZWFkIG9mIHZhbHVlcyBmb3IgdGhlKi9cbiAgICAvKiBjb3JyZXNwb25kaW5nIGtleXMuKi9cbiAgICAvKiBGb3IgZXhhbXBsZSwgYSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBDb3B5TWFwcyB3aGVyZSB0aGUgdmFsdWUgZm9yIHRoZSBrZXkqL1xuICAgIC8qICd4JyBpcyBhIG51bWJlciBhbmQgdGhlIHZhbHVlIGZvciB0aGUga2V5ICd5JyBpcyBhIHN0cmluZyBpczoqL1xuICAgIC8qIG1ha2VDb3B5TWFwKFtbJ3gnLCBNLm51bWJlcigpXSwgWyd5JywgTS5zdHJpbmcoKV1dKS4qL1xuICAgIHJlbW90YWJsZTogbWFrZVJlbW90YWJsZU1hdGNoZXIsXG4gICAgZXJyb3I6ICgpID0+IEVycm9yU2hhcGUsXG4gICAgcHJvbWlzZTogKCkgPT4gUHJvbWlzZVNoYXBlLFxuICAgIHVuZGVmaW5lZDogKCkgPT4gVW5kZWZpbmVkU2hhcGUsXG4gICAgbnVsbDogKCkgPT4gbnVsbCxcblxuICAgIGx0OiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmx0JywgcmlnaHRPcGVyYW5kKSxcbiAgICBsdGU6IHJpZ2h0T3BlcmFuZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6bHRlJywgcmlnaHRPcGVyYW5kKSxcbiAgICBlcToga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleShrZXkpO1xuICAgICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gTS51bmRlZmluZWQoKSA6IGtleTtcbiAgICB9LFxuICAgIG5lcToga2V5ID0+IE0ubm90KE0uZXEoa2V5KSksXG4gICAgZ3RlOiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmd0ZScsIHJpZ2h0T3BlcmFuZCksXG4gICAgZ3Q6IHJpZ2h0T3BlcmFuZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6Z3QnLCByaWdodE9wZXJhbmQpLFxuXG4gICAgcmVjb3JkT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgdmFsdWVQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnJlY29yZE9mJywgW2tleVBhdHQsIHZhbHVlUGF0dCwgbGltaXRzXSksXG4gICAgYXJyYXlPZjogKHN1YlBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YXJyYXlPZicsIFtzdWJQYXR0LCBsaW1pdHNdKSxcbiAgICBzZXRPZjogKGtleVBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c2V0T2YnLCBba2V5UGF0dCwgbGltaXRzXSksXG4gICAgYmFnT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgY291bnRQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJhZ09mJywgW2tleVBhdHQsIGNvdW50UGF0dCwgbGltaXRzXSksXG4gICAgY29udGFpbmVySGFzOiAoZWxlbWVudFBhdHQgPSBNLmFueSgpLCBjb3VudFBhdHQgPSAxbiwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmNvbnRhaW5lckhhcycsIFtlbGVtZW50UGF0dCwgY291bnRQYXR0LCBsaW1pdHNdKSxcbiAgICBtYXBPZjogKGtleVBhdHQgPSBNLmFueSgpLCB2YWx1ZVBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bWFwT2YnLCBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHNdKSxcbiAgICBzcGxpdEFycmF5OiAoYmFzZSwgb3B0aW9uYWwgPSB1bmRlZmluZWQsIHJlc3QgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTWF0Y2hlcihcbiAgICAgICAgJ21hdGNoOnNwbGl0QXJyYXknLFxuICAgICAgICBtYWtlU3BsaXRQYXlsb2FkKFtdLCBiYXNlLCBvcHRpb25hbCwgcmVzdCksXG4gICAgICApLFxuICAgIHNwbGl0UmVjb3JkOiAoYmFzZSwgb3B0aW9uYWwgPSB1bmRlZmluZWQsIHJlc3QgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTWF0Y2hlcihcbiAgICAgICAgJ21hdGNoOnNwbGl0UmVjb3JkJyxcbiAgICAgICAgbWFrZVNwbGl0UGF5bG9hZCh7fSwgYmFzZSwgb3B0aW9uYWwsIHJlc3QpLFxuICAgICAgKSxcbiAgICBzcGxpdDogKGJhc2UsIHJlc3QgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpID09PSAnY29weUFycmF5Jykge1xuICAgICAgICAvKiBUT0RPIGF0LXRzLWV4cGVjdC1lcnJvciB3b3JrcyBsb2NhbGx5IGJ1dCBub3QgZnJvbSBAZW5kby9leG8qL1xuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgaXQgc2hvdWxkIGJlIGFuIGFycmF5Ki9cbiAgICAgICAgcmV0dXJuIE0uc3BsaXRBcnJheShiYXNlLCByZXN0ICYmIFtdLCByZXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNLnNwbGl0UmVjb3JkKGJhc2UsIHJlc3QgJiYge30sIHJlc3QpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcGFydGlhbDogKGJhc2UsIHJlc3QgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpID09PSAnY29weUFycmF5Jykge1xuICAgICAgICAvKiBUT0RPIGF0LXRzLWV4cGVjdC1lcnJvciB3b3JrcyBsb2NhbGx5IGJ1dCBub3QgZnJvbSBAZW5kby9leG8qL1xuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgaXQgc2hvdWxkIGJlIGFuIGFycmF5Ki9cbiAgICAgICAgcmV0dXJuIE0uc3BsaXRBcnJheShbXSwgYmFzZSwgcmVzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTS5zcGxpdFJlY29yZCh7fSwgYmFzZSwgcmVzdCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGVyZWY6IHQgPT4gTS5vcih0LCBNLnByb21pc2UoKSksXG4gICAgb3B0OiB0ID0+IE0ub3IoTS51bmRlZmluZWQoKSwgdCksXG5cbiAgICBpbnRlcmZhY2U6IChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMpID0+XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgbWFrZUludGVyZmFjZUd1YXJkKGludGVyZmFjZU5hbWUsIG1ldGhvZEd1YXJkcywgb3B0aW9ucyksXG4gICAgY2FsbDogKC4uLmFyZ1BhdHRlcm5zKSA9PlxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIG1ha2VNZXRob2RHdWFyZE1ha2VyKCdzeW5jJywgYXJnUGF0dGVybnMpLFxuICAgIGNhbGxXaGVuOiAoLi4uYXJnR3VhcmRzKSA9PlxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIG1ha2VNZXRob2RHdWFyZE1ha2VyKCdhc3luYycsIGFyZ0d1YXJkcyksXG5cbiAgICBhd2FpdDogYXJnUGF0dGVybiA9PlxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIG1ha2VBd2FpdEFyZ0d1YXJkKGFyZ1BhdHRlcm4pLFxuICAgIHJhdzogKCkgPT5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBtYWtlUmF3R3VhcmQoKSxcbiAgfSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgY2hlY2tNYXRjaGVzLFxuICAgIG1hdGNoZXMsXG4gICAgbXVzdE1hdGNoLFxuICAgIGFzc2VydFBhdHRlcm4sXG4gICAgaXNQYXR0ZXJuLFxuICAgIGdldFJhbmtDb3ZlcixcbiAgICBNLFxuICAgIGtpbmRPZixcbiAgICBjb250YWluZXJIYXNTcGxpdCxcbiAgfSk7XG59O1xuXG4vKiBPbmx5IGluY2x1ZGUgdGhvc2Ugd2hvc2UgbWVhbmluZyBpcyBpbmRlcGVuZGVudCBvZiBhbiBpbXB1dGVkIHNvcnQgb3JkZXIqL1xuLyogb2YgcmVtb3RhYmxlcywgb3Igb2YgZW5jb2Rpbmcgb2YgcGFzc2FibGUgYXMgc29ydGFibGUgc3RyaW5ncy4gVGh1cywqL1xuLyogZ2V0UmFua0NvdmVyIGlzIG9taXR0ZWQuIFRvIGdldCBvbmUsIHlvdSdkIG5lZWQgdG8gaW5zdGFudGlhdGUqL1xuLyogYG1ha2VQYXR0ZXJuS2l0KClgIHlvdXJzZWxmLiBTaW5jZSB0aGVyZSBhcmUgY3VycmVudGx5IG5vIGV4dGVybmFsKi9cbi8qIHVzZXMgb2YgYGdldFJhbmtDb3ZlcmAsIGZvciBjbGFyaXR5IGR1cmluZyBkZXZlbG9wbWVudCwgYG1ha2VQYXR0ZXJuS2l0YCovXG4vKiBpcyBub3QgY3VycmVudGx5IGV4cG9ydGVkLiovXG4gICAgICAgY29uc3Qge1xuICBjaGVja01hdGNoZXMsXG4gIG1hdGNoZXMsXG4gIG11c3RNYXRjaCxcbiAgYXNzZXJ0UGF0dGVybixcbiAgaXNQYXR0ZXJuLFxuICBnZXRSYW5rQ292ZXIsXG4gIE0sXG4gIGtpbmRPZixcbiAgY29udGFpbmVySGFzU3BsaXQsXG59ID0gbWFrZVBhdHRlcm5LaXQoKTskaM2PX29uY2UuY2hlY2tNYXRjaGVzKGNoZWNrTWF0Y2hlcyk7JGjNj19vbmNlLm1hdGNoZXMobWF0Y2hlcyk7JGjNj19vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpOyRozY9fb25jZS5hc3NlcnRQYXR0ZXJuKGFzc2VydFBhdHRlcm4pOyRozY9fb25jZS5pc1BhdHRlcm4oaXNQYXR0ZXJuKTskaM2PX29uY2UuZ2V0UmFua0NvdmVyKGdldFJhbmtDb3Zlcik7JGjNj19vbmNlLk0oTSk7JGjNj19vbmNlLmtpbmRPZihraW5kT2YpOyRozY9fb25jZS5jb250YWluZXJIYXNTcGxpdChjb250YWluZXJIYXNTcGxpdCk7XG5cbk1NID0gTTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBHdWFyZHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTS5hd2FpdCguLi4pKi9cbmNvbnN0IEF3YWl0QXJnR3VhcmRQYXlsb2FkU2hhcGUgPSBoYXJkZW4oe1xuICBhcmdHdWFyZDogTS5wYXR0ZXJuKCksXG59KTtcblxuICAgICAgIGNvbnN0IEF3YWl0QXJnR3VhcmRTaGFwZSA9IE0ua2luZCgnZ3VhcmQ6YXdhaXRBcmdHdWFyZCcpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge3NwZWNpbWVuIGlzIEF3YWl0QXJnR3VhcmR9XG4gKi8kaM2PX29uY2UuQXdhaXRBcmdHdWFyZFNoYXBlKEF3YWl0QXJnR3VhcmRTaGFwZSk7XG4gICAgICAgY29uc3QgaXNBd2FpdEFyZ0d1YXJkID0gc3BlY2ltZW4gPT5cbiAgbWF0Y2hlcyhzcGVjaW1lbiwgQXdhaXRBcmdHdWFyZFNoYXBlKTskaM2PX29uY2UuaXNBd2FpdEFyZ0d1YXJkKGlzQXdhaXRBcmdHdWFyZCk7XG5oYXJkZW4oaXNBd2FpdEFyZ0d1YXJkKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIEF3YWl0QXJnR3VhcmR9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRBd2FpdEFyZ0d1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIEF3YWl0QXJnR3VhcmRTaGFwZSwgJ2F3YWl0QXJnR3VhcmQnKTtcbn07JGjNj19vbmNlLmFzc2VydEF3YWl0QXJnR3VhcmQoYXNzZXJ0QXdhaXRBcmdHdWFyZCk7XG5oYXJkZW4oYXNzZXJ0QXdhaXRBcmdHdWFyZCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBhcmdQYXR0ZXJuXG4gKiBAcmV0dXJucyB7QXdhaXRBcmdHdWFyZH1cbiAqL1xuY29uc3QgbWFrZUF3YWl0QXJnR3VhcmQgPSBhcmdQYXR0ZXJuID0+IHtcbiAgLyoqIEB0eXBlIHtBd2FpdEFyZ0d1YXJkfSAqL1xuICBjb25zdCByZXN1bHQgPSBtYWtlVGFnZ2VkKCdndWFyZDphd2FpdEFyZ0d1YXJkJywge1xuICAgIGFyZ0d1YXJkOiBhcmdQYXR0ZXJuLFxuICB9KTtcbiAgYXNzZXJ0QXdhaXRBcmdHdWFyZChyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyogTS5yYXcoKSovXG5cbmNvbnN0IFJhd0d1YXJkUGF5bG9hZFNoYXBlID0gTS5yZWNvcmQoKTtcblxuICAgICAgIGNvbnN0IFJhd0d1YXJkU2hhcGUgPSBNLmtpbmQoJ2d1YXJkOnJhd0d1YXJkJyk7JGjNj19vbmNlLlJhd0d1YXJkU2hhcGUoUmF3R3VhcmRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBpc1Jhd0d1YXJkID0gc3BlY2ltZW4gPT4gbWF0Y2hlcyhzcGVjaW1lbiwgUmF3R3VhcmRTaGFwZSk7JGjNj19vbmNlLmlzUmF3R3VhcmQoaXNSYXdHdWFyZCk7XG5cbiAgICAgICBjb25zdCBhc3NlcnRSYXdHdWFyZCA9IHNwZWNpbWVuID0+XG4gIG11c3RNYXRjaChzcGVjaW1lbiwgUmF3R3VhcmRTaGFwZSwgJ3Jhd0d1YXJkJyk7XG5cbi8qKlxuICogQHJldHVybnMge1Jhd0d1YXJkfVxuICovJGjNj19vbmNlLmFzc2VydFJhd0d1YXJkKGFzc2VydFJhd0d1YXJkKTtcbmNvbnN0IG1ha2VSYXdHdWFyZCA9ICgpID0+IG1ha2VUYWdnZWQoJ2d1YXJkOnJhd0d1YXJkJywge30pO1xuXG4vKiBNLmNhbGwoLi4uKSovXG4vKiBNLmNhbGxXaGVuKC4uLikqL1xuXG4gICAgICAgY29uc3QgU3luY1ZhbHVlR3VhcmRTaGFwZSA9IE0ub3IoUmF3R3VhcmRTaGFwZSwgTS5wYXR0ZXJuKCkpOyRozY9fb25jZS5TeW5jVmFsdWVHdWFyZFNoYXBlKFN5bmNWYWx1ZUd1YXJkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUgPSBNLmFycmF5T2YoU3luY1ZhbHVlR3VhcmRTaGFwZSk7JGjNj19vbmNlLlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKTtcblxuY29uc3QgQXJnR3VhcmRTaGFwZSA9IE0ub3IoUmF3R3VhcmRTaGFwZSwgQXdhaXRBcmdHdWFyZFNoYXBlLCBNLnBhdHRlcm4oKSk7XG4gICAgICAgY29uc3QgQXJnR3VhcmRMaXN0U2hhcGUgPSBNLmFycmF5T2YoQXJnR3VhcmRTaGFwZSk7JGjNj19vbmNlLkFyZ0d1YXJkTGlzdFNoYXBlKEFyZ0d1YXJkTGlzdFNoYXBlKTtcblxuY29uc3QgU3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlID0gaGFyZGVuKHtcbiAgY2FsbEtpbmQ6ICdzeW5jJyxcbiAgYXJnR3VhcmRzOiBTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxcbiAgb3B0aW9uYWxBcmdHdWFyZHM6IE0ub3B0KFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKSxcbiAgcmVzdEFyZ0d1YXJkOiBNLm9wdChTeW5jVmFsdWVHdWFyZFNoYXBlKSxcbiAgcmV0dXJuR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG59KTtcblxuY29uc3QgQXN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9IGhhcmRlbih7XG4gIGNhbGxLaW5kOiAnYXN5bmMnLFxuICBhcmdHdWFyZHM6IEFyZ0d1YXJkTGlzdFNoYXBlLFxuICBvcHRpb25hbEFyZ0d1YXJkczogTS5vcHQoQXJnR3VhcmRMaXN0U2hhcGUpLFxuICByZXN0QXJnR3VhcmQ6IE0ub3B0KFN5bmNWYWx1ZUd1YXJkU2hhcGUpLFxuICByZXR1cm5HdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbn0pO1xuXG4gICAgICAgY29uc3QgTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSBNLm9yKFxuICBTeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4gIEFzeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4pOyRozY9fb25jZS5NZXRob2RHdWFyZFBheWxvYWRTaGFwZShNZXRob2RHdWFyZFBheWxvYWRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBNZXRob2RHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDptZXRob2RHdWFyZCcpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgTWV0aG9kR3VhcmR9XG4gKi8kaM2PX29uY2UuTWV0aG9kR3VhcmRTaGFwZShNZXRob2RHdWFyZFNoYXBlKTtcbiAgICAgICBjb25zdCBhc3NlcnRNZXRob2RHdWFyZCA9IHNwZWNpbWVuID0+IHtcbiAgbXVzdE1hdGNoKHNwZWNpbWVuLCBNZXRob2RHdWFyZFNoYXBlLCAnbWV0aG9kR3VhcmQnKTtcbn07JGjNj19vbmNlLmFzc2VydE1ldGhvZEd1YXJkKGFzc2VydE1ldGhvZEd1YXJkKTtcbmhhcmRlbihhc3NlcnRNZXRob2RHdWFyZCk7XG5cbi8qKlxuICogQHBhcmFtIHsnc3luYyd8J2FzeW5jJ30gY2FsbEtpbmRcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gYXJnR3VhcmRzXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IFtvcHRpb25hbEFyZ0d1YXJkc11cbiAqIEBwYXJhbSB7U3luY1ZhbHVlR3VhcmR9IFtyZXN0QXJnR3VhcmRdXG4gKiBAcmV0dXJucyB7TWV0aG9kR3VhcmRNYWtlcn1cbiAqL1xuY29uc3QgbWFrZU1ldGhvZEd1YXJkTWFrZXIgPSAoXG4gIGNhbGxLaW5kLFxuICBhcmdHdWFyZHMsXG4gIG9wdGlvbmFsQXJnR3VhcmRzID0gdW5kZWZpbmVkLFxuICByZXN0QXJnR3VhcmQgPSB1bmRlZmluZWQsXG4pID0+XG4gIGhhcmRlbih7XG4gICAgb3B0aW9uYWw6ICguLi5vcHRBcmdHdWFyZHMpID0+IHtcbiAgICAgIG9wdGlvbmFsQXJnR3VhcmRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBDYW4gb25seSBoYXZlIG9uZSBzZXQgb2Ygb3B0aW9uYWwgZ3VhcmRzYDtcbiAgICAgIHJlc3RBcmdHdWFyZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgb3B0aW9uYWwgYXJnIGd1YXJkcyBtdXN0IGNvbWUgYmVmb3JlIHJlc3QgYXJnYDtcbiAgICAgIHJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihjYWxsS2luZCwgYXJnR3VhcmRzLCBvcHRBcmdHdWFyZHMpO1xuICAgIH0sXG4gICAgcmVzdDogckFyZ0d1YXJkID0+IHtcbiAgICAgIHJlc3RBcmdHdWFyZCA9PT0gdW5kZWZpbmVkIHx8IEZhaWxgQ2FuIG9ubHkgaGF2ZSBvbmUgcmVzdCBhcmdgO1xuICAgICAgcmV0dXJuIG1ha2VNZXRob2RHdWFyZE1ha2VyKFxuICAgICAgICBjYWxsS2luZCxcbiAgICAgICAgYXJnR3VhcmRzLFxuICAgICAgICBvcHRpb25hbEFyZ0d1YXJkcyxcbiAgICAgICAgckFyZ0d1YXJkLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHJldHVybnM6IChyZXR1cm5HdWFyZCA9IE0udW5kZWZpbmVkKCkpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7TWV0aG9kR3VhcmR9ICovXG4gICAgICBjb25zdCByZXN1bHQgPSBtYWtlVGFnZ2VkKCdndWFyZDptZXRob2RHdWFyZCcsIHtcbiAgICAgICAgY2FsbEtpbmQsXG4gICAgICAgIGFyZ0d1YXJkcyxcbiAgICAgICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgICAgIHJlc3RBcmdHdWFyZCxcbiAgICAgICAgcmV0dXJuR3VhcmQsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydE1ldGhvZEd1YXJkKHJlc3VsdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH0pO1xuXG4gICAgICAgY29uc3QgSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAgaW50ZXJmYWNlTmFtZTogTS5zdHJpbmcoKSxcbiAgICBtZXRob2RHdWFyZHM6IE0ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTWV0aG9kR3VhcmRTaGFwZSksXG4gIH0sXG4gIHtcbiAgICBkZWZhdWx0R3VhcmRzOiBNLm9yKE0udW5kZWZpbmVkKCksICdwYXNzYWJsZScsICdyYXcnKSxcbiAgICBzbG9wcHk6IE0uYm9vbGVhbigpLFxuICAgIHN5bWJvbE1ldGhvZEd1YXJkczogTS5tYXBPZihNLnN5bWJvbCgpLCBNZXRob2RHdWFyZFNoYXBlKSxcbiAgfSxcbik7JGjNj19vbmNlLkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlKEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IEludGVyZmFjZUd1YXJkU2hhcGUgPSBNLmtpbmQoJ2d1YXJkOmludGVyZmFjZUd1YXJkJyk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBJbnRlcmZhY2VHdWFyZH1cbiAqLyRozY9fb25jZS5JbnRlcmZhY2VHdWFyZFNoYXBlKEludGVyZmFjZUd1YXJkU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydEludGVyZmFjZUd1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIEludGVyZmFjZUd1YXJkU2hhcGUsICdpbnRlcmZhY2VHdWFyZCcpO1xufTskaM2PX29uY2UuYXNzZXJ0SW50ZXJmYWNlR3VhcmQoYXNzZXJ0SW50ZXJmYWNlR3VhcmQpO1xuaGFyZGVuKGFzc2VydEludGVyZmFjZUd1YXJkKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgTWV0aG9kR3VhcmQ+fSBbTSA9IFJlY29yZDxQcm9wZXJ0eUtleSwgTWV0aG9kR3VhcmQ+XVxuICogQHBhcmFtIHtzdHJpbmd9IGludGVyZmFjZU5hbWVcbiAqIEBwYXJhbSB7TX0gbWV0aG9kR3VhcmRzXG4gKiBAcGFyYW0ge3sgc2xvcHB5PzogYm9vbGVhbiwgZGVmYXVsdEd1YXJkcz86IERlZmF1bHRHdWFyZFR5cGUgfX0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SW50ZXJmYWNlR3VhcmQ8TT59XG4gKi9cbmNvbnN0IG1ha2VJbnRlcmZhY2VHdWFyZCA9IChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7IHNsb3BweSA9IGZhbHNlLCBkZWZhdWx0R3VhcmRzID0gc2xvcHB5ID8gJ3Bhc3NhYmxlJyA6IHVuZGVmaW5lZCB9ID1cbiAgICBvcHRpb25zO1xuICAvKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHN0cmluZy1rZXllZCBtZXRob2QgZ3VhcmRzIGFyZSByZXByZXNlbnRlZCBpbiovXG4gIC8qIGEgQ29weVJlY29yZC4gQnV0IHN5bWJvbC1rZXllZCBtZXRob2RzIGNhbm5vdCBiZSwgc28gd2UgcHV0IHRob3NlIGluIGEqL1xuICAvKiBDb3B5TWFwIHdoZW4gcHJlc2VudC4qL1xuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIE1ldGhvZEd1YXJkPn0gKi9cbiAgY29uc3Qgc3RyaW5nTWV0aG9kR3VhcmRzID0ge307XG4gIC8qKiBAdHlwZSB7QXJyYXk8W3N5bWJvbCwgTWV0aG9kR3VhcmRdPn0gKi9cbiAgY29uc3Qgc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcyA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBvd25LZXlzKG1ldGhvZEd1YXJkcykpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1ldGhvZEd1YXJkc1svKiogQHR5cGUge3N0cmluZ30gKi8gKGtleSldO1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3ltYm9sJykge1xuICAgICAgc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmluZ01ldGhvZEd1YXJkc1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIC8qKiBAdHlwZSB7SW50ZXJmYWNlR3VhcmR9ICovXG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2d1YXJkOmludGVyZmFjZUd1YXJkJywge1xuICAgIGludGVyZmFjZU5hbWUsXG4gICAgbWV0aG9kR3VhcmRzOiBzdHJpbmdNZXRob2RHdWFyZHMsXG4gICAgLi4uKHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMubGVuZ3RoXG4gICAgICA/IHsgc3ltYm9sTWV0aG9kR3VhcmRzOiBtYWtlQ29weU1hcChzeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzKSB9XG4gICAgICA6IHt9KSxcbiAgICBkZWZhdWx0R3VhcmRzLFxuICB9KTtcbiAgYXNzZXJ0SW50ZXJmYWNlR3VhcmQocmVzdWx0KTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7SW50ZXJmYWNlR3VhcmQ8TT59ICovIChyZXN1bHQpO1xufTtcblxuY29uc3QgR3VhcmRQYXlsb2FkU2hhcGVzID0gaGFyZGVuKHtcbiAgJ2d1YXJkOmF3YWl0QXJnR3VhcmQnOiBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlLFxuICAnZ3VhcmQ6cmF3R3VhcmQnOiBSYXdHdWFyZFBheWxvYWRTaGFwZSxcbiAgJ2d1YXJkOm1ldGhvZEd1YXJkJzogTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4gICdndWFyZDppbnRlcmZhY2VHdWFyZCc6IEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlLFxufSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0TGltaXRzIjpbImRlZmF1bHRMaW1pdHMiXSwiY2hlY2tNYXRjaGVzIjpbImNoZWNrTWF0Y2hlcyJdLCJtYXRjaGVzIjpbIm1hdGNoZXMiXSwibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiJdLCJnZXRSYW5rQ292ZXIiOlsiZ2V0UmFua0NvdmVyIl0sIk0iOlsiTSJdLCJraW5kT2YiOlsia2luZE9mIl0sImNvbnRhaW5lckhhc1NwbGl0IjpbImNvbnRhaW5lckhhc1NwbGl0Il0sIkF3YWl0QXJnR3VhcmRTaGFwZSI6WyJBd2FpdEFyZ0d1YXJkU2hhcGUiXSwiaXNBd2FpdEFyZ0d1YXJkIjpbImlzQXdhaXRBcmdHdWFyZCJdLCJhc3NlcnRBd2FpdEFyZ0d1YXJkIjpbImFzc2VydEF3YWl0QXJnR3VhcmQiXSwiUmF3R3VhcmRTaGFwZSI6WyJSYXdHdWFyZFNoYXBlIl0sImlzUmF3R3VhcmQiOlsiaXNSYXdHdWFyZCJdLCJhc3NlcnRSYXdHdWFyZCI6WyJhc3NlcnRSYXdHdWFyZCJdLCJTeW5jVmFsdWVHdWFyZFNoYXBlIjpbIlN5bmNWYWx1ZUd1YXJkU2hhcGUiXSwiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiOlsiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiXSwiQXJnR3VhcmRMaXN0U2hhcGUiOlsiQXJnR3VhcmRMaXN0U2hhcGUiXSwiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiOlsiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiXSwiTWV0aG9kR3VhcmRTaGFwZSI6WyJNZXRob2RHdWFyZFNoYXBlIl0sImFzc2VydE1ldGhvZEd1YXJkIjpbImFzc2VydE1ldGhvZEd1YXJkIl0sIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIjpbIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIl0sIkludGVyZmFjZUd1YXJkU2hhcGUiOlsiSW50ZXJmYWNlR3VhcmRTaGFwZSJdLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCI6WyJhc3NlcnRJbnRlcmZhY2VHdWFyZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAiAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAALArFhswkAALMJAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQsbWVtb1JhY2U7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLFskaM2PX2EgPT4gKG1lbW9SYWNlID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCduYW1lJyx7dmFsdWU6XCJtYWtlUHJvbWlzZUtpdFwifSk7JGjNj19vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCduYW1lJyx7dmFsdWU6XCJyYWNlUHJvbWlzZXNcIn0pOyRozY9fb25jZS5yYWNlUHJvbWlzZXMocmFjZVByb21pc2VzKTtcblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2UgPSBnbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlIHx8IFByb21pc2U7XG5cbi8qKlxuICogbWFrZVByb21pc2VLaXQoKSBidWlsZHMgYSBQcm9taXNlIG9iamVjdCwgYW5kIHJldHVybnMgYSByZWNvcmRcbiAqIGNvbnRhaW5pbmcgdGhlIHByb21pc2UgaXRzZWxmLCBhcyB3ZWxsIGFzIHNlcGFyYXRlIGZhY2V0cyBmb3IgcmVzb2x2aW5nXG4gKiBhbmQgcmVqZWN0aW5nIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3NyYy90eXBlcy5qcycpLlByb21pc2VLaXQ8VD59XG4gKi9cbiAgICAgICBmdW5jdGlvbiBtYWtlUHJvbWlzZUtpdCgpIHtcbiAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0gPSBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuICBjb25zdCBwcm9taXNlID0gbmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG4gIHJldHVybiBoYXJkZW4oeyBwcm9taXNlLCByZXNvbHZlLCByZWplY3QgfSk7XG59XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vKiBOQjogQW5vdGhlciBpbXBsZW1lbnRhdGlvbiBmb3IgUHJvbWlzZS5yYWNlIHdvdWxkIGJlIHRvIHVzZSB0aGUgcmVsZWFzaW5nIGV4ZWN1dG9yLCovXG4vKiBIb3dldmVyIHdoaWxlIGl0IHdvdWxkIG5vIGxvbmdlciBsZWFrIHRoZSByYWNlZCBwcm9taXNlIG9iamVjdHMgdGhlbXNlbHZlcywgaXQgd291bGQqL1xuLyogc3RpbGwgbGVhayByZWFjdGlvbnMgb24gdGhlIG5vbi1yZXNvbHZlZCBwcm9taXNlcyBjb250ZW5kaW5nIGZvciB0aGUgcmFjZS4qL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUge3JlYWRvbmx5IHVua25vd25bXSB8IFtdfSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbiAgICAgICBmdW5jdGlvbiByYWNlUHJvbWlzZXModmFsdWVzKSB7XG4gIHJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLCB2YWx1ZXMpKTtcbn1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADnrhCZAwMAAAMDAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsJ25hbWUnLHt2YWx1ZTpcImlzUHJvbWlzZVwifSk7JGjNj19vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOy8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBtYXliZVByb21pc2UgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHttYXliZVByb21pc2UgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuICAgICAgIGZ1bmN0aW9uIGlzUHJvbWlzZShtYXliZVByb21pc2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpID09PSBtYXliZVByb21pc2U7XG59XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAx2hNn0QWAABEFgAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogSW5pdGlhbCB2ZXJzaW9uIGF1dGhvcmVkIGJ5IEJyaWFuIEtpbTpcbmh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMTc0NjkjaXNzdWVjb21tZW50LTY4NTIxNjc3N1xuIFRoaXMgaXMgZnJlZSBhbmQgdW5lbmN1bWJlcmVkIHNvZnR3YXJlIHJlbGVhc2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4uXG4gQW55b25lIGlzIGZyZWUgdG8gY29weSwgbW9kaWZ5LCBwdWJsaXNoLCB1c2UsIGNvbXBpbGUsIHNlbGwsIG9yXG5kaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsIGVpdGhlciBpbiBzb3VyY2UgY29kZSBmb3JtIG9yIGFzIGEgY29tcGlsZWRcbmJpbmFyeSwgZm9yIGFueSBwdXJwb3NlLCBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsLCBhbmQgYnkgYW55XG5tZWFucy5cbiBJbiBqdXJpc2RpY3Rpb25zIHRoYXQgcmVjb2duaXplIGNvcHlyaWdodCBsYXdzLCB0aGUgYXV0aG9yIG9yIGF1dGhvcnNcbm9mIHRoaXMgc29mdHdhcmUgZGVkaWNhdGUgYW55IGFuZCBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZVxuc29mdHdhcmUgdG8gdGhlIHB1YmxpYyBkb21haW4uIFdlIG1ha2UgdGhpcyBkZWRpY2F0aW9uIGZvciB0aGUgYmVuZWZpdFxub2YgdGhlIHB1YmxpYyBhdCBsYXJnZSBhbmQgdG8gdGhlIGRldHJpbWVudCBvZiBvdXIgaGVpcnMgYW5kXG5zdWNjZXNzb3JzLiBXZSBpbnRlbmQgdGhpcyBkZWRpY2F0aW9uIHRvIGJlIGFuIG92ZXJ0IGFjdCBvZlxucmVsaW5xdWlzaG1lbnQgaW4gcGVycGV0dWl0eSBvZiBhbGwgcHJlc2VudCBhbmQgZnV0dXJlIHJpZ2h0cyB0byB0aGlzXG5zb2Z0d2FyZSB1bmRlciBjb3B5cmlnaHQgbGF3LlxuIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SXG5PVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSxcbkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUlxuT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG8gPGh0dHA6Ly91bmxpY2Vuc2Uub3JnLz5cbiovXG5cblxuXG5cblxuXG5cbi8qKlxuICogVE9ETyBDb25zb2xpZGF0ZSB3aXRoIGBpc1ByaW1pdGl2ZWAgdGhhdCdzIGN1cnJlbnRseSBpbiBgQGVuZG8vcGFzcy1zdHlsZWAuXG4gKiBMYXllcmluZyBjb25zdHJhaW50cyBtYWtlIHRoaXMgdHJpY2t5LCB3aGljaCBpcyB3aHkgd2UgaGF2ZW4ndCB5ZXQgZmlndXJlZFxuICogb3V0IGhvdyB0byBkbyB0aGlzLlxuICpcbiAqIEB0eXBlIHsodmFsOiB1bmtub3duKSA9PiB2YWwgaXMgKHVuZGVmaW5lZFxuICogfCBudWxsXG4gKiB8IGJvb2xlYW5cbiAqIHwgbnVtYmVyXG4gKiB8IGJpZ2ludFxuICogfCBzdHJpbmdcbiAqIHwgc3ltYm9sKX1cbiAqL1xuY29uc3QgaXNQcmltaXRpdmUgPSB2YWwgPT5cbiAgIXZhbCB8fCAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZmVycmVkXG4gKiBAcHJvcGVydHkgeyh2YWx1ZT86IElNUE9SVChcIi4vdHlwZXMuanNcIikuRVJlZjxUPiApID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwcm9wZXJ0eSB7KGVycj86IGFueSApID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBuZXZlclxuICogIHwge3NldHRsZWQ6IGZhbHNlLCBkZWZlcnJlZHM6IFNldDxEZWZlcnJlZD59XG4gKiAgfCB7c2V0dGxlZDogdHJ1ZSwgZGVmZXJyZWRzPzogdW5kZWZpbmVkfVxuICogfSBQcm9taXNlTWVtb1JlY29yZFxuICovXG5cbi8qIEtleXMgYXJlIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIHJhY2UsIHZhbHVlcyBhcmUgYSByZWNvcmQgb2YgZGF0YSBjb250YWluaW5nIGEqL1xuLyogc2V0IG9mIGRlZmVycmVkcyBhbmQgd2hldGhlciB0aGUgdmFsdWUgaGFzIHNldHRsZWQuKi9cbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIFByb21pc2VNZW1vUmVjb3JkPn0gKi9cbmNvbnN0IGtub3duUHJvbWlzZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZU1lbW9SZWNvcmQgfCB1bmRlZmluZWR9IHJlY29yZFxuICogQHJldHVybnMge1NldDxEZWZlcnJlZD59XG4gKi9cbmNvbnN0IG1hcmtTZXR0bGVkID0gcmVjb3JkID0+IHtcbiAgaWYgKCFyZWNvcmQgfHwgcmVjb3JkLnNldHRsZWQpIHtcbiAgICByZXR1cm4gbmV3IFNldCgpO1xuICB9XG5cbiAgY29uc3QgeyBkZWZlcnJlZHMgfSA9IHJlY29yZDtcbiAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIHtcbiAgICBkZWZlcnJlZHM6IHVuZGVmaW5lZCxcbiAgICBzZXR0bGVkOiB0cnVlLFxuICB9KTtcbiAgT2JqZWN0LmZyZWV6ZShyZWNvcmQpO1xuICByZXR1cm4gZGVmZXJyZWRzO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7UHJvbWlzZU1lbW9SZWNvcmR9XG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQgPSB2YWx1ZSA9PiB7XG4gIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAvKiBJZiB0aGUgY29udGVuZGVyIGlzIGEgcHJpbWl0aXZlLCBhdHRlbXB0aW5nIHRvIHVzZSBpdCBhcyBhIGtleSBpbiB0aGUqL1xuICAgIC8qIHdlYWttYXAgd291bGQgdGhyb3cgYW4gZXJyb3IuIEx1Y2tpbHksIGl0IGlzIHNhZmUgdG8gY2FsbCovXG4gICAgLyogYFByb21pc2UucmVzb2x2ZShjb250ZW5kZXIpLnRoZW5gIG9uIGEgcHJpbWl0aXZlIHZhbHVlIG11bHRpcGxlIHRpbWVzKi9cbiAgICAvKiBiZWNhdXNlIHRoZSBwcm9taXNlIGZ1bGZpbGxzIGltbWVkaWF0ZWx5LiBTbyB3ZSBmYWtlIGEgc2V0dGxlZCByZWNvcmQuKi9cbiAgICByZXR1cm4gaGFyZGVuKHsgc2V0dGxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIGxldCByZWNvcmQgPSBrbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZWNvcmQgPSB7IGRlZmVycmVkczogbmV3IFNldCgpLCBzZXR0bGVkOiBmYWxzZSB9O1xuICAgIGtub3duUHJvbWlzZXMuc2V0KHZhbHVlLCByZWNvcmQpO1xuICAgIC8qIFRoaXMgY2FsbCB0byBgdGhlbmAgaGFwcGVucyBvbmNlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHZhbHVlLiovXG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuICAgICAgdmFsID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlc29sdmUgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlamVjdCB9IG9mIG1hcmtTZXR0bGVkKHJlY29yZCkpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCB7IHJhY2UgfSA9IHtcbiAgLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIHtyZWFkb25seSB1bmtub3duW10gfCBbXX0gVFxuICogQHRlbXBsYXRlIHtQcm9taXNlQ29uc3RydWN0b3J9IFtQPVByb21pc2VDb25zdHJ1Y3Rvcl1cbiAqIEB0aGlzIHtQfVxuICogQHBhcmFtIHtUfSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFRbbnVtYmVyXT4+fSBBIG5ldyBQcm9taXNlLlxuICovXG4gIHJhY2UodmFsdWVzKSB7XG4gICAgbGV0IGRlZmVycmVkO1xuICAgIC8qKiBAdHlwZSB7Wy4uLlRdfSAqL1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgZmlsbGVkIGJ5IHRoZSBsb29wKi9cbiAgICBjb25zdCBjYWNoZWRWYWx1ZXMgPSBbXTtcbiAgICBjb25zdCBDID0gdGhpcztcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgQygocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBkZWZlcnJlZCA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICBjYWNoZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHsgc2V0dGxlZCwgZGVmZXJyZWRzIH0gPSBnZXRNZW1vUmVjb3JkKHZhbHVlKTtcbiAgICAgICAgaWYgKHNldHRsZWQpIHtcbiAgICAgICAgICAvKiBJZiB0aGUgY29udGVuZGVyIGlzIHNldHRsZWQgKGluY2x1ZGluZyBwcmltaXRpdmVzKSwgaXQgaXMgc2FmZSovXG4gICAgICAgICAgLyogdG8gY2FsbCBgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuYCBvbiBpdC4qL1xuICAgICAgICAgIEMucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKiBUaGUgZmluYWxseSBjYWxsYmFjayBleGVjdXRlcyB3aGVuIGFueSB2YWx1ZSBzZXR0bGVzLCBwcmV2ZW50aW5nIGFueSBvZiovXG4gICAgLyogdGhlIHVucmVzb2x2ZWQgdmFsdWVzIGZyb20gcmV0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZXNvbHZlZCB2YWx1ZS4qL1xuICAgIHJldHVybiByZXN1bHQuZmluYWxseSgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcykge1xuICAgICAgICBjb25zdCB7IGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChkZWZlcnJlZHMpIHtcbiAgICAgICAgICBkZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9LFxufTskaM2PX29uY2UucmFjZShyYWNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACJ+oaB0IAAAdCAAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIFByb21pc2VFeGVjdXRvciBUaGUgcHJvbWlzZSBleGVjdXRvclxuICogQHBhcmFtIHsodmFsdWU6IElNUE9SVCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpIGJ1aWxkcyByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgd2hpY2ggZHJvcCByZWZlcmVuY2VzXG4gKiB0byB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIGdhdGhlcmVkIGZyb20gYW4gZXhlY3V0b3IgdG8gYmUgdXNlZCB3aXRoIGFcbiAqIHByb21pc2UgY29uc3RydWN0b3IuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQaWNrPElNUE9SVCgnLi90eXBlcy5qcycpLlByb21pc2VLaXQ8VD4sICdyZXNvbHZlJyB8ICdyZWplY3QnPiAmIHsgZXhlY3V0b3I6IFByb21pc2VFeGVjdXRvcjxUPn19XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAoKSA9PiB7XG4gIC8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgodmFsdWU6IElNUE9SVCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWQpfSAqL1xuICBsZXQgaW50ZXJuYWxSZXNvbHZlO1xuICAvKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZCl9ICovXG4gIGxldCBpbnRlcm5hbFJlamVjdDtcblxuICAvKiogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+fSB2YWx1ZSAqL1xuICBjb25zdCByZXNvbHZlID0gdmFsdWUgPT4ge1xuICAgIGlmIChpbnRlcm5hbFJlc29sdmUpIHtcbiAgICAgIGludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG4gICAgICBpbnRlcm5hbFJlc29sdmUgPSBudWxsO1xuICAgICAgaW50ZXJuYWxSZWplY3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIEBwYXJhbSB7dW5rbm93bn0gcmVhc29uICovXG4gIGNvbnN0IHJlamVjdCA9IHJlYXNvbiA9PiB7XG4gICAgaWYgKGludGVybmFsUmVqZWN0KSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChyZWFzb24pO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVqZWN0ID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZXhlY3V0b3IgPSAocmVzLCByZWopID0+IHtcbiAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSB1bmRlZmluZWQgJiYgaW50ZXJuYWxSZWplY3QgPT09IHVuZGVmaW5lZCk7XG4gICAgaW50ZXJuYWxSZXNvbHZlID0gcmVzO1xuICAgIGludGVybmFsUmVqZWN0ID0gcmVqO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0pO1xufTskaM2PX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACzme7pRHAAAURwAAB0AAABAZW5kby9zdHJlYW0tdjEuMi4xMy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJtYWtlUGlwZSIsIm1ha2VRdWV1ZSIsIm1ha2VTdHJlYW0iLCJtYXBSZWFkZXIiLCJtYXBXcml0ZXIiLCJwcmltZSIsInB1bXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLG1ha2VQcm9taXNlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBUeXBlU2NyaXB0IFJlYWRPbmx5IHNlbWFudGljcyBhcmUgbm90IHN1ZmZpY2llbnRseSBleHByZXNzaXZlIHRvIGRpc3Rpbmd1aXNoKi9cbi8qIGEgdmFsdWUgb25lIHByb21pc2VzIG5vdCB0byBhbHRlciBmcm9tIGEgdmFsdWUgb25lIG11c3Qgbm90IGFsdGVyLCovXG4vKiBtYWtpbmcgaXQgdXNlbGVzcy4qL1xuY29uc3QgZnJlZXplID0gLyoqIEB0eXBlIHs8VD4odjogVCB8IFJlYWRvbmx5PFQ+KSA9PiBUfSAqLyAoT2JqZWN0LmZyZWV6ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Bc3luY1F1ZXVlPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVF1ZXVlID0gKCkgPT4ge1xuICBsZXQgeyBwcm9taXNlOiB0YWlsUHJvbWlzZSwgcmVzb2x2ZTogdGFpbFJlc29sdmUgfSA9IG1ha2VQcm9taXNlS2l0KCk7XG4gIHJldHVybiB7XG4gICAgcHV0KHZhbHVlKSB7XG4gICAgICBjb25zdCB7IHJlc29sdmUsIHByb21pc2UgfSA9IG1ha2VQcm9taXNlS2l0KCk7XG4gICAgICB0YWlsUmVzb2x2ZShmcmVlemUoeyB2YWx1ZSwgcHJvbWlzZSB9KSk7XG4gICAgICB0YWlsUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSxcbiAgICBnZXQoKSB7XG4gICAgICBjb25zdCBwcm9taXNlID0gdGFpbFByb21pc2UudGhlbihuZXh0ID0+IG5leHQudmFsdWUpO1xuICAgICAgdGFpbFByb21pc2UgPSB0YWlsUHJvbWlzZS50aGVuKG5leHQgPT4gbmV4dC5wcm9taXNlKTtcbiAgICAgIHJldHVybiBoYXJkZW4ocHJvbWlzZSk7XG4gICAgfSxcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VRdWV1ZShtYWtlUXVldWUpO1xuaGFyZGVuKG1ha2VRdWV1ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRSZWFkXG4gKiBAdGVtcGxhdGUgVFdyaXRlXG4gKiBAdGVtcGxhdGUgVFJlYWRSZXR1cm5cbiAqIEB0ZW1wbGF0ZSBUV3JpdGVSZXR1cm5cbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXN5bmNTcHJpbmc8SXRlcmF0b3JSZXN1bHQ8VFJlYWQsIFRSZWFkUmV0dXJuPj59IGFja3NcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXN5bmNTaW5rPEl0ZXJhdG9yUmVzdWx0PFRXcml0ZSwgVFdyaXRlUmV0dXJuPj59IGRhdGFcbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTdHJlYW0gPSAoYWNrcywgZGF0YSkgPT4ge1xuICBjb25zdCBzdHJlYW0gPSBoYXJkZW4oe1xuICAgIC8qKlxuICogQHBhcmFtIHtUV3JpdGV9IHZhbHVlXG4gKi9cbiAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAvKiBOb3RlIHRoZSBzaGFsbG93IGZyZWV6ZSBzaW5jZSB2YWx1ZSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBmcmVlemFibGUqL1xuICAgICAgLyogKHR5cGVkIGFycmF5cyBhcmUgbm90KS4qL1xuICAgICAgZGF0YS5wdXQoZnJlZXplKHsgdmFsdWUsIGRvbmU6IGZhbHNlIH0pKTtcbiAgICAgIHJldHVybiBhY2tzLmdldCgpO1xuICAgIH0sXG4gICAgLyoqXG4gKiBAcGFyYW0ge1RXcml0ZVJldHVybn0gdmFsdWVcbiAqL1xuICAgIHJldHVybih2YWx1ZSkge1xuICAgICAgZGF0YS5wdXQoZnJlZXplKHsgdmFsdWUsIGRvbmU6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuIGFja3MuZ2V0KCk7XG4gICAgfSxcbiAgICAvKipcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKi9cbiAgICB0aHJvdyhlcnJvcikge1xuICAgICAgZGF0YS5wdXQoaGFyZGVuKFByb21pc2UucmVqZWN0KGVycm9yKSkpO1xuICAgICAgcmV0dXJuIGFja3MuZ2V0KCk7XG4gICAgfSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHN0cmVhbTtcbn07JGjNj19vbmNlLm1ha2VTdHJlYW0obWFrZVN0cmVhbSk7XG5oYXJkZW4obWFrZVN0cmVhbSk7XG5cbi8qIEpTRG9jIFR5cGVTY3JpcHQgc2VlbXMgdW5hYmxlIHRvIGV4cHJlc3MgdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uJ3MqL1xuLyogZW50YW5nbGVtZW50IG9mIHF1ZXVlcywgYnV0IHRoZSBkZWZpbml0aW9uIGluIHR5cGVzLmQudHMgd29ya3MgZm9yIHRoZSBlbmQqL1xuLyogdXNlci4qL1xuICAgICAgIGNvbnN0IG1ha2VQaXBlID0gKCkgPT4ge1xuICBjb25zdCBkYXRhID0gbWFrZVF1ZXVlKCk7XG4gIGNvbnN0IGFja3MgPSBtYWtlUXVldWUoKTtcbiAgY29uc3QgcmVhZGVyID0gbWFrZVN0cmVhbShhY2tzLCBkYXRhKTtcbiAgY29uc3Qgd3JpdGVyID0gbWFrZVN0cmVhbShkYXRhLCBhY2tzKTtcbiAgcmV0dXJuIGhhcmRlbihbd3JpdGVyLCByZWFkZXJdKTtcbn07JGjNj19vbmNlLm1ha2VQaXBlKG1ha2VQaXBlKTtcbmhhcmRlbihtYWtlUGlwZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRSZWFkXG4gKiBAdGVtcGxhdGUgVFdyaXRlXG4gKiBAdGVtcGxhdGUgVFJlYWRSZXR1cm5cbiAqIEB0ZW1wbGF0ZSBUV3JpdGVSZXR1cm5cbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuU3RyZWFtPFRXcml0ZSwgVFJlYWQsIFRXcml0ZVJldHVybiwgVFJlYWRSZXR1cm4+fSB3cml0ZXJcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuU3RyZWFtPFRSZWFkLCBUV3JpdGUsIFRSZWFkUmV0dXJuLCBUV3JpdGVSZXR1cm4+fSByZWFkZXJcbiAqIEBwYXJhbSB7VFdyaXRlfSBwcmltZXJcbiAqL1xuICAgICAgIGNvbnN0IHB1bXAgPSBhc3luYyAod3JpdGVyLCByZWFkZXIsIHByaW1lcikgPT4ge1xuICAvKiogQHBhcmFtIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmVhZFJldHVybj4+fSBwcm9taXNlICovXG4gIGNvbnN0IHRpY2sgPSBwcm9taXNlID0+XG4gICAgRS53aGVuKFxuICAgICAgcHJvbWlzZSxcbiAgICAgIHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHJldHVybiB3cml0ZXIucmV0dXJuKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyogQmVob2xkOiBtdXR1YWwgcmVjdXJzaW9uLiovXG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgICAgICByZXR1cm4gdG9jayh3cml0ZXIubmV4dChyZXN1bHQudmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICgvKiogQHR5cGUge0Vycm9yfSAqLyBlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gd3JpdGVyLnRocm93KGVycm9yKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgLyoqIEBwYXJhbSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUV3JpdGUsIFRXcml0ZVJldHVybj4+fSBwcm9taXNlICovXG4gIGNvbnN0IHRvY2sgPSBwcm9taXNlID0+XG4gICAgRS53aGVuKFxuICAgICAgcHJvbWlzZSxcbiAgICAgIHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHJldHVybiByZWFkZXIucmV0dXJuKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRpY2socmVhZGVyLm5leHQocmVzdWx0LnZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoLyoqIEB0eXBlIHtFcnJvcn0gKi8gZXJyb3IpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlYWRlci50aHJvdyhlcnJvcik7XG4gICAgICB9LFxuICAgICk7XG4gIGF3YWl0IHRpY2socmVhZGVyLm5leHQocHJpbWVyKSk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59OyRozY9fb25jZS5wdW1wKHB1bXApO1xuaGFyZGVuKHB1bXApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUUmVhZFxuICogQHRlbXBsYXRlIFRXcml0ZVxuICogQHRlbXBsYXRlIFRSZXR1cm5cbiAqIEBwYXJhbSB7QXN5bmNHZW5lcmF0b3I8VFJlYWQsIFRSZXR1cm4sIFRXcml0ZT59IGdlbmVyYXRvclxuICogQHBhcmFtIHtUV3JpdGV9IHByaW1lclxuICovXG4gICAgICAgY29uc3QgcHJpbWUgPSAoZ2VuZXJhdG9yLCBwcmltZXIpID0+IHtcbiAgLyogV2UgY2FwdHVyZSB0aGUgZmlyc3QgcmV0dXJuZWQgcHJvbWlzZS4qL1xuICBjb25zdCBmaXJzdCA9IGdlbmVyYXRvci5uZXh0KHByaW1lcik7XG4gIC8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8VFJlYWQsIFRSZXR1cm4+PX0gKi9cbiAgbGV0IHJlc3VsdDtcbiAgY29uc3QgcHJpbWVkID0gaGFyZGVuKHtcbiAgICAvKiogQHBhcmFtIHtUV3JpdGV9IHZhbHVlICovXG4gICAgYXN5bmMgbmV4dCh2YWx1ZSkge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAamVzc2llLmpzL3NhZmUtYXdhaXQtc2VwYXJhdG9yKi9cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmlyc3Q7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBnZW5lcmF0b3IubmV4dCh2YWx1ZSk7XG4gICAgfSxcbiAgICAvKiogQHBhcmFtIHtUUmV0dXJufSB2YWx1ZSAqL1xuICAgIGFzeW5jIHJldHVybih2YWx1ZSkge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAamVzc2llLmpzL3NhZmUtYXdhaXQtc2VwYXJhdG9yKi9cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmlyc3Q7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBnZW5lcmF0b3IucmV0dXJuKHZhbHVlKTtcbiAgICB9LFxuICAgIC8qKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAqL1xuICAgIGFzeW5jIHRocm93KGVycm9yKSB7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBqZXNzaWUuanMvc2FmZS1hd2FpdC1zZXBhcmF0b3IqL1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBmaXJzdDtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBnZW5lcmF0b3IudGhyb3coZXJyb3IpO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gcHJpbWVkO1xufTskaM2PX29uY2UucHJpbWUocHJpbWUpO1xuaGFyZGVuKHByaW1lKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVEluXG4gKiBAdGVtcGxhdGUgVE91dFxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkZXI8VEluPn0gcmVhZGVyXG4gKiBAcGFyYW0geyh2YWx1ZTogVEluKSA9PiBUT3V0fSB0cmFuc2Zvcm1cbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkZXI8VE91dD59XG4gKi9cbiAgICAgICBjb25zdCBtYXBSZWFkZXIgPSAocmVhZGVyLCB0cmFuc2Zvcm0pID0+IHtcbiAgYXN5bmMgZnVuY3Rpb24qIHRyYW5zZm9ybUdlbmVyYXRvcigpIHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIHJlYWRlcikge1xuICAgICAgeWllbGQgdHJhbnNmb3JtKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBoYXJkZW4odHJhbnNmb3JtR2VuZXJhdG9yKTtcbiAgcmV0dXJuIGhhcmRlbih0cmFuc2Zvcm1HZW5lcmF0b3IoKSk7XG59OyRozY9fb25jZS5tYXBSZWFkZXIobWFwUmVhZGVyKTtcbmhhcmRlbihtYXBSZWFkZXIpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUSW5cbiAqIEB0ZW1wbGF0ZSBUT3V0XG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLldyaXRlcjxUT3V0Pn0gd3JpdGVyXG4gKiBAcGFyYW0geyh2YWx1ZTogVEluKSA9PiBUT3V0fSB0cmFuc2Zvcm1cbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Xcml0ZXI8VEluPn1cbiAqL1xuICAgICAgIGNvbnN0IG1hcFdyaXRlciA9ICh3cml0ZXIsIHRyYW5zZm9ybSkgPT4ge1xuICBjb25zdCB0cmFuc2Zvcm1lZFdyaXRlciA9IGhhcmRlbih7XG4gICAgLyoqXG4gKiBAcGFyYW0ge1RJbn0gdmFsdWVcbiAqL1xuICAgIGFzeW5jIG5leHQodmFsdWUpIHtcbiAgICAgIHJldHVybiB3cml0ZXIubmV4dCh0cmFuc2Zvcm0odmFsdWUpKTtcbiAgICB9LFxuICAgIC8qKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqL1xuICAgIGFzeW5jIHRocm93KGVycm9yKSB7XG4gICAgICByZXR1cm4gd3JpdGVyLnRocm93KGVycm9yKTtcbiAgICB9LFxuICAgIC8qKlxuICogQHBhcmFtIHt1bmRlZmluZWR9IHZhbHVlXG4gKi9cbiAgICBhc3luYyByZXR1cm4odmFsdWUpIHtcbiAgICAgIHJldHVybiB3cml0ZXIucmV0dXJuKHZhbHVlKTtcbiAgICB9LFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiB0cmFuc2Zvcm1lZFdyaXRlcjtcbn07JGjNj19vbmNlLm1hcFdyaXRlcihtYXBXcml0ZXIpO1xuaGFyZGVuKG1hcFdyaXRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUXVldWUiOlsibWFrZVF1ZXVlIl0sIm1ha2VTdHJlYW0iOlsibWFrZVN0cmVhbSJdLCJtYWtlUGlwZSI6WyJtYWtlUGlwZSJdLCJwdW1wIjpbInB1bXAiXSwicHJpbWUiOlsicHJpbWUiXSwibWFwUmVhZGVyIjpbIm1hcFJlYWRlciJdLCJtYXBXcml0ZXIiOlsibWFwV3JpdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO5b9r/RAQAA0QEAABwAAABqZXNzaWUuanMtdjAuMy40L3NyYy9tYWluLmpzeyJpbXBvcnRzIjpbIi4vcmluZzAvbWFpbi5qcyIsIi4vcmluZzEvbWFpbi5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vcmluZzAvbWFpbi5qcyIsIi4vcmluZzEvbWFpbi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3JpbmcwL21haW4uanNcIiwgW11dLFtcIi4vcmluZzEvbWFpbi5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD2YCXkgQEAAIEBAAAfAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvRS5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyJAZW5kby9mYXIiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN6HOIP1AwAA9QMAACwAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXN5bmNHZW5lcmF0ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIFJldHVybiBhbiBhc3luYyBpdGVyYWJsZSB0aGF0IHByb2R1Y2VzIGl0ZXJhdG9yIHJlc3VsdHMgdmlhIGBuZXh0YC5cbiAqXG4gKiBUaGlzIHdvcmtzIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBTeW1ib2wuXG4gKlxuICogQHRlbXBsYXRlIFQsVFJldHVyblxuICogQHBhcmFtIHsoKSA9PiBJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPiB8XG4gKiAgICAgICAgICAgICAgIFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+XG4gKiB9IG5leHQgcHJvZHVjZSBhIHNpbmdsZS1zdGVwIGl0ZXJhdG9yIHJlc3VsdFxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8VD59XG4gKi9cbiAgICAgICBjb25zdCBhc3luY0dlbmVyYXRlID0gbmV4dCA9PiB7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBuZXh0OiBhc3luYyAoKSA9PiBoYXJkZW4obmV4dCgpKSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UuYXN5bmNHZW5lcmF0ZShhc3luY0dlbmVyYXRlKTtcbmhhcmRlbihhc3luY0dlbmVyYXRlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jR2VuZXJhdGUiOlsiYXN5bmNHZW5lcmF0ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD+evn99AEAAPQBAAAiAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFpbi5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL21ha2Vycy5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL0UuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIiwiLi9tYWtlcnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtdXSxbXCIuL21ha2Vycy5qc1wiLCBbXV0sW1wiLi9hc3luYy1nZW5lcmF0ZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADDGbF4MwkAADMJAAAkAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFrZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlTWFwIiwibWFrZVByb21pc2UiLCJtYWtlU2V0IiwibWFrZVdlYWtNYXAiLCJtYWtlV2Vha1NldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuLyogVGhlc2Ugd29yayBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgYG5ld2AuKi9cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIgLz4qL1xuXG4vKipcbiAqIEB0eXBlIHs8VD4oZXhlY3V0b3I6IChcbiAqICAgcmVzb2x2ZTogKHZhbHVlOiBUKSA9PiB2b2lkLFxuICogICByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWRcbiAqICkgPT4gdm9pZCkgPT4gUHJvbWlzZTxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQcm9taXNlID0gZXhlY3V0b3IgPT4gaGFyZGVuKG5ldyBQcm9taXNlKGV4ZWN1dG9yKSk7JGjNj19vbmNlLm1ha2VQcm9taXNlKG1ha2VQcm9taXNlKTtcbmhhcmRlbihtYWtlUHJvbWlzZSk7XG5cbi8qKiBAdHlwZWRlZiB7PEssIFY+KGVudHJpZXM/OiByZWFkb25seSAocmVhZG9ubHkgW0ssIFZdKVtdKSA9PiBNYXA8SywgVj59IE1hcEZyb21FbnRyaWVzICovXG4vKiogQHR5cGVkZWYgezxLLCBWPihpdGVyYWJsZTogSXRlcmFibGU8cmVhZG9ubHkgW0ssIFZdPikgPT4gTWFwPEssIFY+fSBNYXBGcm9tSXRlcmFibGUgKi9cblxuLyoqIEB0eXBlIHtNYXBGcm9tRW50cmllcyAmIE1hcEZyb21JdGVyYWJsZX0gKi9cbiAgICAgICBjb25zdCBtYWtlTWFwID0gZW50cmllc09ySXRlcmFibGUgPT4gaGFyZGVuKG5ldyBNYXAoZW50cmllc09ySXRlcmFibGUpKTskaM2PX29uY2UubWFrZU1hcChtYWtlTWFwKTtcbmhhcmRlbihtYWtlTWFwKTtcblxuLyoqIEB0eXBlZGVmIHs8VD4odmFsdWVzPzogcmVhZG9ubHkgVFtdKSA9PiBTZXQ8VD59IFNldEZyb21WYWx1ZXMgKi9cbi8qKiBAdHlwZWRlZiB7PFQ+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPikgPT4gU2V0PFQ+fSBTZXRGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7U2V0RnJvbVZhbHVlcyAmIFNldEZyb21JdGVyYWJsZX0gKi9cbiAgICAgICBjb25zdCBtYWtlU2V0ID0gdmFsdWVzID0+IGhhcmRlbihuZXcgU2V0KHZhbHVlcykpOyRozY9fb25jZS5tYWtlU2V0KG1ha2VTZXQpO1xuaGFyZGVuKG1ha2VTZXQpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8SyBleHRlbmRzIHt9LCBWID0gYW55PihcbiAqICAgIGVudHJpZXM/OiByZWFkb25seSBbSywgVl1bXSB8IG51bGxcbiAqICkgPT4gV2Vha01hcDxLLCBWPn0gV2Vha01hcEZyb21FbnRyaWVzXG4gKi9cbi8qKiBAdHlwZWRlZiB7PEsgZXh0ZW5kcyB7fSwgVj4oaXRlcmFibGU6IEl0ZXJhYmxlPFtLLCBWXT4pID0+IFdlYWtNYXA8SywgVj59IFdlYWtNYXBGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7V2Vha01hcEZyb21FbnRyaWVzICYgV2Vha01hcEZyb21JdGVyYWJsZX0gKi9cbiAgICAgICBjb25zdCBtYWtlV2Vha01hcCA9IGVudHJpZXMgPT4gaGFyZGVuKG5ldyBXZWFrTWFwKGVudHJpZXMpKTskaM2PX29uY2UubWFrZVdlYWtNYXAobWFrZVdlYWtNYXApO1xuaGFyZGVuKG1ha2VXZWFrTWFwKTtcblxuLyoqIEB0eXBlZGVmIHs8VCBleHRlbmRzIHt9Pih2YWx1ZXM/OiByZWFkb25seSBUW10pID0+IFdlYWtTZXQ8VD59IFdlYWtTZXRGcm9tVmFsdWVzICovXG4vKiogQHR5cGVkZWYgezxUIGV4dGVuZHMge30+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPikgPT4gV2Vha1NldDxUPn0gV2Vha1NldEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtXZWFrU2V0RnJvbVZhbHVlcyAmIFdlYWtTZXRGcm9tSXRlcmFibGV9ICovXG4gICAgICAgY29uc3QgbWFrZVdlYWtTZXQgPSB2YWx1ZXMgPT4gaGFyZGVuKG5ldyBXZWFrU2V0KHZhbHVlcykpOyRozY9fb25jZS5tYWtlV2Vha1NldChtYWtlV2Vha1NldCk7XG5oYXJkZW4obWFrZVdlYWtTZXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2UiOlsibWFrZVByb21pc2UiXSwibWFrZU1hcCI6WyJtYWtlTWFwIl0sIm1ha2VTZXQiOlsibWFrZVNldCJdLCJtYWtlV2Vha01hcCI6WyJtYWtlV2Vha01hcCJdLCJtYWtlV2Vha1NldCI6WyJtYWtlV2Vha1NldCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABpVHheUgUAAFIFAAApAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanN7ImltcG9ydHMiOlsiLi4vcmluZzAvbWFpbi5qcyJdLCJleHBvcnRzIjpbImFzeW5jRG9XaGlsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VQcm9taXNlOyRozY9faW1wb3J0cyhbW1wiLi4vcmluZzAvbWFpbi5qc1wiLCBbW1wibWFrZVByb21pc2VcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIFJlc29sdmUgcmV0dXJuZWQgcHJvbWlzZSB3aXRoIHVuZGVmaW5lZCB3aGVuIGBib2R5YCByZXR1cm5zIGZhbHN5LlxuICpcbiAqIFRoaXMgd29ya3MgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIGBhd2FpdGAgbm90IGF0IHRoZSBmdW5jdGlvbi1sZXZlbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUIHwgUHJvbWlzZTxUPn0gYm9keSBwZXJmb3JtIHNpZGUtZWZmZWN0cywgYW5kIHJldHVybiB0cnV0aHkgaWZcbiAqIHdlIHNob3VsZCBydW4gYWdhaW5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICAgY29uc3QgYXN5bmNEb1doaWxlID0gYm9keSA9PiB7XG4gIHJldHVybiBtYWtlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgbG9vcCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRvQ29udGludWUgPSBhd2FpdCBib2R5KCk7XG4gICAgICBpZiAoIWRvQ29udGludWUpIHtcbiAgICAgICAgLyogUmVzb2x2ZSB0aGUgb3V0ZXJtb3N0IHByb21pc2UuKi9cbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qIERvIHRoZSBsb29wIGFnYWluLiAgV2UgYXJlIGNhcmVmdWwgbm90IHRvIGF3YWl0IHNvIHRoYXQgd2UgZG9uJ3QgY3JlYXRlIGEqL1xuICAgICAgLyogcHJvbWlzZSBjaGFpbi4qL1xuICAgICAgbG9vcCgpLmNhdGNoKHJlamVjdCk7XG4gICAgfTtcblxuICAgIGxvb3AoKS5jYXRjaChyZWplY3QpO1xuICB9KTtcbn07JGjNj19vbmNlLmFzeW5jRG9XaGlsZShhc3luY0RvV2hpbGUpO1xuaGFyZGVuKGFzeW5jRG9XaGlsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3luY0RvV2hpbGUiOlsiYXN5bmNEb1doaWxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABtoNwOWAQAAlgEAACIAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMS9tYWluLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmMtdG9vbHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vYXN5bmMtdG9vbHMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAQIeAwoAAAAAAAAAAABUcIrpCSwBAAksAQAUAAAAAAAAAAAAAACkgQAAAABjb21wYXJ0bWVudC1tYXAuanNvblBLAQIeAwoAAAAAAAAAAAAxgEj4jQEAAI0BAAAgAAAAAAAAAAAAAACkgTssAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvaGVhcC5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAAAAAAAAAAACkgQYuAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAEzMFkfMLAADzCwAAJAAAAAAAAAAAAAAApIGjLwEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9oZWFwLmpzUEsBAh4DCgAAAAAAAAAAABVusfp5AgAAeQIAACUAAAAAAAAAAAAAAKSB2DsBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAALUzVkSEDAAAhAwAAKwAAAAAAAAAAAAAApIGUPgEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pcy1wYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAABsFac/IgQAACIEAAAkAAAAAAAAAAAAAACkgf5BAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2tleXMuanNQSwECHgMKAAAAAAAAAAAAqRuNqvoOAAD6DgAAKQAAAAAAAAAAAAAApIFiRgEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9tYWtlLW9uY2UuanNQSwECHgMKAAAAAAAAAAAAAgE7lIAaAACAGgAAMgAAAAAAAAAAAAAApIGjVQEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9wcmVwYXJlLWF0dGVudWF0b3IuanNQSwECHgMKAAAAAAAAAAAAHds9iHIUAAByFAAAMQAAAAAAAAAAAAAApIFzcAEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9wcmVwYXJlLXJldm9jYWJsZS5qc1BLAQIeAwoAAAAAAAAAAABgv9oYqw0AAKsNAAAtAAAAAAAAAAAAAACkgTSFAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3dhdGNoLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAbCSwahYCAAAWAgAAKAAAAAAAAAAAAAAApIEqkwEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3pvbmUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAADhg52A5zwAAOc8AAAmAAAAAAAAAAAAAACkgYaVAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50TWF0aC5qc1BLAQIeAwoAAAAAAAAAAABf6b1eegUAAHoFAAAnAAAAAAAAAAAAAACkgbHSAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50U3RvcmUuanNQSwECHgMKAAAAAAAAAAAAQ7172XQGAAB0BgAAJwAAAAAAAAAAAAAApIFw2AEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Rpc3BsYXlJbmZvLmpzUEsBAh4DCgAAAAAAAAAAAPNfTQNNAgAATQIAACEAAAAAAAAAAAAAAKSBKd8BAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABoPpBzxzwAAMc8AAAlAAAAAAAAAAAAAACkgbXhAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaXNzdWVyS2l0LmpzUEsBAh4DCgAAAAAAAAAAAFTn3CUTBgAAEwYAADoAAAAAAAAAAAAAAKSBvx4CAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAWh3vSSYGAAAmBgAAOgAAAAAAAAAAAAAApIEqJQIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAZ8y1+zwYAAM8GAAA2AAAAAAAAAAAAAACkgagrAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAPdw1//0HAAD9BwAANgAAAAAAAAAAAAAApIHLMgIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAADJyxEpYBQAAWAUAACMAAAAAAAAAAAAAAKSBHDsCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50LmpzUEsBAh4DCgAAAAAAAAAAANgnSHa+NgAAvjYAACkAAAAAAAAAAAAAAKSBtUACAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50TGVkZ2VyLmpzUEsBAh4DCgAAAAAAAAAAAD4gnomXHAAAlxwAACEAAAAAAAAAAAAAAKSBuncCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wdXJzZS5qc1BLAQIeAwoAAAAAAAAAAAC+q6FyJz0AACc9AAAhAAAAAAAAAAAAAACkgZCUAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcmF0aW8uanNQSwECHgMKAAAAAAAAAAAAcC8W5YoHAACKBwAAJAAAAAAAAAAAAAAApIH20QIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3NhZmVNYXRoLmpzUEsBAh4DCgAAAAAAAAAAAGDkrFsZBwAAGQcAAC0AAAAAAAAAAAAAAKSBwtkCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAADl+t+rQC0AAEAtAAAmAAAAAAAAAAAAAACkgSbhAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAAAAAAAAAAACkgaoOAwBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAApexJrxsFAAAbBQAAKwAAAAAAAAAAAAAApIFHEAMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnN0YW50cy5qc1BLAQIeAwoAAAAAAAAAAAAi6AXzxQwAAMUMAAA/AAAAAAAAAAAAAACkgasVAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2Fzc2VydGlvbnMuanNQSwECHgMKAAAAAAAAAAAAYtE9ftQVAADUFQAAPgAAAAAAAAAAAAAApIHNIgMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5BcGkuanNQSwECHgMKAAAAAAAAAAAAbUXms7sSAAC7EgAAQQAAAAAAAAAAAAAApIH9OAMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5GaWx0ZXIuanNQSwECHgMKAAAAAAAAAAAAyTVIIHEaAABxGgAAQAAAAAAAAAAAAAAApIEXTAMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qc1BLAQIeAwoAAAAAAAAAAABL1nYatkkAALZJAABBAAAAAAAAAAAAAACkgeZmAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qc1BLAQIeAwoAAAAAAAAAAACml+1OvBsAALwbAABGAAAAAAAAAAAAAACkgfuwAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzUEsBAh4DCgAAAAAAAAAAAMEVxH8cJgAAHCYAADIAAAAAAAAAAAAAAKSBG80DAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybm9yLmpzUEsBAh4DCgAAAAAAAAAAAJ1twx3lLgAA5S4AADUAAAAAAAAAAAAAAKSBh/MDAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybm9yS2l0LmpzUEsBAh4DCgAAAAAAAAAAAOOx0ynhMQAA4TEAADAAAAAAAAAAAAAAAKSBvyIEAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEhlbHBlci5qc1BLAQIeAwoAAAAAAAAAAAC5ZH1qawkAAGsJAAAnAAAAAAAAAAAAAACkge5UBABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAt5hiXQMRAAADEQAAKgAAAAAAAAAAAAAApIGeXgQAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3F1ZXN0aW9uLmpzUEsBAh4DCgAAAAAAAAAAAJtAyG0sQAAALEAAACwAAAAAAAAAAAAAAKSB6W8EAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAAAAAAAAAAAAAKSBX7AEAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAaTEYnSQwAAEkMAAAsAAAAAAAAAAAAAACkgfyxBABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvdmFsaWRhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAACG5cGQrRYAAK0WAAA6AAAAAAAAAAAAAACkgY++BABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3Jlc2VydmUvYXNzZXRSZXNlcnZlLmpzUEsBAh4DCgAAAAAAAAAAADaxkeSZPQAAmT0AAD0AAAAAAAAAAAAAAKSBlNUEAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvcmVzZXJ2ZS9hc3NldFJlc2VydmVLaXQuanNQSwECHgMKAAAAAAAAAAAABRgL3NksAADZLAAAJwAAAAAAAAAAAAAApIGIEwUAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NhbGxiYWNrLmpzUEsBAh4DCgAAAAAAAAAAAKM2T6b1BAAA9QQAACgAAAAAAAAAAAAAAKSBpkAFAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jbGktdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAbQ14FcoMAADKDAAAJQAAAAAAAAAAAAAApIHhRQUAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NvbmZpZy5qc1BLAQIeAwoAAAAAAAAAAACNvaYBrggAAK4IAAAkAAAAAAAAAAAAAACkge5SBQBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvZGVidWcuanNQSwECHgMKAAAAAAAAAAAAsZPVjl4DAABeAwAAJQAAAAAAAAAAAAAApIHeWwUAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2Vycm9ycy5qc1BLAQIeAwoAAAAAAAAAAABoHOwa/gQAAP4EAAAkAAAAAAAAAAAAAACkgX9fBQBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAqtWvjaYlAACmJQAAJwAAAAAAAAAAAAAApIG/ZAUAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2pzLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAACL1UtWsBwAArAcAACgAAAAAAAAAAAAAAKSBqooFAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9rZXlNaXJyb3IuanNQSwECHgMKAAAAAAAAAAAApWwe9FUtAABVLQAALwAAAAAAAAAAAAAApIGckgUAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNQSwECHgMKAAAAAAAAAAAAI0Vy+qcDAACnAwAANwAAAAAAAAAAAAAApIE+wAUAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvaW5hY2Nlc3NpYmxlLXZhbC5qc1BLAQIeAwoAAAAAAAAAAACkg8+esQMAALEDAAAwAAAAAAAAAAAAAACkgTrEBQBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC9wdXJlLWRhdGEuanNQSwECHgMKAAAAAAAAAAAA1l0z3uU8AADlPAAANgAAAAAAAAAAAAAApIE5yAUAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzUEsBAh4DCgAAAAAAAAAAACvtEEXxDQAA8Q0AACsAAAAAAAAAAAAAAKSBcgUGAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRob2QtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAkP0geKBCAACgQgAAJgAAAAAAAAAAAAAApIGsEwYAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21ldHJpY3MuanNQSwECHgMKAAAAAAAAAAAAirla8rYOAAC2DgAAKwAAAAAAAAAAAAAApIGQVgYAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL25hdHVyYWwtc29ydC5qc1BLAQIeAwoAAAAAAAAAAABPxCWXakgAAGpIAAAoAAAAAAAAAAAAAACkgY9lBgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvc2VzLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAANHeDdCREgAAkRIAACwAAAAAAAAAAAAAAKSBP64GAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90ZXN0aW5nLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAANqI2yvWAwAA1gMAACUAAAAAAAAAAAAAAKSBGsEGAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90bXBEaXIuanNQSwECHgMKAAAAAAAAAAAATmKnlqEEAAChBAAAKAAAAAAAAAAAAAAApIEzxQYAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVDaGVjay5qc1BLAQIeAwoAAAAAAAAAAACrfHXEowUAAKMFAAApAAAAAAAAAAAAAACkgRrKBgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAAAAAAAAAAACkgQTQBgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAA14cZPXAMAABwDAAAKgAAAAAAAAAAAAAApIGk0QYAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3VwZ3JhZGUtYXBpLmpzUEsBAh4DCgAAAAAAAAAAAD/hQTwZFAAAGRQAADMAAAAAAAAAAAAAAKSBXN4GAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1BLAQIeAwoAAAAAAAAAAADCPu246wcAAOsHAAAkAAAAAAAAAAAAAACkgcbyBgBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAs0n/TsUbAADFGwAAJwAAAAAAAAAAAAAApIHz+gYAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL25vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAABshF6MzQgAAM0IAACoAAAAAAAAAAAAAAKSB/RYHAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9wdWJsaXNoLWtpdC5qc1BLAQIeAwoAAAAAAAAAAAAsSEQ3qgwAAKoMAAAuAAAAAAAAAAAAAACkgXhZBwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAHrmTl4kJgAAJCYAACcAAAAAAAAAAAAAAKSBbmYHAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc1BLAQIeAwoAAAAAAAAAAABkDr188ikAAPIpAAAoAAAAAAAAAAAAAACkgdeMBwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlLmpzUEsBAh4DCgAAAAAAAAAAAFeqBJEpDQAAKQ0AACkAAAAAAAAAAAAAAKSBD7cHAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmVyLmpzUEsBAh4DCgAAAAAAAAAAAHfmSkaVBgAAlQYAACQAAAAAAAAAAAAAAKSBf8QHAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90b3BpYy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAAAAAAAAAAACkgVbLBwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAA3HPTPWAHAABgBwAALQAAAAAAAAAAAAAApIH2zAcAQGFnb3JpYy9ub3RpZmllci12MC42LjIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAEcacpNGDgAARg4AACEAAAAAAAAAAAAAAKSBodQHAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAP0kYu4gsAAOILAAAsAAAAAAAAAAAAAACkgSbjBwBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc1BLAQIeAwoAAAAAAAAAAADbxEI1bQcAAG0HAAAwAAAAAAAAAAAAAACkgVLvBwBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNQSwECHgMKAAAAAAAAAAAA16FBRuoYAADqGAAAMQAAAAAAAAAAAAAApIEN9wcAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAACmQkq1EREAABERAAAxAAAAAAAAAAAAAACkgUYQCABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAPk186ftFgAA7RYAADUAAAAAAAAAAAAAAKSBpiEIAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAJRapRtOEQAAThEAADUAAAAAAAAAAAAAAKSB5jgIAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAKpX7y7bGgAA2xoAAC4AAAAAAAAAAAAAAKSBh0oIAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIGuZQgAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAAO31mJswAgAAMAIAABwAAAAAAAAAAAAAAKSBS2cIAEBhZ29yaWMvdGltZS12MC4zLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAtDNtlAolAAAKJQAAIwAAAAAAAAAAAAAApIG1aQgAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdGltZU1hdGguanNQSwECHgMKAAAAAAAAAAAANPYVxPMJAADzCQAAJQAAAAAAAAAAAAAApIEAjwgAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAAAAAAAAAAACkgTaZCABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAA2D1iULSwAAC0sAAAoAAAAAAAAAAAAAACkgdKaCABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAM+c6+m2CAAAtggAACQAAAAAAAAAAAAAAKSBRccIAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADvd74wOSMAADkjAAAwAAAAAAAAAAAAAACkgT3QCABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAACH1K2FIeAABSHgAAKAAAAAAAAAAAAAAApIHE8wgAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY2xlYW5Qcm9wb3NhbC5qc1BLAQIeAwoAAAAAAAAAAAChlkOZiREAAIkRAAA0AAAAAAAAAAAAAACkgVwSCQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzUEsBAh4DCgAAAAAAAAAAAGs4TXJnEwAAZxMAADkAAAAAAAAAAAAAAKSBNyQJAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qc1BLAQIeAwoAAAAAAAAAAABCPrHJjh0AAI4dAAA4AAAAAAAAAAAAAACkgfU3CQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qc1BLAQIeAwoAAAAAAAAAAAA3zta+MRQAADEUAAA1AAAAAAAAAAAAAACkgdlVCQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qc1BLAQIeAwoAAAAAAAAAAAC1mK84pggAAKYIAAAwAAAAAAAAAAAAAACkgV1qCQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAfM7hAasPAACrDwAAOgAAAAAAAAAAAAAApIFRcwkAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByZXBhcmUtb3duYWJsZS5qc1BLAQIeAwoAAAAAAAAAAADZyqtRiTUAAIk1AAA5AAAAAAAAAAAAAACkgVSDCQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanNQSwECHgMKAAAAAAAAAAAAaB/KruYLAADmCwAANQAAAAAAAAAAAAAApIE0uQkAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanNQSwECHgMKAAAAAAAAAAAAW9GqRWMpAABjKQAAMwAAAAAAAAAAAAAApIFtxQkAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzUEsBAh4DCgAAAAAAAAAAACivpPrsBAAA7AQAADcAAAAAAAAAAAAAAKSBIe8JAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanNQSwECHgMKAAAAAAAAAAAAjRlUFwYGAAAGBgAANQAAAAAAAAAAAAAApIFi9AkAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanNQSwECHgMKAAAAAAAAAAAAYwjL1L8JAAC/CQAAMQAAAAAAAAAAAAAApIG7+gkAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3RvcGljcy5qc1BLAQIeAwoAAAAAAAAAAADBrlNwkz0AAJM9AAA1AAAAAAAAAAAAAACkgckECgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvem9lSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABFe/gZrAgAAKwIAAAlAAAAAAAAAAAAAACkga9CCgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9tYWtlSGFuZGxlLmpzUEsBAh4DCgAAAAAAAAAAAAHT9EtISwAASEsAACUAAAAAAAAAAAAAAKSBnksKAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAA2fSTtJYBAACWAQAAHgAAAAAAAAAAAAAApIEplwoAQGFnb3JpYy96b25lLXYwLjIuMi9kdXJhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAIAyUsraEwAA2hMAACIAAAAAAAAAAAAAAKSB+5gKAEBhZ29yaWMvem9uZS12MC4yLjIvc3JjL2R1cmFibGUuanNQSwECHgMKAAAAAAAAAAAA1jhUAsUBAADFAQAAHwAAAAAAAAAAAAAApIEVrQoAQGVuZG8vY2FjaGUtbWFwLXYxLjEuMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACBle78JicAACYnAAAmAAAAAAAAAAAAAACkgRevCgBAZW5kby9jYWNoZS1tYXAtdjEuMS4wL3NyYy9jYWNoZW1hcC5qc1BLAQIeAwoAAAAAAAAAAABvUSGPYQsAAGELAAAsAAAAAAAAAAAAAACkgYHWCgBAZW5kby9jb21tb24tdjEuMi4xMy9hcHBseS1sYWJlbGluZy1lcnJvci5qc1BLAQIeAwoAAAAAAAAAAABI+ELK3QUAAN0FAAArAAAAAAAAAAAAAACkgSziCgBAZW5kby9jb21tb24tdjEuMi4xMy9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzUEsBAh4DCgAAAAAAAAAAALeVU+4lCAAAJQgAACUAAAAAAAAAAAAAAKSBUugKAEBlbmRvL2NvbW1vbi12MS4yLjEzL2lkZW50LWNoZWNrZXIuanNQSwECHgMKAAAAAAAAAAAAYa/8argEAAC4BAAAJwAAAAAAAAAAAAAApIG68AoAQGVuZG8vY29tbW9uLXYxLjIuMTMvbGlzdC1kaWZmZXJlbmNlLmpzUEsBAh4DCgAAAAAAAAAAACXsXfd5BAAAeQQAACsAAAAAAAAAAAAAAKSBt/UKAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtYXJyYXktaXRlcmF0b3IuanNQSwECHgMKAAAAAAAAAAAAXTavegYDAAAGAwAAJQAAAAAAAAAAAAAApIF5+goAQGVuZG8vY29tbW9uLXYxLjIuMTMvbWFrZS1pdGVyYXRvci5qc1BLAQIeAwoAAAAAAAAAAAB256sZbwoAAG8KAAAiAAAAAAAAAAAAAACkgcL9CgBAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWFwLmpzUEsBAh4DCgAAAAAAAAAAAKiaINo7CQAAOwkAACcAAAAAAAAAAAAAAKSBcQgLAEBlbmRvL2NvbW1vbi12MS4yLjEzL29iamVjdC1tZXRhLW1hcC5qc1BLAQIeAwoAAAAAAAAAAADYs0GCmQUAAJkFAAAlAAAAAAAAAAAAAACkgfERCwBAZW5kby9jb21tb24tdjEuMi4xMy90aHJvdy1sYWJlbGVkLmpzUEsBAh4DCgAAAAAAAAAAADSioamiAQAAogEAACIAAAAAAAAAAAAAAKSBzRcLAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAvAEzgjgWAAA4FgAALAAAAAAAAAAAAAAApIGvGQsAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9zcmMvZW52LW9wdGlvbnMuanNQSwECHgMKAAAAAAAAAAAAamZ24mQNAABkDQAAHQAAAAAAAAAAAAAApIExMAsAQGVuZG8vZXJyb3JzLXYxLjIuMTMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA0+lGCBBHAAAQRwAAIwAAAAAAAAAAAAAApIHQPQsAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAKQAAAAAAAAAAAAAApIEhhQsAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAc5UxUnIUAAByFAAAJwAAAAAAAAAAAAAApIHAhgsAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL2xvY2FsLmpzUEsBAh4DCgAAAAAAAAAAAId4iLn0GAAA9BgAADUAAAAAAAAAAAAAAKSBd5sLAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzUEsBAh4DCgAAAAAAAAAAACkTVdnWBQAA1gUAACkAAAAAAAAAAAAAAKSBvrQLAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAADMopI5XEgAAVxIAAC0AAAAAAAAAAAAAAKSB27oLAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy90cmFjay10dXJucy5qc1BLAQIeAwoAAAAAAAAAAAB7oaBHZAIAAGQCAAAjAAAAAAAAAAAAAACkgX3NCwBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC91dGlscy5qc1BLAQIeAwoAAAAAAAAAAADcRdmjYAIAAGACAAAaAAAAAAAAAAAAAACkgSLQCwBAZW5kby9leG8tdjEuNS4xMi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACxkxD/ECAAABAgAAAjAAAAAAAAAAAAAACkgbrSCwBAZW5kby9leG8tdjEuNS4xMi9zcmMvZXhvLW1ha2Vycy5qc1BLAQIeAwoAAAAAAAAAAAAVo/7rLkYAAC5GAAAiAAAAAAAAAAAAAACkgQvzCwBAZW5kby9leG8tdjEuNS4xMi9zcmMvZXhvLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAMkl2jYLBQAACwUAACYAAAAAAAAAAAAAAKSBeTkMAEBlbmRvL2V4by12MS41LjEyL3NyYy9nZXQtaW50ZXJmYWNlLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAAB4AAAAAAAAAAAAAAKSByD4MAEBlbmRvL2V4by12MS41LjEyL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAgAAAAAAAAAAAAAACkgVxADABAZW5kby9mYXItdjEuMS4xNC9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAACpJtZQmAIAAJgCAAAeAAAAAAAAAAAAAACkgfJBDABAZW5kby9mYXItdjEuMS4xNC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAdUZ/2QcIAAAHCAAAHQAAAAAAAAAAAAAApIHGRAwAQGVuZG8vbWFyc2hhbC12MS44LjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAYL9qqMl9AADJfQAAKgAAAAAAAAAAAAAApIEITQwAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAANXCc7oXRAAAF0QAACsAAAAAAAAAAAAAAKSBGcsMAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAADVNfjvRFAAD0RQAALQAAAAAAAAAAAAAApIF5Dw0AQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAEJ0Fem+QgAAvkIAACoAAAAAAAAAAAAAAKSBuFUNAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAACrcYH4oQkAAKEJAAAtAAAAAAAAAAAAAACkgb6YDQBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAZViFtXw/AAB8PwAAIwAAAAAAAAAAAAAApIGqog0AQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAgaK+MehZAADoWQAAJQAAAAAAAAAAAAAApIFn4g0AQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAhAAAAAAAAAAAAAACkgZI8DgBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAA4xDdI0kMAABJDAAAHQAAAAAAAAAAAAAApIEpPg4AQGVuZG8vbmF0LXY1LjEuMy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAbm7eczYLAAA2CwAAIAAAAAAAAAAAAAAApIGtSg4AQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAToVuIxUNAAAVDQAAKAAAAAAAAAAAAAAApIEhVg4AQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2J5dGVBcnJheS5qc1BLAQIeAwoAAAAAAAAAAACZp73SCAgAAAgIAAAoAAAAAAAAAAAAAACkgXxjDgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvY29weUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAAEcvuh1nCwAAZwsAACkAAAAAAAAAAAAAAKSBymsOAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAAJ46wtPYGQAA2BkAAC4AAAAAAAAAAAAAAKSBeHcOAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAassmRs0dAADNHQAAJAAAAAAAAAAAAAAApIGckQ4AQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAAHsGinp8CQAAfAkAACsAAAAAAAAAAAAAAKSBq68OAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAoSeMyfQlAAD0JQAAJwAAAAAAAAAAAAAApIFwuQ4AQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAJxSYGmDBQAAgwUAACkAAAAAAAAAAAAAAKSBqd8OAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAHwl6v3qIQAA6iEAADAAAAAAAAAAAAAAAKSBc+UOAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAmAo63Yj8AAGI/AAAqAAAAAAAAAAAAAACkgasHDwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAA+5yfsjAuAAAwLgAAKAAAAAAAAAAAAAAApIFVRw8AQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAACHgA8oUhYAAFIWAAArAAAAAAAAAAAAAACkgct1DwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAPyo2QfbDwAA2w8AACUAAAAAAAAAAAAAAKSBZowPAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zdHJpbmcuanNQSwECHgMKAAAAAAAAAAAAAvc0IsMUAADDFAAAJQAAAAAAAAAAAAAApIGEnA8AQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAABcuFDZZAkAAGQJAAAlAAAAAAAAAAAAAACkgYqxDwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAALddPVwmFgAAJhYAACkAAAAAAAAAAAAAAKSBMbsPAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAAAAAAAAAAAAAKSBntEPAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAB1TZLc7w4AAO8OAAAeAAAAAAAAAAAAAACkgTjTDwBAZW5kby9wYXR0ZXJucy12MS43LjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAqiED6QtIAAALSAAAKgAAAAAAAAAAAAAApIFj4g8AQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NoZWNrS2V5LmpzUEsBAh4DCgAAAAAAAAAAAP/bK5A/KAAAPygAAC0AAAAAAAAAAAAAAKSBtioQAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1BLAQIeAwoAAAAAAAAAAAA0W1NjTRUAAE0VAAApAAAAAAAAAAAAAACkgUBTEABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29weUJhZy5qc1BLAQIeAwoAAAAAAAAAAAAsI4MmLBEAACwRAAApAAAAAAAAAAAAAACkgdRoEABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29weVNldC5qc1BLAQIeAwoAAAAAAAAAAADbNZpAwyIAAMMiAAA5AAAAAAAAAAAAAACkgUd6EABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAmcQ4AVcoAABXKAAANQAAAAAAAAAAAAAApIFhnRAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAdB+PGWUvAABlLwAANQAAAAAAAAAAAAAApIELxhAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAXRpaQisvAAArLwAANgAAAAAAAAAAAAAApIHD9RAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzUEsBAh4DCgAAAAAAAAAAAGak7nu+MgEAvjIBADUAAAAAAAAAAAAAAKSBQiURAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACIAAAAAAAAAAAAAAKSBU1gSAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAACwKxYbMJAACzCQAAIgAAAAAAAAAAAAAApIHrWRIAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADnrhCZAwMAAAMDAAArAAAAAAAAAAAAAACkgd5jEgBAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAMdoTZ9EFgAARBYAACoAAAAAAAAAAAAAAKSBKmcSAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAAAIn6hoHQgAAB0IAAA1AAAAAAAAAAAAAACkgbZ9EgBAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAAAAAAAAAAACkgSaGEgBAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAs5nu6URwAAFEcAAAdAAAAAAAAAAAAAACkgcKHEgBAZW5kby9zdHJlYW0tdjEuMi4xMy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADuW/a/0QEAANEBAAAcAAAAAAAAAAAAAACkgU6kEgBqZXNzaWUuanMtdjAuMy40L3NyYy9tYWluLmpzUEsBAh4DCgAAAAAAAAAAAPZgJeSBAQAAgQEAAB8AAAAAAAAAAAAAAKSBWaYSAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL0UuanNQSwECHgMKAAAAAAAAAAAA3oc4g/UDAAD1AwAALAAAAAAAAAAAAAAApIEXqBIAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanNQSwECHgMKAAAAAAAAAAAA/nr5/fQBAAD0AQAAIgAAAAAAAAAAAAAApIFWrBIAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAADDGbF4MwkAADMJAAAkAAAAAAAAAAAAAACkgYquEgBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAaVR4XlIFAABSBQAAKQAAAAAAAAAAAAAApIH/txIAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAG2g3A5YBAACWAQAAIgAAAAAAAAAAAAAApIGYvRIAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvbWFpbi5qc1BLBQYAAAAAwQDBAH5CAABuvxIAAAA=","endoZipBase64Sha512":"f2e7aebccfa8d3bb1d93d95690cb9ff7d6b33cc5f0c312577ca14c707050a8fdde854824693e8af6fff963e6e41ac18bfbaafac3bde4e8e32309a863530796f0"};
|